我们系统大部分是部署在公司机房,原本以为在内部服务器nginx上面配置ssl,不会生效,所以一直没有配置ssl,最近实在看不下去了,决定实验一下,按说外网跟内网只是一个映射,ssl还是需要配置在内网机房服务器上面。
查看nginx版本,检查是否已安装了ssl模块
/usr/local/nginx/sbin/nginx -V
如果没有出现http_ssl_module,说明没有安装
nginx version: nginx/1.13.3
built by gcc 9.3.1 20200408 (Red Hat 9.3.1-2) (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
从上面可以看出,我的nginx版本是1.13.3,没有安装ssl模块
查看nginx解压目录
注意:就是你当初安装nginx时的源码目录,不是安装后的目录
如果你的解压目录没了,就去nginx官网下载相同版本,放到服务器解压出来
编译ssl模块
找到configure 文件所在目录,进入此目录,执行如下命令
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
接下来执行,切记不要执行make install,否则会重新安装nginx
执行过程中可能会报错,我碰到如下错误
src/http/ngx_http_script.c:1296:18: error: cast between incompatible
此时需要vim进入/home/nginx/nginx-1.13.3/objs/Makefile,把下面这行中的-Werror去掉,就不会把警告当做错误了,然后重新make
CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -g
将编译好的nginx执行文件,替换掉之前安装的nginx,注意先备份
备份:cp -rf /usr/local/nginx/sbin/nginx /home/nginx/sbin-bak/
替换:cp /home/nginx/nginx-1.13.3/objs/nginx /usr/local/nginx/sbin/
重启Nginx
/usr/local/nginx/sbin/ -s reload
配置ssl
一般在server块,配置ssl on;ssl_certificate指定pem文件路径,ssl_certificate_key指定key文件路径
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 9088 ssl;
#域名
server_name test.com;
ssl on;
#ssl证书的pem文件路径
ssl_certificate /home/nginx/ssl/test.com.pem;
#ssl证书的key文件路径
ssl_certificate_key /home/nginx/ssl/test.com.key;
location / {
proxy_pass http://ip:port;
}
}
server {
listen 80;
server_name test.com;
#将请求转成https
rewrite ^(.*)$ https://$host$1 permanent;
}
http自动跳转到https
默认的80端口跳转433端口的,见上面的配置,这里说一下非80端口,比如我的是3100端口,添加如下配置:
error_page 497 =307 https:// h o s t : host: host:server_port$request_uri;
代码 497,是 nginx 在遇到 HTTP 请求发到 HTTPS 时会产生的内部错误代码,因此我们将返回一个 307 的回复(307 Temporary Redirect是HTTP协议中的一个状态码(Status Code)。可以理解为一个临时的重定向。但该响应代码与302重定向有所区别的地方在于,收到307响应码后,客户端应保持请求方法不变向新的地址发出请求
server {
listen 3100;
server_name localhost test.com;
ssl on;
ssl_certificate /home/nginx/ssl/test.com;.pem;
ssl_certificate_key /home/nginx/ssl/test.com;.key;
root /home/test/test-webapp;
index index.html index.htm;
# 获取远程IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300;
location / {
proxy_pass http://192.168.0.100:8080/;
}
#注意这里的关键配置
error_page 497 =307 https://$host:$server_port$request_uri;
}