阿里云服务器CentOS7—Nginx下载安装并配置SSL证书,全网最全攻略!!!

CentOS7中Nginx安装与配置详解

1. Nginx简介

Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

Nginx是一款轻量级Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东新浪网易腾讯淘宝等。

2. Nginx下载

  1. pcre

  2. nginx

3. Nginx安装

3.1 安装前的准备

  1. 准备 pcre2-10.22.tar.gz,该文件为正则表达式库。让nginx支持rewrite需要安装这个库。
  2. 准备 nginx-1.12.2.tar.gz,该文件为nginx的linux版本安装文件。
  3. 确保进行了安装了linux常用必备支持库,在CentOS安装软件的时候,可能缺少一部分支持库而报错。这里首先安装系统常用的支持库。那么在安装的时候就会减少很多的错误的出现。
1
`yum install -y gcc gdb strace gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs patch e2fsprogs-devel krb5-devel libidn libidn-devel openldap-devel nss_ldap openldap-clients openldap-servers libevent-devel libevent uuid-devel uuid mysql-devel`

3.2 正则表达式库安装

1)确保进行了安装了linux常用必备支持库。检查是否安装了g++、gcc。

1
rpm -qa | grep gcc 

之后需要出现3个包。如果没有出现,需要安装g++、gcc。

1
yum install gcc-c++
  1. 上传pcre2-10.22.tar.gz, nginx-1.12.2.tar.gz 到 /usr/local/src/nginx目录下。

3)解压pcre2-10.22.tar.gz

1
2
cd /usr/local/src/nginx
tar zxvf pcre2-10.22.tar.gz

4)进入解压后的目录

1
cd pcre2-10.22 

5)配置

1
./configure
  1. 编译
1
make
  1. 安装
1
make install

3.3 Nginx安装

1
yum install nginx

3.4 配置防火墙80端口

由于我用的是阿里云服务器,开启端口有相应的图形化界面,当然也可以使用命令,这里不再赘述。

3.5 查看配置文件

1
2
    # cd /usr/local/nginx/conf
    # cat nginx.conf

3.6 启动停止重启与测试

1)启动 #方法1

1
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 

(这种方式是使用配置文件启动,在你更改了配置文件时,请用这种方式启动!) #方法2

1
2
cd /usr/local/nginx/sbin 
./nginx
  1. 停止 查询nginx主进程号 bash ps -ef | grep nginx 停止进程 bash kill -QUIT 主进程号 快速停止 bash kill -TERM 主进程号 强制停止 bash pkill -9 nginx

  2. 重启(首次启动需:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf) 一言以蔽之:如果你第一次启动nginx时候用

1
./nginx 

命令,就别用下面这种方式重启

1
/usr/local/nginx/sbin/nginx -s reload

4)测试 测试端口

1
        netstat -na | grep 80

浏览器中测试

1
        [http://ip:80](http://ip/)

4. Nginx配置详解

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
	  user nginxUser;    #定义Nginx运行的用户和用户组

	  worker_processes 8;    #nginx进程数,建议设置为等于CPU总核心数。

	  error_log ar/loginx/error.log info;    #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]

	  pid ar/runinx.pid;     #进程文件

	  worker_rlimit_nofile 65535;  #一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。


	  #工作模式与连接数上限
	  events
	  {
		  #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
		  use epoll;
		  #单个进程最大连接数(最大连接数=连接数*进程数)
		  worker_connections 65535;
	  }
  

    #设定http服务器
	  http
	  {
		  include mime.types; #文件扩展名与文件类型映射表
		  default_type application/octet-stream; #默认文件类型
		  #charset utf-8; #默认编码
		  server_names_hash_bucket_size 128; #服务器名字的hash表大小
		  client_header_buffer_size 32k; #上传文件大小限制
		  large_client_header_buffers 4 64k; #设定请求缓
		  client_max_body_size 8m; #设定请求缓
		  sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
		  autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
		  tcp_nopush on; #防止网络阻塞
		  tcp_nodelay on; #防止网络阻塞
		  keepalive_timeout 120; #长连接超时时间,单位是秒

		  #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
		  fastcgi_connect_timeout 300;
		  fastcgi_send_timeout 300;
		  fastcgi_read_timeout 300;
		  fastcgi_buffer_size 64k;
		  fastcgi_buffers 4 64k;
		  fastcgi_busy_buffers_size 128k;
		  fastcgi_temp_file_write_size 128k;

		  #gzip模块设置
		  gzip on; #开启gzip压缩输出
		  gzip_min_length 1k; #最小压缩文件大小
		  gzip_buffers 4 16k; #压缩缓冲区
		  gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
		  gzip_comp_level 2; #压缩等级
		  gzip_types text/plain application/x-javascript text/css application/xml;
		  #压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
		  gzip_vary on;
		  #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

		  upstream blog.linuxidc.com {
			  #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
			  server 192.168.80.121:80 weight=3;
			  server 192.168.80.122:80 weight=2;
			  server 192.168.80.123:80 weight=3;
		  }

		  #虚拟主机的配置(一)
		  server
		  {
			  #监听端口
			  listen 80;
			  #域名可以有多个,用空格隔开
			  server_name [www.linuxidc.com](http://www.ha97.com/) ha97.com;
			  index index.html index.htm index.php;
			  root /data/www/linuxidc;
			  location ~ .*.(php|php5)?$
			  {
				  fastcgi_pass 127.0.0.1:9000;
				  fastcgi_index index.php;
				  include fastcgi.conf;
			  }
			  #图片缓存时间设置
			  location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
			  {
				  expires 10d;
			  }
			  #JS和CSS缓存时间设置
			  location ~ .*.(js|css)?$
			  {
				  expires 1h;
			  }
			  #日志格式设定
			  log_format access '$remote_addr - $remote_user [$time_local] "$request" '
			  '$status $body_bytes_sent "$http_referer" '
			  '"$http_user_agent" $http_x_forwarded_for';
			  #定义本虚拟主机的访问日志
			  access_log ar/loginx/linuxidcaccess.log access;

			  #对 "/" 启用反向代理
			  location / {
				  proxy_pass [http://127.0.0.1:88](http://127.0.0.1:88/);
				  proxy_redirect off;
				  proxy_set_header X-Real-IP $remote_addr;
				  #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
				  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
				  #以下是一些反向代理的配置,可选。
				  proxy_set_header Host $host;
				  client_max_body_size 10m; #允许客户端请求的最大单文件字节数
				  client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
				  proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
				  proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
				  proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
				  proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
				  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
				  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
				  proxy_temp_file_write_size 64k;
				  #设定缓存文件夹大小,大于这个值,将从upstream服务器传
			  }

			  #设定查看Nginx状态的地址
			  location /NginxStatus {
				  stub_status on;
				  access_log on;
				  auth_basic "NginxStatus";
				  auth_basic_user_file confpasswd;
				  #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
			  }

			  #本地动静分离反向代理配置
			  #所有jsp的页面均交由tomcat或resin处理
			  location ~ .(jsp|jspx|do)?$ {
				  proxy_set_header Host $host;
				  proxy_set_header X-Real-IP $remote_addr;
				  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
				  proxy_pass [http://127.0.0.1:8080](http://127.0.0.1:8080/);
			  }
			  #所有静态文件由nginx直接读取不经过tomcat或resin
			  location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
			  { 
				  expires 15d; 
			  }

			  location ~ .*.(js|css)?$
			  { 
				  expires 1h; 
			  }
		  }

		  #虚拟主机的配置(二)
		  server {
			  listen 8080 ;
			  server_name 127.0.0.1 172.1218.80;
			  allow 127.0.0.1;
			  allow 172.1218.0/24;
			  deny all;
			  location /server_status {
				  stub_status on;
				  access_log  off;
			  }
		  }

	  }

5. nginx使用ssl模块配置支持HTTPS访问

默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译nginx时指定–with-http_ssl_module参数.

1
./configure  --with-http_ssl_module 

好多同学在看到这篇文章之前,已经安装完了nginx,就需要执行上面的步骤了,但是!如果看了我的攻略,这步是不需要的,因为上述安装步骤已经加载了SSL模块。 需求: 做一个网站域名为 www.telami.cn 要求通过https://www.telami.cn进行访问。

5.1 SSL证书

证书在我的第一篇博客中也提到过,是阿里云的免费证书,具体申请方式参考那篇博客# 一块钱搭建个人博客!。 目前来看,免费的证书是够用的,访问自己的博客也没出过啥问题,但是如果涉及到支付的项目,就不一定了,之前做了一个APP的后台,涉及到了APP内部调用微信支付,公司用的就是免费的SSL证书, 总是过一段时间,项目支付就报错,微信报文如下: 【异常信息】:证书文件【/usr/local/tomcat/webapps/xxx/WEB-INF/apiclient_cert.p12】有问题,请核实! 此前打过微信支付平台的客服电话,也尝试联系过技术人员,都无果。。。所以其实无法确定就是免费SSL证书的关系,但是如果有同学遇到类似的问题,可以往这方面考虑一下,顺便留个言哈,o( ̄︶ ̄)o

5.2 配置证书

阿里云的证书文件会有四个,但是需要上传到服务器的就一个,只需要上传.pem文件即可。 接下来需要配置nginx.conf文件,可以直接粘贴下面代码到文件末尾

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
server{
    listen 443;
    server_name www.zhuhongchao.cn;   //网站域名
    ssl on;                   //开启SSL
    root html;
    index index.html index.htm;
    ssl_certificate/usr/local/nginx/conf/cert/xxxxxxxxxxxx.pem;       //证书文件
    ssl_certificate_key/usr/local/nginx/conf/cert/xxxxxxxxxxxx.key;      //秘钥文件  
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1TLSv1.2;
    ssl_prefer_server_ciphers on;
    location/{
    root html;
    index index.html index.htm;
    }
}

5.3 测试

1
/usr/local/nginx/sbin/nginx -s reload  

重启nginx 访问域名

https://www.telami.cn

ok,完成 请尽情享受这一天~