轻松实现Nginx的HTTP与WebSocket转发:你的网站需要这个
程序员大猩猩 2024-08-05 11:07:02 阅读 74
首先,初学的小伙伴可能配置有一些难度,那么我们找一个可以自动配置Nginx的站点来辅助我们。
<code>https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN
该网站基本都是傻瓜式的点击配置,当我们配置完成后,进行下载,那么,我们会得到一个非常详尽的nginx配置文件。
注意:在 Nginx 中配置 HTTP 和 WebSocket 的转发,那么 Nginx 的配置文件,通常这个文件位于 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/ 目录下的某个文件。
之后,我们需要主要关注点在俩点:
SSL:
证书配置,取决于我们是否是使用http还是https,以确保数据在客户端和服务器之间传输时的安全性
SERVER:
server 块是一个配置指令块,它允许你定义如何处理来自特定域名的请求。可以有多个server块,每个 server 块通常对应一个唯一的域名或 IP 地址加端口组合。
基本信息了解之后,我们就需要在SERVER块,来配置我们的HTTP和websocket。
1. HTTP 转发配置: 对于 HTTP 请求,你可以使用 proxy_pass 指令将请求转发到你的应用服务器。
<code>server {
listen 80;
server_name example.com; # 你的域名
location / {
proxy_pass http://backend; # backend 是你的应用服务器的 upstream 名称
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
在上面的配置中,backend 是一个 upstream 指令定义的服务器组,你需要确保在 Nginx 配置文件中定义了这个 upstream。
2. WebSocket 转发配置: 对于 WebSocket 请求,除了使用 proxy_pass 指令外,还需要添加一些额外的配置来支持 WebSocket 通信。
server {
listen 80;
server_name example.com; # 你的域名
location /ws/ {
proxy_pass http://websocket_backend; # websocket_backend 是你的 WebSocket 服务器的 upstream 名称
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
类似于 HTTP 转发,websocket_backend 应该是一个 upstream 指令定义的服务器组。上面的配置中,proxy_http_version 1.1 指定了使用 HTTP/1.1,而 proxy_set_header Upgrade $http_upgrade 和 proxy_set_header Connection "upgrade" 是 WebSocket 协议升级所需的标头。
3.基本实例到此,那么问题来了。
“location / ” 是什么意思?“location /ws/”是什么意思?为什么我配置了之后,我的nginx无法转发websocket了呢?
举个简单的例子,如您的后端api路径配置为”/api/back/getInfo“那么location/ 可以访问到,如您的websocket api 路径是使用了gateway统一调配的,路径为 ”/api/ws/back/getInfo“ 那么能访问到吗?答案是不可以的。
location是需要我们指定转发的api路径来配置,所以我们要特定的去指定api来完成转发。
如下是我自己的简单测试环境配置,我没有配置SSL HTTPS哦。附带注解来观察api的配置来匹配转发路径。也完成了一个nginx配置多个微服务api的指定转发。
#匹配 /api/exchange/***
location ~/exchange/ {
proxy_pass http://ip地址:5252;
}
#匹配 /api/manager/***
location ~/manager/ {
proxy_pass http://ip地址:5253;
}
# 匹配 swagger
location ~/doc.html {
proxy_pass http://ip地址;
}
# 匹配 swagger
location ~/*.css {
proxy_pass http://ip地址;
}
# 匹配 swagger
location ~/*.js {
proxy_pass http://ip地址;
}
# 匹配 swagger
location ~/swagger-resources {
proxy_pass http://ip地址;
}
# 匹配 /ws/***
location ^~ /ws {
# 后台准备的websocket地址端口
proxy_pass http://ip地址:5353;
# 其他参数都一样
proxy_read_timeout 300s;
proxy_send_timeout 300s;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
我们了解下nginx内正则的规则和序号。(序号越小优先级越高)
1. location = # 精准匹配
2. location ^~ # 带参前缀匹配
3. location ~ # 正则匹配(区分大小写)
4. location ~* # 正则匹配(不区分大小写)
5. location /a # 普通前缀匹配,优先级低于带参数前缀匹配。
6. location / # 任何没有匹配成功的,都会匹配这里处理
总而言之,配置转发不生效的问题,假如配置全部正确,就是不转发的情况下,请查看您的api配置,以及正则的匹配优先级。
最后,完成配置后,不要忘记重启 Nginx 服务以使配置生效:
sudo systemctl restart nginx
#或者
nginx -s reload
确保你的应用服务器能够处理 WebSocket 连接,并且防火墙设置允许相应的端口通信。
此外,如果你的 WebSocket 服务运行在不同的端口或使用 HTTPS,还需要相应地修改 Nginx 配置。
上一篇: 解决wsl 无法升级 wsl2 以及windows 下的Docker 打开报错
下一篇: 【Linux】如何查看和获取环境变量四种方法($PATH、env表、environ、getenv)
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。