修改Nginx配置文件使HTTPS协议支持STL1、STL1.1、STL1.2、SSLv3
推荐使用国内大佬开源的一款Nginx可视化管理工具NginxWebUI,可以快速完成配置
an upstream response is buffered to a temporary file
recv() failed (104: Connection reset by peer)问题解决
Nginx开启OCSP以解决Let's Encrypt证书被DNS污染访问缓慢参考文章
Nginx安装第三方模块
参考:nginx代理转发基于NTLM认证的AD域用户Windows认证登录
ntml模块(反向代理windows身份验证需要使用该模块)
(自己编译会遇到一些依赖缺少得问题,目前笔者还不太熟悉,只能使用上面博主提供好的)
GitHub地址:
gabihodoroaga/nginx-ntlm-module: A nginx module to allow proxying requests with NTLM Authentication. (github.com)
nginx部署vue刷新、访问路由页面404
当使用nginx 部署vue项目的时候 当我们刷新页面的时候,或者访问路由配置页面的时候会直接404,这是因为通常我们做的vue项目属于单页面开发。所以只有index.html。解决这个bug也很简单。只需要将访问重定向到index.html这个页面。交由 index.html 去处理对应的路由跳转就好。
修改nginx配置
server {
listen 80; # 监听的端口
server_name xx.xx.xxx.xx; # 处理的host地址 (请替换成你对应的项目访问 ip 或 域名)!!!
root /usr/share/nginx/html; # vue项目存在的目录(替换成你对应的地址,如果你这是用docker部署的请改成你容器内的地址)
location / {
try_files $uri $uri/ @router;#需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
index index.html index.htm;
}
#对应上面的@router,主要原因是路由的路径资源并不是一个真实的路径,所以无法找到具体的文件
#因此需要rewrite到index.html中,然后交给路由在处理请求资源
location @router {
rewrite ^.*$ /index.html last;
}
}
Nginx SSL问题
nginx转发https:SSL_do_handshake() failed (SSL: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:SSL alert number
修改前
location /api/ {
proxy_pass https://xxx.com/;
}
修改后配置
location /api/ {
proxy_pass https://xxx.com/;
proxy_ssl_server_name on;
proxy_ssl_session_reuse off;
}
proxy_ssl_server_name 指定的是用于 SSL 证书验证的域名。它会告诉 nginx 在验证 SSL 证书时使用哪个域名。通常情况下,proxy_ssl_server_name 的值应该和后端服务器的主机名相同。在使用反向代理时,常用的做法是在 nginx 服务器的配置文件中指定 proxy_ssl_server_name 的值。例如:
http {
upstream backend {
server backend.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_ssl_server_name backend.example.com;
}
}
}
在此例中,proxy_ssl_server_name 指定的值为 backend.example.com,这意味着 nginx 在与backend.example.com服务器建立 SSL 连接时,将验证 SSL 证书的公共名称是否包含此域名。如果不匹配,则会抛出 SSL 错误,连接失败。
稍微注意下:如果您使用的是通配符 SSL 证书,proxy_ssl_server_name 可以使用泛域名来匹配多个子域名,例如 *.example.com。不过请注意,不是所有类型的证书都支持使用通配符的名称进行验证。
总之,对于 proxy_ssl_server_name 的值设置,需要与后端服务器的 SSL 证书主机名进行一一对应验证,以确保代理请求的安全性和正确性。
反向代理转发问题:
1、因为不是独立配置反向代理,所以Nginx Config 文件中,已经有类似 rewrite、.js .css 等、PHP解析器等等的路由规则在,所以你增加的二级反向代理,非常有可能因为优先级不够,没有生效。所以建议学习一下正则匹配的优先级;
2、由于 proxy_pass 的一个小细节导致路径不正确,测试时始终不能达到预期的效果,总是出现404的情况,因为在独立配置时,倒不会出现这样的情况。关键点在于 URL 的结尾要不要以 “/” 结尾,所以建议学习一下结尾要不要使用斜杠的差别。
Nginx中proxy_pass末尾带斜杠/和不带的区别
原文链接:blog.csdn.net/lihefei_cod…
总结:
如果proxy_pass末尾有斜杠/,proxy_pass不拼接location的路径
如果proxy_pass末尾无斜杠/,proxy_pass会拼接location的路径
一、proxy_pass末尾有斜杠
location /api/ {
proxy_pass http://127.0.0.1:8000/;
}
请求地址:http://localhost/api/test
转发地址:http://127.0.0.1:8000/test
二、proxy_pass末尾无斜杠
location /api/ {
proxy_pass http://127.0.0.1:8000;
}
请求地址:http://localhost/api/test
转发地址:http://127.0.0.1:8000/api/test
三、proxy_pass包含路径,且末尾有斜杠
location /api/ {
proxy_pass http://127.0.0.1:8000/user/;
}
请求地址:http://localhost/api/test
转发地址:http://127.0.0.1:8000/user/test
四、proxy_pass包含路径,末尾无斜杠
location /api/ {
proxy_pass http://127.0.0.1:8000/user;
}
请求地址:http://localhost/api/test
转发地址:http://127.0.0.1:8000/usertest
如下是一个正确的配置:
location ^\~ /proxyname/ {
proxy\_pass <https://www.xxxxxxx.com/>;
}
以上有两处不同的地方: 1、“ ^~ ” 开头这个意思是强制匹配,原因是这样优先级高,不要被其他匹配规则覆盖,对应上面的第一条问题; 2、“/” 结尾在URL处,表示反向代理时不是 “www.xxxxxxx.com/proxyname/” ,而是 “www.xxxxxxx.com/” ,否则容易出现404的情况,对应上面第二条问题;
实践例子
/home/nginx/conf/conf.d/中新增文件test.conf
server {
listen 82;
listen [::]:82;
server_name your_server_name;
location ^~ / {
root /usr/share/nginx/html/dist;
index index.html index.htm;
}
location ^~ /main/quark_list/ {
proxy_pass http://your_server_ip:9999/;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
后续将nginx 改为 nginx proxy manager
# 一定要443端口映射不然默认https://域名 无法被监听到,应为https默认端口为443
# /home/nginx-proxy-manager/data:/data 目录为nginx 配置文件相关路径
# /usr/share/nginx/npm/html:/usr/share/nginx/html 为静态文件相关映射路径
docker run \
-p 8887:80 \
-p 443:443 \
-p 81:81 \
--name nginx-proxy-manager \
-v /home/nginx-proxy-manager/data:/data \
-v /nginx-proxy-manager/letsencrypt:/etc/letsencrypt \
-v /usr/share/nginx/npm/html:/usr/share/nginx/html \
--privileged=true \
-d jc21/nginx-proxy-manager:2.9.22
启动后默认账户为 admin@ example.com
密码为 changeme
登录后进入Proxy Hosts添加相关代理网站,配置ssl策略和证书等,可参考其他博主教程
关键点于 Advanced 设置,直接将下面内容复制进Advanced即可
proxy_pass 是 Nginx 的一个指令,用于设置反向代理服务器。它的作用是将客户端请求转发到另一个服务器上,将响应结果返回给客户端。当客户端发出某个请求时,Nginx 会按照配置文件中的 proxy_pass 指令所定义的地址,将请求发送到目标服务器上。通常,我们使用 proxy_pass 指令来实现负载均衡、反向代理、动态缓存等功能。
这段作用为匹配根路径转时访问容器内/usr/share/nginx/html/dist文件夹下面的index.html
对应容器外的路径是/usr/share/nginx/npm/html,root 不可用容器外路径,应该用容器内路径
下面一块作用为请求转发,将路径https://xxx.xxxx.cn/main/quark_list/转发到https://xxx.xxxx.cn/
location / {
root /usr/share/nginx/html/dist;
index index.html index.htm;
}
location ^~ /main/quark_list/ {
proxy_pass https://xxx.xxxx.cn/;
proxy_ssl_server_name on;
proxy_ssl_session_reuse off;
}