由 lxc 容器内的 PM2 管理的 NodeJS 服务器的 502 Bad Gateway
502 Bad Gateway for NodeJS server managed by PM2 inside a lxc container
我有一个 digital ocean droplet 运行 Ubuntu 18.04,里面是一个 lxc 容器。我在那个容器中有两个应用程序。
第一个应用程序(客户端)位于 /var/www/html
,第二个是位于 /var/www/my-site/
的 NodeJS 应用程序。容器内的 Node 应用程序由 pm2 管理,到目前为止一切似乎都运行良好,因为当我在容器终端输入 curl http://localhost:3000
时,我得到了所需的输出。
在 /etc/nginx/sites-available
下的主 Droplet(不是容器)内,我有以下两个服务器块 - default
和 my-site
。
当我尝试通过我的域通过浏览器访问它时,第一个应用程序工作正常,但是当我尝试通过 sub.mydomain.com
访问它时,NodeJS 应用程序 returns 是 502 Bad Gateway
。容器里面的pm2 start
告诉我节点申请状态是online
。
这是我的 default
服务器块文件。这行得通。当我访问 mydomain.com 时,我的网站显示正常。
# HTTP — redirect all traffic to HTTPS
server {
listen 80;
listen [::]:80 default_server ipv6only=on;
return 301 https://$host$request_uri;
}
server {
# Enable HTTP/2
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name mydomain.com;
# Use the Let’s Encrypt certificates
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
# Include the SSL configuration from cipherli.st
include snippets/ssl-params.conf;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://container_ip_address /;
}
}
现在这是另一个服务器块 - my-site
。
# Upstream config
upstream site_upstream {
server 127.0.0.1:3000;
keepalive 64;
}
server {
# Enable HTTP/2
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name sub.mydomain.com www.sub.mydomain.com;
root /var/www/my-site;
# Use the Let’s Encrypt certificates
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
# Include the SSL configuration from cipherli.st
include snippets/ssl-params.conf;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://site_upstream;
proxy_ssl_session_reuse off;
proxy_set_header Host $http_host;
proxy_cache_bypass $http_upgrade;
proxy_redirect off;
}
}
我已经在我的域的 DNS 设置中为我的子域设置了 A 记录到我的 Droplet 的 IP 地址,我还为 my-site
创建了一个符号 link 到 /etc/nginx/sites-enabled
服务器块。
我在互联网上搜索过这个问题的解决方案,但似乎没有任何效果。我错过了什么?
非常感谢您的帮助。谢谢。
这里的问题是对子域的请求没有被定向到 lxc 容器。
我通过在 my-site
服务器块中添加以下内容解决了这个问题。
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://container_ip/;
}
之后,我在下一个位置块中添加了一个星号。
location /* {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://site_upstream;
proxy_ssl_session_reuse off;
proxy_set_header Host $http_host;
proxy_cache_bypass $http_upgrade;
proxy_redirect off;
}
解决此问题的另一种方法是在默认服务器块的 server_name
指令中包含子域。这行得通,但唯一的问题是当你 运行 nginx -t
时,nginx 会抱怨它不得不忽略我在 my-site
服务器块中设置的服务器,否则,它工作得很好.
我有一个 digital ocean droplet 运行 Ubuntu 18.04,里面是一个 lxc 容器。我在那个容器中有两个应用程序。
第一个应用程序(客户端)位于 /var/www/html
,第二个是位于 /var/www/my-site/
的 NodeJS 应用程序。容器内的 Node 应用程序由 pm2 管理,到目前为止一切似乎都运行良好,因为当我在容器终端输入 curl http://localhost:3000
时,我得到了所需的输出。
在 /etc/nginx/sites-available
下的主 Droplet(不是容器)内,我有以下两个服务器块 - default
和 my-site
。
当我尝试通过我的域通过浏览器访问它时,第一个应用程序工作正常,但是当我尝试通过 sub.mydomain.com
访问它时,NodeJS 应用程序 returns 是 502 Bad Gateway
。容器里面的pm2 start
告诉我节点申请状态是online
。
这是我的 default
服务器块文件。这行得通。当我访问 mydomain.com 时,我的网站显示正常。
# HTTP — redirect all traffic to HTTPS
server {
listen 80;
listen [::]:80 default_server ipv6only=on;
return 301 https://$host$request_uri;
}
server {
# Enable HTTP/2
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name mydomain.com;
# Use the Let’s Encrypt certificates
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
# Include the SSL configuration from cipherli.st
include snippets/ssl-params.conf;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://container_ip_address /;
}
}
现在这是另一个服务器块 - my-site
。
# Upstream config
upstream site_upstream {
server 127.0.0.1:3000;
keepalive 64;
}
server {
# Enable HTTP/2
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name sub.mydomain.com www.sub.mydomain.com;
root /var/www/my-site;
# Use the Let’s Encrypt certificates
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
# Include the SSL configuration from cipherli.st
include snippets/ssl-params.conf;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://site_upstream;
proxy_ssl_session_reuse off;
proxy_set_header Host $http_host;
proxy_cache_bypass $http_upgrade;
proxy_redirect off;
}
}
我已经在我的域的 DNS 设置中为我的子域设置了 A 记录到我的 Droplet 的 IP 地址,我还为 my-site
创建了一个符号 link 到 /etc/nginx/sites-enabled
服务器块。
我在互联网上搜索过这个问题的解决方案,但似乎没有任何效果。我错过了什么?
非常感谢您的帮助。谢谢。
这里的问题是对子域的请求没有被定向到 lxc 容器。
我通过在 my-site
服务器块中添加以下内容解决了这个问题。
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://container_ip/;
}
之后,我在下一个位置块中添加了一个星号。
location /* {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://site_upstream;
proxy_ssl_session_reuse off;
proxy_set_header Host $http_host;
proxy_cache_bypass $http_upgrade;
proxy_redirect off;
}
解决此问题的另一种方法是在默认服务器块的 server_name
指令中包含子域。这行得通,但唯一的问题是当你 运行 nginx -t
时,nginx 会抱怨它不得不忽略我在 my-site
服务器块中设置的服务器,否则,它工作得很好.