nginx实现https访问
背景:
项目背景是在开发APP发布平台,ios的安装包的下载和自动更新等操作需要https获取plist文件,所以需要通过配置nginx的SSL模块来支持HTTPS访问,也就是说,要做一个网站域名为 域名.com 要求通过HTTPS://域名.com进行访问.
SSL英文名为Secure Socket Layer,安全套接字层。SSL是一种数字证书,它使用ssl协议在浏览器和web server之间建立一条安全通道,数据信息在client与server之间的安全传输.
一,环境准备
1.安装nginx,2.获取安全证书
1.安装nginx(已安装可以跳过)
第一步:下载nginx压缩包
nginx官方下载地址:http://nginx.org/en/download.html
wget命令下载:
wget -c https://nginx.org/download/nginx-1.16.1.tar.gz
注意:这一步最好在自己的目标目录进行操作,我一般是把压缩包下载到/usr/local目录下。
第二步:配置nginx安装所需的环境
1. 安装gcc
安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境。安装指令如下:
yum install gcc-c++
2. 安装PCRE pcre-devel
Nginx的Rewrite模块和HTTP核心模块会使用到PCRE正则表达式语法。这里需要安装两个安装包pcre和pcre-devel。第一个安装包提供编译版本的库,而第二个提供开发阶段的头文件和编译项目的源代码。安装指令如下:
yum install -y pcre pcre-devel
3.安装zlib
zlib库提供了开发人员的压缩算法,在Nginx的各种模块中需要使用gzip压缩。安装指令如下:
yum install -y zlib zlib-devel
4.安装Open SSL
nginx不仅支持 http协议,还支持 https(即在 ssl 协议上传输 http),如果使用了 https,需要安装 OpenSSL 库。安装指令如下:
yum install -y openssl openssl-devel
第三步:解压nginx压缩包并安装
将压缩包进行解压
tar -zxvf nginx-1.16.1.tar.gz
解压之后,进入加压文件,即cd nginx-1.16.1。
然后进行配置,推荐使用默认配置,直接./configure就好了,如下图所示:
第四步:编译安装nginx
这里和redis的编译安装比较类似,首先在当前目录(/usr/local/nginx-1.16.1)进行编译。输入make即可
make
然后回车,如果编译出错,请检查是否前面的4个安装都没有问题。
编译成功之后,就可以安装了,输入以下指令:
make install
ok,安装成功。
这时候返回上一级目录,就会发现多了nginx目录,接下来,启动nginx。
第五步:启动nginx
进入/usr/local/nginx/sbin目录,输入./nginx即可启动nginx
./nginx
关闭nginx
./nginx -s quit 或者 ./nginx -s stop
重启nginx
./nginx -s reload
查看nginx进程
ps aux|grep nginx
设置nginx开机启动,只需在rc.local增加启动代码即可。
vim /etc/rc.local
然后在底部增加/usr/local/nginx/sbin/nginx
nginx配置文件
/usr/local/nginx/conf目录可修改nginx的配置文件 -> vim nginx.conf
修改域名以及端口等
2.ssl证书:
1. 配置SSL模块首先需要CA证书,CA证书可以自己手动颁发也可以在阿里云申请,本人在腾讯云上申请的证书。
2. 默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译nginx时指定–with-http_ssl_module参数.
获取证书:
在成功购买域名并通过备案后
1.进入控制台
2.下载证书
下载下来的文件:
nginx文件下:
二、实现nginx+https
1.安装ssl模块
正常安装nginx一般ssl模块并未被安装
默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译nginx时指定–with-http_ssl_module参数
解决方案:
nginx缺少http_ssl_module模块,编译安装的时候带上--with-http_ssl_module配置就行了,但是现在的情况是我的nginx已经安装过了,怎么添加模块,其实也很简单,往下看: 做个说明:我的nginx的安装目录是/usr/local/nginx这个目录,我的源码包在/usr/local/nginx-1.16.1目录
(1)切换到源码包:
cd /usr/local/nginx-1.16.1
(2)配置信息:
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
(3)配置完成后,运行make进行编译,千万不要进行make install,否则就是覆盖安装。
make
(4)然后备份原有已经安装好的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
(5)停止Nginx,正常命令直接 nginx -s stop就可以
nginx -s stop
如果关不掉,就直接Kill掉进程。ps aux | grep 进程名 查看进程占用的PID号。
(6)将刚刚编译好的nginx覆盖掉原有的nginx
cp /usr/local/nginx-1.16.1/objs/nginx /usr/local/nginx/sbin
(7)启动nginx
在路径:/usr/local/nginx/sbin下
./nginx
(8)通过下面的命令查看是否已经加入成功。
nginx -V
2.在Nginx配置文件中安装证书
文件说明:
1. 证书文件“证书名称.crt‘’,包含两段内容,请不要删除任何一段内容。
2. 如果是证书系统创建的CSR,还包含:证书私钥文件“证书名称.key”。
( 1 ) 在Nginx的配置文件所在的目录下创建cert文件夹,并且将下载的全部文件拷贝到cert目录中。如果申请证书时是自己创建的CSR文件,请将对应的私钥文件放到cert目录下并且命名为“证书名称.key”;
( 2 ) 打开 Nginx 安装目录下 conf 目录中的 nginx.conf 文件,找到:
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
( 3 ) 将其修改为 (以下属性中ssl开头的属性与证书配置有直接关系,其它属性请结合自己的实际情况复制或调整) :
server {
listen 8095 ssl;
server_name localhost;
ssl_certificate cert/1_luckilye.cn_bundle.crt;
ssl_certificate_key cert/2_luckilye.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
location /file/ipaPlist/{
proxy_redirect off;
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://47.92.27.**:8086/file/ipaPlist/;
}
}
( 4 )重启 Nginx。
nginx -s reload
( 5 ) 通过 https 方式访问您的站点,测试站点证书的安装配置。 在浏览器中输入https://域名,如下图所示,则说明配置成功。
在配置时有可能碰到的错误:
nginx 报错 : [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
解决:
1. 如果配置了SSL ON请删掉
2.
listen 443;
修改为
listen 443 ssl;