Mav*_*ick 1 https nginx express pm2 nginx-reverse-proxy
我是 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;
}
}
Run Code Online (Sandbox Code Playgroud)
我运行了netstat -napl | grep 3000,我可以确认该进程正在运行,并且pm2 status还表明它正在运行并且日志中也没有错误。我怎样才能做到这一点?我在这里先向您的帮助表示感谢。
您将无法使用 nginx 以及您的节点进程来侦听端口 3000,因为只有一个服务可以真正同时侦听该端口。因此,您需要确保 nginx 正在侦听不同端口上的连接。我想您想要做的是侦听端口 80 / 443,然后将请求发送到正在侦听端口 3000 的 Express 服务上?
在这种情况下,您的底部服务器块几乎是正确的。要在没有 TLS/SSL 的情况下(仅在端口 80 上)实现此功能,您需要使用如下内容:
server {
listen 80;
server_name node.mysite.co
location / {
proxy_pass http://localhost:3000;
}
}
Run Code Online (Sandbox Code Playgroud)
以下是一个非常基本的示例,您可能需要切换一些其他设置。这将使“ 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;
}
}
Run Code Online (Sandbox Code Playgroud)
您需要替换证书和密钥路径以分别指向您的 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 专家,但过去几年我已经将它用于我的所有节点项目,并且我发现这个设置非常清晰。您可能可以使用一些更好的语法。
| 归档时间: |
|
| 查看次数: |
7309 次 |
| 最近记录: |