基于Nginx+Python+WebSockets实现动态端点正弦波流服务
可以用Nginx实现这个需求
Nginx本身没法直接启动Python进程,但搭配systemd套接字激活或者简单的进程管理逻辑,就能实现客户端通过动态端点唤起对应配置的WebSocket服务实例。下面是核心实现思路和Nginx配置结构:
核心逻辑
- Nginx从请求URL里提取
channel参数(比如20_200_1) - 将请求转发到和这个channel绑定的本地套接字或端口
- 借助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套接字单元和服务单元:
- 套接字单元(比如
/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
- 服务单元(比如
/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
相关产品推荐
相关产品推荐

