接到项目需求需要将一些https请求利用nginx代理到http接口上,因此要在本地上搭环境进行测试,现在将该过程记录一下。
生成证书
1. 使用openssl生成密钥privkey.pem:
openssl genrsa -out privkey.pem 1024/2038
2. 使用密钥生成证书server.pem:
openssl req -new -x509 -key privkey.pem -out server.pem -days 365
证书信息可以随便填或者留空,只有Common Name要根据你的域名填写。如xxx.com,或使用*.xxx.com匹配二级域名。
配置ngnix
由于我本地的Spring boot项目是跑在8080端口的,因此在ngnix配置上我还做了一层80到8080端口到转换。
完整ngnix配置如下。
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name a.com;
location / {
proxy_pass http://localhost:8080;
}
}
# HTTPS server
#
server {
listen 443 ssl;
server_name a.com;
#证书位置
ssl_certificate /data/server.pem; # 路径为证书生成的路径
ssl_certificate_key /data/privkey.pem; # 路径为证书生成的路径
# ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
#协议配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
# 转发到http
location / {
proxy_pass http://a.com;
}
}
include servers/*;
}
其中a.com是我在本地hosts文件上做的一个本地映射(127.0.0.1 a.com)
验证配置
重启ngnix验证配置是否成功
sudo nginx -t && sudo nginx -s reload
之前是在网上看到该命令,但实际中在我本地该命令并未生效。如果该命令不生效就先把nginx关闭后再重启。
nginx -s stop
nginx
一点小坑
配置完成之后在访问同一个https请求时总是会在奇数次(第一次,第三次……)报404,偶数次才成功。后面经过排查发现,在已经配置了80转换到8080端口时还做了对8080端口的一些配置,如下图。将该配置删除后即可。