You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Nginx+Python+WebSockets实现动态端点正弦波流服务

可以用Nginx实现这个需求

Nginx本身没法直接启动Python进程,但搭配systemd套接字激活或者简单的进程管理逻辑,就能实现客户端通过动态端点唤起对应配置的WebSocket服务实例。下面是核心实现思路和Nginx配置结构:

核心逻辑

  1. Nginx从请求URL里提取channel参数(比如20_200_1)
  2. 将请求转发到和这个channel绑定的本地套接字或端口
  3. 借助systemd的套接字激活功能,当有请求转发到对应套接字时,自动启动带指定--channel参数的stream_sin_wave.py实例

Nginx配置示例

http {
    # 从URL路径里提取channel参数
    map $request_uri $channel {
        ~^/(?<channel>[^/]+)$ $channel;
        default "";
    }

    # 把channel映射到对应的unix套接字路径,也可以用变量动态生成路径
    map $channel $websocket_socket {
        20_200_1 unix:/run/stream_sin_wave_20_200_1.sock;
        # 按需添加更多channel与套接字的映射,比如:
        # 30_300_2 unix:/run/stream_sin_wave_30_300_2.sock;
        default "";
    }

    server {
        listen 8765;
        server_name 127.0.0.1;

        # 匹配动态channel端点
        location ~ ^/[^/]+$ {
            # 只处理WebSocket请求
            if ($http_upgrade != "websocket") {
                return 400;
            }

            # WebSocket转发配置
            proxy_pass http://unix:$websocket_socket;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }
    }
}

配合systemd套接字激活的配置

每个channel需要对应一个systemd套接字单元和服务单元:

  1. 套接字单元(比如/etc/systemd/system/stream_sin_wave_20_200_1.socket):
[Unit]
Description=WebSocket Socket for stream_sin_wave 20_200_1

[Socket]
ListenStream=/run/stream_sin_wave_20_200_1.sock
SocketMode=0666

[Install]
WantedBy=sockets.target
  1. 服务单元(比如/etc/systemd/system/stream_sin_wave_20_200_1.service):
[Unit]
Description=WebSocket Service for stream_sin_wave 20_200_1
Requires=stream_sin_wave_20_200_1.socket

[Service]
# 替换成你的Python路径和脚本路径
ExecStart=/usr/bin/python3 /path/to/stream_sin_wave.py --channel 20_200_1 --socket /run/stream_sin_wave_20_200_1.sock
User=your_username
Restart=on-failure

[Install]
WantedBy=multi-user.target

配置完成后,启用并启动套接字单元:

systemctl daemon-reload
systemctl enable --now stream_sin_wave_20_200_1.socket

简化测试方案(不用systemd)

如果不想折腾systemd,可以写个简单的看门狗脚本:

  • Nginx配置里把不同channel映射到不同端口(比如20_200_1对应端口8766)
  • 看门狗脚本定期检查指定端口是否被监听,没监听就启动stream_sin_wave.py --channel 20_200_1 --port 8766

内容的提问来源于stack exchange,提问作者tsmotter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:15:12