我是Nginx配置的新手,我有一个进程是一个快速应用程序,使用pm2在端口3000上运行,我也允许使用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
也表示该进程正在运行,并且日志中也没有错误。
我该如何进行这项工作?感谢您的提前帮助。
答案 0 :(得分:1)
您将无法使用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并点击您的节点服务。我想这不是真正面向公众的网站所需要的,它也不会很好地与您的443端口版本很好地匹配。
注意:我并没有声称自己是nginx专家,但是过去几年我在所有节点项目中都使用了它,并且我发现此设置非常清楚。您可能会使用一些更好的语法。