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

首先,初学的小伙伴可能配置有一些难度,那么我们找一个可以自动配置Nginx的站点来辅助我们。

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 指令将请求转发到你的应用服务器。

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 配置。

  • 25
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
nginx可以作为HTTP代理服务器来处理WebSocket请求。要配置nginx作为WebSocket代理,需要nginx的配置文件中添加一些配置项。以下是一个示例配置: ``` server { listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } ``` 在这个配置中,`proxy_pass`指定了后端服务器的地址,`proxy_http_version`设置了代理的HTTP版本,`proxy_set_header`设置了升级请求头,以便nginx可以正确地处理WebSocket连接。 请注意,以上配置只是一个示例,实际配置可能会根据具体的需求和后端服务器的要求而有所不同。你可以根据自己的需求进行相应的配置。 引用\[1\]中提到了一些nginx的控制命令,如`kill -s quit pid`可以用来杀死nginx主进程,`nginx -c file`可以指定配置文件来运行nginx。引用\[2\]中提到了一些nginx的启动和停止命令,如`nginx -s stop`可以快速停止nginx,`nginx -s quit`可以优雅停止nginx,`nginx -s reload`可以重新加载配置文件。引用\[3\]中提到了nginx的默认配置文件位置,一般存放在`/usr/local/nginx/conf`、`/etc/nginx`或`/usr/local/etc/nginx`。 综上所述,要配置nginx作为HTTP代理服务器处理WebSocket请求,你可以根据需要修改nginx的配置文件,并使用相应的命令来启动、停止或重新加载nginx。 #### 引用[.reference_title] - *1* *2* *3* [nginxHttp代理和Websocket代理](https://blog.csdn.net/weixin_43834401/article/details/120254499)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员大猩猩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值