轻松实现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 配置。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。