问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

轻松实现Nginx的HTTP与WebSocket转发:你的网站需要这个

创作时间:
作者:
@小白创作中心

轻松实现Nginx的HTTP与WebSocket转发:你的网站需要这个

引用
CSDN
1.
https://blog.csdn.net/t610654893/article/details/136804418

对于初学者来说,配置Nginx可能有一定的难度。幸运的是,我们可以使用一个自动配置Nginx的网站来辅助我们:

https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN

该网站提供了傻瓜式的点击配置功能,配置完成后可以下载一个非常详尽的Nginx配置文件。

在Nginx中配置HTTP和WebSocket转发时,需要关注以下两点:

  • SSL:证书配置,取决于是否使用HTTP还是HTTPS,以确保数据在客户端和服务器之间传输时的安全性。
  • SERVER:server块是一个配置指令块,允许定义如何处理来自特定域名的请求。可以有多个server块,每个server块通常对应一个唯一的域名或IP地址加端口组合。

在SERVER块中配置HTTP和WebSocket:

  1. HTTP转发配置:对于HTTP请求,可以使用proxy_pass指令将请求转发到应用服务器。
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。

  1. 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协议升级所需的标头。

接下来,我们来看一个具体的配置实例:

# 匹配 /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 / # 任何没有匹配成功的,都会匹配这里处理

如果配置全部正确但仍然无法转发WebSocket,可能是由于API配置或正则匹配优先级问题。请检查API配置和正则匹配优先级。

最后,完成配置后不要忘记重启Nginx服务以使配置生效:

sudo systemctl restart nginx
# 或者
nginx -s reload

确保应用服务器能够处理WebSocket连接,并且防火墙设置允许相应的端口通信。如果WebSocket服务运行在不同的端口或使用HTTPS,还需要相应地修改Nginx配置。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号