Nginx 相关知识

1,096 阅读6分钟
修改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;
}