如标题所示,在项目开发过程中想提高一下网络安全或一些特殊需求需要使用https,需要将服务器的nginx添加ssl链接实现https解析。
准备工作
阿里云提供一个免费的ssl证书服务,如下图
个人测试证书每隔3个月需要手动更新下证书的key和pem
申请证书
证书审核通过后状态会更新为已签分状态,点击下载选择nginx服务证书格式即可
证书具体申请流程可以看相关掘金帖子juejin.cn/search?quer…
防火墙配置
由于我购买的是阿里云ecs服务器,所以在云服务器的安全组中入口和出口规则添加443端口。
nginx配置
获取到证书文件后,阿里云官方也提供一个部署文档,(我参考这个部署nginx也出现问题缺少环境),还是按照自己的节奏,先登录服务器,进入正在使用的nginx目录,以我目前的nginx所在位置为例子,创建一个path文件夹,将下载的证书文件上传到该文件夹中。
配置nginx.config文件
进入nginx工作目录,以我当前项目为例,进入路径/usr/local/nginx/conf/nginx.conf,添加ssl的443解析端口,指定证书路径和访问的文件路径。
# HTTPS server
server {
listen 443 ssl;
server_name ailzc.cn;
# 证书路径
ssl_certificate path/ailzc.cn.pem;
ssl_certificate_key path/ailzc.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
# 加密方式,越多兼容性越差,安全性越高
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 添加其他 Nginx 配置(根据你的需要)
location / {
root /home/vuepress-doc/;
index index.html index.htm;
}
}
添加openssl模块
已经编译的nginx实现https核心添加with-http_ssl_module模块,可以通过./nginx -V
查看是否包含这个模块。
[root@VM-0-5-centos sbin]# ./nginx -V
nginx version: nginx/1.10.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments: --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/conf/nginx.conf
查询结果很明显没有with-http_ssl_module模块,需要下载安装openssl组件,在构建的时候才能使用with-http_ssl_module模块 找寻home文件夹下载openssl组件,并解压它
wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
tar -zxvf openssl-1.1.1.tar.gz
解压完成后,进入到最初下载安装nginx源文件中,我的项目之前的nginx源文件路径/home/nginx-1.18.0所以进入
该文件下执行,下面命令,重新编译启动命令在./configure中加入--with-http_ssl_module,并将with-openssl指向刚刚下载解压的/home/openssl-1.1.1文件
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-openssl=/home/openssl-1.1.1
解决缺少环境变量gcc
编译安装在执行./configure步骤报错,提示因为缺少环境变量gcc,又通过命令查询,发现变量存在,通过卸载重新安装gcc的方式解决该问题,重新执行./configure
[root@iZ2vce7h83cpide1n6l956Z nginx-1.18.0]# whereis gcc 查询gcc
gcc: /usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc /usr/share/man/man1/gcc.1.gz
[root@iZ2vce7h83cpide1n6l956Z nginx-1.18.0]# yum remove gcc -y //卸载gcc
[root@iZ2vce7h83cpide1n6l956Z nginx-1.18.0]# yum install gcc -y //安装gcc
### 编译生成nginx文件
重新执行
[root@iZ2vce7h83cpide1n6l956Z nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-openssl=/home/openssl-1.1.1
编译nginx完成后在/home/nginx-1.18.0/objs路径下看到生成的nginx,备份当前正在工作的nginx二进制文件,将新生成的nginx放在工作nginx环境中,并进行校验检查nginx文件是否正常
//备份旧的文件
[root@iZ2vce7h83cpide1n6l956Z nginx-1.18.0]# cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
//将新构建的文件放到nginx工作目录中
[root@iZ2vce7h83cpide1n6l956Z nginx-1.18.0]# cp /home/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/nginx
//检查校验下nginx文件是否正常
[root@iZ2vce7h83cpide1n6l956Z nginx-1.18.0]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
重启nginx服务
关闭nginx进程,进行重启nginx服务,如下图查询nignx进程进行杀死,再重启服务
# 获取当前nginx的主进程pid
[root@iZ2vce7h83cpide1n6l956Z sbin]# ps -ef | grep nginx
#杀死主进程
[root@iZ2vce7h83cpide1n6l956Z sbin]# kill 进程ID
启动nginx服务
[root@iZ2vce7h83cpide1n6l956Z sbin]# sudo /usr/local/nginx/sbin/nginx
访问页面
访问相关服务看页面是否正常,下图1是更新前,图2是更新之后