Apache Nginx反向代理websockets
有没有办法编译nginx来处理反向代理websockets请求?我正在Node.JS中构建一个实时应用程序,需要一个web服务器。我读到的所有东西都说Nginx无法反转代理websockets请求,所以我对应该如何处理这个问题有点困惑 我曾考虑在节点中实现所有服务器逻辑,但这种方法存在一些问题 1) PHP-我需要一种方法来提供PHP文件 2) 静态文件-我真的很喜欢nginx对于静态文件非常快。不过,有一些模块可以实现这一点,所以这个问题并不太大。Apache Nginx反向代理websockets,apache,node.js,nginx,fastcgi,Apache,Node.js,Nginx,Fastcgi,有没有办法编译nginx来处理反向代理websockets请求?我正在Node.JS中构建一个实时应用程序,需要一个web服务器。我读到的所有东西都说Nginx无法反转代理websockets请求,所以我对应该如何处理这个问题有点困惑 我曾考虑在节点中实现所有服务器逻辑,但这种方法存在一些问题 1) PHP-我需要一种方法来提供PHP文件 2) 静态文件-我真的很喜欢nginx对于静态文件非常快。不过,有一些模块可以实现这一点,所以这个问题并不太大。 3) 当我需要更新我的节点应用程序时,我希望
3) 当我需要更新我的节点应用程序时,我希望能够独立于主服务器重新启动该部分。另外,如果节点应用程序由于某种原因崩溃,我不希望整个web服务器都崩溃 最简单的解决方案是在nginx中为多个子域设置虚拟主机,并在单独的子域上运行每个服务。这样,您就不必担心在同一端口上区分websockets请求和标准http请求
此外,您可以使用php-FPM在nginx后面运行php,但这是一个相当大的挑战,因此Apache可能是一个更好的选择。最简单的解决方案是在nginx中为多个子域设置虚拟主机,并在单独的子域上运行每个服务。这样,您就不必担心在同一端口上区分websockets请求和标准http请求
此外,您可以使用php-FPM在nginx后面运行php,但这是一个相当大的挑战,因此Apache可能是一个更好的选择。我正在做类似的事情,下面是适用于我的nginx服务器配置(文件:MY_DOMAIN.tk.conf on:/etc/nginx/config.d/):
- 让我们为ssl加密tls证书
- php7.2反向代理
- 端口8000上运行的websockets服务器的nodejs反向代理
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我也在做类似的事情,下面是适用于我的nginx服务器配置(文件:MY_DOMAIN.tk.conf on:/etc/nginx/config.d/),包括:
- 让我们为ssl加密tls证书
- php7.2反向代理
- 端口8000上运行的websockets服务器的nodejs反向代理
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只需使用node.js负载平衡器,并在其后面安装node&nginx服务器。只需使用node.js负载平衡器,并在其后面安装node&nginx服务器即可。