有没有办法编译nginx来处理反向代理websockets请求?我正在Node.JS中构建一个实时应用程序,并且需要一个Web服务器。我读过的所有内容都说Nginx无法反转代理websockets请求,所以我对如何处理这个问题感到有些困惑。
我在考虑在Node中实现所有服务器逻辑,但这种方法存在一些问题
1)PHP - 我需要一种方法来提供PHP文件 2)静态文件 - 我真的很喜欢nginx对于静态文件非常快。虽然有一些模块,所以这个问题不是太大。 3)当我需要更新我的Node应用程序时,我希望能够与主服务器分开重启该部分。此外,如果Node应用程序由于某种原因崩溃,我不希望整个Web服务器崩溃!
答案 0 :(得分:1)
最简单的解决方案是在nginx中为多个子域设置虚拟主机,并在单独的一个上运行每个服务。这样您就不必担心将websockets请求与同一端口上的标准http请求区分开来。
此外,您可以使用PHP-FPM在nginx后面运行php,但这对于工作来说是一个相当大的挑战,因此Apache可能是更好的选择。
答案 1 :(得分:0)
我正在做类似的事情,这是对我有用的nginx服务器配置(文件:MY_DOMAIN.tk.conf:/etc/nginx/config.d /),
nodejs反向代理,用于在端口8000上运行的websockets服务器。
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream appserver {
server localhost:8000; # appserver_ip:ws_port
}
server {
server_name MY_DOMAIN.tk;
root /var/www/html;
index index.php;
location /ws {
proxy_pass http://appserver;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
client_max_body_size 128m;
# add_header Strict-Transport-Security "max-age=15768000" always;
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/MY_DOMAIN.tk/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/MY_DOMAIN.tk/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = MY_DOMAIN.tk) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name MY_DOMAIN.tk;
listen 80;
return 404; # managed by Certbot
}
通过这样做,您可以连接到wss://MY_DOMAIN.tk/ws