nginx (三) 配置 https 请求
使用 nginx
配置 https
时,处理过程可以分为两步
- 使用
nginx
配置的证书,与客户端做https
交互 - 请求经过
nginx
后,https
协议转换成http
协议,与服务做http
交互
https 原理,参考下面的文章https://juejin.cn/post/7054482275211149349
生成自签证书
此处我们借助于 openssl
生成自己的 自签证书
1. 使用 openssl 生成私钥
openssl genrsa -out server.key 1024
完整的签名过程,同时需要公钥和私钥的。即用第 1 步生成私钥继续生成公钥。但自签证书不需要真正的对证书合法性进行验证。因此,只需要私钥即可。
2. 根据生成的私钥生成申请证书
openssl req -new -key server.key -out server.csr
根据私钥生成证书文件;(证书的核心就是公钥)
3. 使用私钥对申请证书进行签名,生成证书(有效期 10 年)
openssl x509 -req -in server.csr -out server.crt -signkey server.key -days 3650
注意:
- 私钥一般是
.key
或者.private
结尾 - 证书一般是
.crt
结尾 (certificate)
4. 接下来,查看刚生成证书内容,直接在 SSL在线解析网站查看 例如 ssl在线工具
配置 nginx 解析 https 请求
- 禁止请求访问
80
端口。将所有的访问80
端口的请求,转发到443
- 配置
https
证书 - 将
https
解析后的http
请求转发到对应的服务
配置文件如下
server {
listen 80;
server_name vm.ser.cn;
rewrite ^(.*) https://$host$request_uri?;
}
server {
listen 443 ssl;
server_name vm.ser.cn;
ssl_certificate /home/peng/nginx/openssl-key/server.crt; # 证书的位置
ssl_certificate_key /home/peng/nginx/openssl-key/server.key; # 私钥的位置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on; # 是否有服务器来决定用哪种加密算法
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:90;
}
}
server {
listen 90;
location ~ /gin/(.*) {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:5003/$1$is_args$args;
}
}
字符替换
Accept-Encoding
设为空值,以禁用压缩,是因为 sub_filter
只能处理未经压缩的内容;又 sub_filter
一般只替换 text/html
且仅工作一次,不符合需求,故对配置稍做微调。
location / {
...
proxy_set_header Accept-Encoding '';
sub_filter_types *;
sub_filter_once off;
sub_filter '查找内容:源站域名' '替换为:反代站域名';
...
}
注意: nginx
默认是不安装 ngx_http_sub_module
模块的,直接应用 sub_filter
指令将报错:
# 编译
./configure --prefix=/data/nginx --with-http_sub_module
# 安装
make install