ruby-on-rails - Nginx 无法在两个服务器块之间进行代理传递
问题描述
我想为我在同一台机器上的两个服务设置反向代理。一个是运行在 3000 端口的 rails 服务,另一个是运行在 4000 端口的 nodejs 服务。我还想https
使用letsencrypt 和certbot
场景很简单:
- 任何
http
请求都应重定向到https
- 任何请求都
https://api.mydomain.com
应该传递给在端口 4000 (nodejs) 上运行的节点服务 - 对(和 /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
.
提前感谢您的帮助
解决方案
推荐阅读
- elasticsearch - 使用弹性搜索和密集向量进行 NLP 搜索
- java - 变量存储不正确?
- r - 数据框中列的条件更改
- sql - SQL - 联合两个表,但在其中一列上加入
- python - 即使在render_template中传递参数书后也会得到jinja2.exceptions.UndefinedError
- php - PHP 警告 fopen() 权限被拒绝
- javascript - 如何触发
- javascript - 我的菜单链接应该调用一个页面和一个 js 函数。函数触发但页面未更改,反之亦然
- android - Javamail 构建电子邮件正文 - 包含来自多个表单字段的数据 - android studio
- c# - 当我将此代码添加到我的脚本 Unity 崩溃时