如何监听 Nginx 上的不同端口并代理请求?
How to listen to different port on Nginx and proxy the request?
我是 Nginx 配置的新手,我有一个快速应用程序进程,运行 在端口 3000 上使用 pm2,我也允许使用 ufw 端口 3000,并且做了一个Nginx 上的服务器实例来代理它,
server {
# SSL configuration
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name .mysite.co;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/django/mysite;
}
proxy_cache mysite;
location / {
include proxy_params;
proxy_pass http://unix:/home/django/mysite/mysite.sock;
}
gzip_comp_level 3;
gzip_types text/plain text/css image/*;
ssl_certificate /etc/letsencrypt/live/mysite.co/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mysite.co/privkey.pem; # managed by Certbot
}
server {
if ($host = www.mysite.co) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = mysite.co) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 default_server;
listen [::]:80 default_server;
server_name .mysite.co;
return 404; # managed by Certbot
}
server{
listen 3000;
listen 443 ssl http2;
server_name .mysite.co:3000;
location / {
proxy_pass https://localhost:3000;
}
}
我 运行 netstat -napl | grep 3000
我可以确认该过程是 运行 并且 pm2 status
也说它 运行 并且日志中也没有错误.
我怎么能让这个工作?提前感谢您的帮助。
您将无法使用 nginx 来侦听端口 3000 以及您的节点进程,因为一次只有一个服务可以真正侦听该端口。因此,您需要确保 nginx 正在侦听不同端口上的连接。我想您正在尝试做的是监听端口 80 / 443,然后将请求发送到正在监听端口 3000 的快速服务?
在这种情况下,您的底部服务器块几乎是正确的。要在没有 TLS/SSL 的情况下工作(仅在端口 80 上),您需要使用这样的东西:
server {
listen 80;
server_name node.mysite.co
location / {
proxy_pass http://localhost:3000;
}
}
以下是一个非常基本的示例,您可能想要切换一些其他设置。这将使“http://node.mysite.co”代理到正在本地侦听端口 3000 的任何服务(在本例中为 Express 服务器)。
在这种情况下,您不需要为端口 3000 创建防火墙 (ufw) 例外,因为它是本地代理通道。你应该关闭防火墙上的端口,这样人们就不能直接访问它,这样必须通过nginx。
如果您想让 SSL/TLS 正常工作,您需要另一个如下所示的块。同样,这是非常基本的,没有很多您可能想要研究和设置的设置(例如密码选择)。
server {
listen 443 ssl;
server_name node.mysite.co
ssl_certificate certs/mysite/server.crt;
ssl_certificate_key certs/mysite/server.key;
location / {
proxy_pass http://localhost:3000;
}
}
您需要替换证书和密钥路径以分别指向您的 SSL/TLS 证书和密钥。这将使您能够访问 https://node.mysite.co 并且它也会被代理到端口 3000 上的服务。
完成后,您可以选择返回并将 http(端口 80)服务器更改为重定向到 https 以强制仅进行 https 连接。
另请注意,我已确保 server_name 与您现有的带有子域 (node.mysite.co) 的 django server_name 不同。您可能希望更改此值,但您不能让两个服务器块侦听同一端口和 server_name,否则 nginx 将不知道如何处理该请求。我确定您无论如何都会这样做,但我想确保它是明确的并且可以与您现有的设置一起使用。
如果您希望该站点只为 mysite.co:3000
提供服务
如果出于某种原因您希望用户访问域 mysite.co 上的端口 3000,则需要将 "listen" 设置为 3000 并将服务器名称保留为 "mysite.co".这将允许某人在他们的浏览器中转到 mysite.co:3000 并点击您的节点服务。我想这并不是您真正想要的面向 public 的网站,它也不会与您的端口 443 版本很好地对齐。
注意:我并不自称是 nginx 专家,但在过去几年中我将它用于我所有的节点项目,我发现这个设置非常清晰。您可能可以使用一些更好的语法。
我是 Nginx 配置的新手,我有一个快速应用程序进程,运行 在端口 3000 上使用 pm2,我也允许使用 ufw 端口 3000,并且做了一个Nginx 上的服务器实例来代理它,
server {
# SSL configuration
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name .mysite.co;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/django/mysite;
}
proxy_cache mysite;
location / {
include proxy_params;
proxy_pass http://unix:/home/django/mysite/mysite.sock;
}
gzip_comp_level 3;
gzip_types text/plain text/css image/*;
ssl_certificate /etc/letsencrypt/live/mysite.co/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mysite.co/privkey.pem; # managed by Certbot
}
server {
if ($host = www.mysite.co) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = mysite.co) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 default_server;
listen [::]:80 default_server;
server_name .mysite.co;
return 404; # managed by Certbot
}
server{
listen 3000;
listen 443 ssl http2;
server_name .mysite.co:3000;
location / {
proxy_pass https://localhost:3000;
}
}
我 运行 netstat -napl | grep 3000
我可以确认该过程是 运行 并且 pm2 status
也说它 运行 并且日志中也没有错误.
我怎么能让这个工作?提前感谢您的帮助。
您将无法使用 nginx 来侦听端口 3000 以及您的节点进程,因为一次只有一个服务可以真正侦听该端口。因此,您需要确保 nginx 正在侦听不同端口上的连接。我想您正在尝试做的是监听端口 80 / 443,然后将请求发送到正在监听端口 3000 的快速服务?
在这种情况下,您的底部服务器块几乎是正确的。要在没有 TLS/SSL 的情况下工作(仅在端口 80 上),您需要使用这样的东西:
server {
listen 80;
server_name node.mysite.co
location / {
proxy_pass http://localhost:3000;
}
}
以下是一个非常基本的示例,您可能想要切换一些其他设置。这将使“http://node.mysite.co”代理到正在本地侦听端口 3000 的任何服务(在本例中为 Express 服务器)。
在这种情况下,您不需要为端口 3000 创建防火墙 (ufw) 例外,因为它是本地代理通道。你应该关闭防火墙上的端口,这样人们就不能直接访问它,这样必须通过nginx。
如果您想让 SSL/TLS 正常工作,您需要另一个如下所示的块。同样,这是非常基本的,没有很多您可能想要研究和设置的设置(例如密码选择)。
server {
listen 443 ssl;
server_name node.mysite.co
ssl_certificate certs/mysite/server.crt;
ssl_certificate_key certs/mysite/server.key;
location / {
proxy_pass http://localhost:3000;
}
}
您需要替换证书和密钥路径以分别指向您的 SSL/TLS 证书和密钥。这将使您能够访问 https://node.mysite.co 并且它也会被代理到端口 3000 上的服务。
完成后,您可以选择返回并将 http(端口 80)服务器更改为重定向到 https 以强制仅进行 https 连接。
另请注意,我已确保 server_name 与您现有的带有子域 (node.mysite.co) 的 django server_name 不同。您可能希望更改此值,但您不能让两个服务器块侦听同一端口和 server_name,否则 nginx 将不知道如何处理该请求。我确定您无论如何都会这样做,但我想确保它是明确的并且可以与您现有的设置一起使用。
如果您希望该站点只为 mysite.co:3000
提供服务如果出于某种原因您希望用户访问域 mysite.co 上的端口 3000,则需要将 "listen" 设置为 3000 并将服务器名称保留为 "mysite.co".这将允许某人在他们的浏览器中转到 mysite.co:3000 并点击您的节点服务。我想这并不是您真正想要的面向 public 的网站,它也不会与您的端口 443 版本很好地对齐。
注意:我并不自称是 nginx 专家,但在过去几年中我将它用于我所有的节点项目,我发现这个设置非常清晰。您可能可以使用一些更好的语法。