在如今越来越强调隐私与数据安全的情况下,我们的资源访问当然也要尽可能的安全,我们知道 HTTP 协议是明文传输的,因此不能保证数据的安全性,而 HTTPS 则是对传输的数据进行了加密,提高数据传输的安全性。下面就介绍一下为 Nginx 配置 Https 模块的方式。
一、系统环境
CentOS 6.9
Nginx 1.13.0
二、已经安装过 Nginx
2.1 使用场景
某服务器上已经安装过 Nginx,在 nginx.conf 中配置了 SSL (HTTPS) 后重启 nginx 出现以下错误信息:
nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:37
2.2 原因
由于 nginx 缺少了 http_ssl_module 模块。
我们可以使用如下命令查看安装 nginx 时的配置参数,如:
[root@NC01077718 ~]# nginx -V
nginx version: nginx/1.13.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx
可以看到配置参数只有 --prefix=/usr/local/nginx,没有 http_ssl_module。
2.3 解决方法
重新编译安装 nginx,并在编译时加入 http_ssl_module 模块。在进行重新编译时,要清楚几个信息,如下示例:
nginx 的安装目录: /usr/local/nginx
nginx 的源码目录:/data/software/nginx/nginx-1.13.0/
(1) 重新配置
进入源码目录,执行如下命令重新配置:
[root@hadoop1 nginx-1.13.0]# cd /data/software/nginx/nginx-1.13.0
[root@hadoop1 nginx-1.13.0]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
等待编译完成,如果没有出现 Error 信息,表示编译成功
注:
由于是已经安装过 nginx 的环境了。因此,理论上 nginx 所依赖的系统库(如 PCRE 等库)也已经具备了。
(2) 重新编译
运行如下命令进行编译
[root@hadoop1 nginx-1.13.0]# pwd
/data/software/nginx/nginx-1.13.0
[root@hadoop1 nginx-1.13.0]# make
- 这里不要进行 make install,否则就是覆盖安装
(3) 备份已安装好的 nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
(4) 停止 nginx (如果在运行状态)
nginx -s stop
(5) 覆盖原有的 nginx
将刚刚编译好的 nginx 覆盖掉原有的 nginx
cp ./objs/nginx /usr/local/nginx/sbin/
(6) 查看覆盖后的 nginx 的配置信息
[root@hadoop1 objs]# nginx -V
nginx version: nginx/1.13.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
可以看到,配置参数中已经带有了 http_ssl_module 模块,说明重新编译并替换成功
三、全新安装
如果是未安装 Nginx 的服务器,则使用如下方式全新安装,安装文档中已经加入了 nginx https 模块。
附录一:配置 nginx https
Nginx https 配置示例:
server{
listen 80;
server_name api.jiangzhuolin.com;
# force redirect http to https
rewrite ^ https://$http_host$request_uri?permanent;
}
server {
listen 443 ssl;
# ssl on;
server_name api.jiangzhuolin.com;
index index.html index.htm index.jsp index.php;
if ( $query_string ~* ".*[\;'\<\>].*" ){
return 404;
}
location / {
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://localhost:9090;
}
ssl_certificate /usr/local/nginx/ssl/jiangzhuolin.com.cer;
ssl_certificate_key /usr/local/nginx/ssl/cert.key;
fastcgi_param HTTPS on;
fastcgi_param HTTP_SCHEME https;
access_log /usr/local/nginx/logs/api.jiangzhuolin.com.access.log;
error_log /usr/local/nginx/logs/api.jiangzhuolin.com.error.log;
}
注:
- 把 ssl on; 这行去掉,ssl 写在 443 端口后面。这样 http 和 https 的链接都可以用。然后上方的第一个 server 对 http 链接进行了强制重定向到 https。这样就可以实现用户输入 http 的时候不会访问不到服务并且也能够跳转到 https 协议。
-
ssl_certificate
配置的就是我们的 https 的证书,也就是我们的公钥。当我们开启 https 协议后,客户端与服务器端的通信将会使用该证书(公钥)来进行数据的加密。 -
ssl_certificate_key
配置的就是我们的 https 的密钥(私钥),该文件的作用就是将加密的数据进行解密。 - 证书的获取有多种途径,可以自行网卡搜索。目前既可以从多个 CA 发行商处申请免费的 SSL 证书,也可以购买付费的商用 SSL 证书,具体选择视情况而定。甚至也可以自己生成自签名的 SSL 证书,但此类证书不会被浏览器信任,所以可能还需要手动安装证书。