首页 > 解决方案 > Nginx 无法在两个服务器块之间进行代理传递

问题描述

我想为我在同一台机器上的两个服务设置反向代理。一个是运行在 3000 端口的 rails 服务,另一个是运行在 4000 端口的 nodejs 服务。我还想https使用letsencrypt 和certbot

场景很简单:

  1. 任何http请求都应重定向到https
  2. 任何请求都https://api.mydomain.com应该传递给在端口 4000 (nodejs) 上运行的节点服务
  3. 对(和 /admin 和 /assets)的任何请求https://api.mydomain.com/api都应传递给在端口 3000 上运行的 rails 服务

这是我已经拥有的 nginx 代码。我没有触摸 nginx 的默认配置,但修改了默认文件/etc/nginx/sites-enabled

server {
    listen 80;
    listen [::]:80;
    server_name api.mydomain.com;
    return 302 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name api.mydomain.com;
    ssl_certificate /etc/letsencrypt/live/api.mydomain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/api.mydomain.com/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

    index index.html index.htm index.nginx-debian.html;

    client_max_body_size 11m;
    client_header_timeout 1m;
    client_body_timeout 1m;
    proxy_connect_timeout 60s;
    proxy_read_timeout 1m;
    proxy_send_timeout 1m;


    location / {
        proxy_pass http://localhost:4000;
    }
    location /api {
        proxy_pass api.mydomain.com:3000$request_uri;
    }
    location /admin {
        proxy_pass api.mydomain.com:3000$request_uri;
    }
    location /assets {
        proxy_pass api.mydomain.com:3000$request_uri;
    }

}


server {
    listen 3000 ssl http2;
    listen [::]:3000 ssl http2;
    server_name api.mydomain.com;
    ssl_certificate /etc/letsencrypt/live/api.mydomain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/api.mydomain.com/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

    client_max_body_size 11m;
    client_header_timeout 1m;
    client_body_timeout 1m;
    proxy_connect_timeout 60s;
    proxy_read_timeout 1m;
    proxy_send_timeout 1m;


    passenger_enabled on;
    passenger_ruby /home/ubuntu/.rbenv/versions/2.6.6/bin/ruby;
    root /var/www/MyDomain-BackEnd/current/public;
    access_log /var/www/MyDomain-BackEnd/current/log/access.log;
    error_log /var/www/MyDomain-BackEnd/current/log/production.log;
}

尝试访问任何类似的路由时出现超时错误https://api.mydomain.com/api,但使用请求的端口号可以正常工作(例如https://api.mydomain.com:3000/api.

提前感谢您的帮助

标签: ruby-on-railsnginxpassenger

解决方案


推荐阅读