(NGINX) NodeJS 反向代理子域
(NGINX) NodeJS Reverse Proxy Subdomain
这个问题可能已经被问了很多次,但我似乎无法找到一个真正有效的真正简单的解决方案。我需要帮助来设置它。
我将列出我当前的环境,以便您快速了解:
- 服务器主机:HETZNER云服务器
- 域主机:Webhuset.no(DNS 记录在这里)
- OS: 美分OS 7 (Hetzner)
- 网站:运行 带有 NodeJS 反向代理的 NGINX
- DNS: 我没有在我的 DNS 记录中添加 *.domain.example,因为我不希望每个子主机都到我的服务器。
- SSL:启用,使用 Let's Encrypt Certbot。
我只有 运行 一个站点,当然,不同的页面用于不同的内容(不是多个站点)
我的目标是拥有类似于 CPanel 子域的内容。我可以在哪里添加 admin.domain.example 并将其设置为例如 domain.example/admin 而无需重定向。
但我发现这比预期的要难,因为我现在已经阅读了那么多论坛帖子和那么多文档,但我就是无法让它工作。
我已经了解了必须在 Nginx 中配置子域。在此之前,我一直在尝试在 nodejs 配置中执行此操作。
我当前的 nginx.conf 使我的域 example.domain 直接进入我网站的根文件夹,使用 SSL。这很好用。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
server {
server_name example.domain www.example.domain;
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/example.domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.domain/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
}
这里我假设我必须添加一个服务器块才能使 admin.example.domain 路由到 example.domain/admin
我怎样才能做到这一点并仍然保持 SSL?我需要 SSL 才能渲染图像。
我试过像这样添加服务器块:
server {
server_name admin.example.domain
location / {
proxy_pass http://127.0.0.1:3000/admin;
}
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/example.domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.domain/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
如果这可行 (除非我监听端口 80 并使用 http://),它只会将我重定向到 (不安全)https://admin.example.domain/admin
和我刚才做的一样的每个人,都能让它发挥作用。但我没有。有什么不同,我该如何解决?
解决方案
- 为我想要的每个子域创建一个服务器块,并将目录放入 proxy_pass(保存并 restart/reload nginx 配置)
- 运行 certbot --nginx
- Select 来自 certbot 列表的子域
- 完成配置并按预期工作。
这个问题可能已经被问了很多次,但我似乎无法找到一个真正有效的真正简单的解决方案。我需要帮助来设置它。
我将列出我当前的环境,以便您快速了解:
- 服务器主机:HETZNER云服务器
- 域主机:Webhuset.no(DNS 记录在这里)
- OS: 美分OS 7 (Hetzner)
- 网站:运行 带有 NodeJS 反向代理的 NGINX
- DNS: 我没有在我的 DNS 记录中添加 *.domain.example,因为我不希望每个子主机都到我的服务器。
- SSL:启用,使用 Let's Encrypt Certbot。
我只有 运行 一个站点,当然,不同的页面用于不同的内容(不是多个站点)
我的目标是拥有类似于 CPanel 子域的内容。我可以在哪里添加 admin.domain.example 并将其设置为例如 domain.example/admin 而无需重定向。
但我发现这比预期的要难,因为我现在已经阅读了那么多论坛帖子和那么多文档,但我就是无法让它工作。
我已经了解了必须在 Nginx 中配置子域。在此之前,我一直在尝试在 nodejs 配置中执行此操作。
我当前的 nginx.conf 使我的域 example.domain 直接进入我网站的根文件夹,使用 SSL。这很好用。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
server {
server_name example.domain www.example.domain;
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/example.domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.domain/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
}
这里我假设我必须添加一个服务器块才能使 admin.example.domain 路由到 example.domain/admin
我怎样才能做到这一点并仍然保持 SSL?我需要 SSL 才能渲染图像。 我试过像这样添加服务器块:
server {
server_name admin.example.domain
location / {
proxy_pass http://127.0.0.1:3000/admin;
}
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/example.domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.domain/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
如果这可行 (除非我监听端口 80 并使用 http://),它只会将我重定向到 (不安全)https://admin.example.domain/admin
和我刚才做的一样的每个人,都能让它发挥作用。但我没有。有什么不同,我该如何解决?
解决方案
- 为我想要的每个子域创建一个服务器块,并将目录放入 proxy_pass(保存并 restart/reload nginx 配置)
- 运行 certbot --nginx
- Select 来自 certbot 列表的子域
- 完成配置并按预期工作。