我正在学习NodeJ的NestJs框架,以使用Vue和后端部分创建带有前端的网站。 所有组件都在这台服务器上:Nginx,前端和后端(本文对我https://scotch.io/tutorials/building-a-modern-app-using-nestjs-mongodb-and-vuejs有所帮助) 如果我通过IP地址连接到网站,则一切正常。 然后,我需要将其迁移到具有SSL的真实站点以进行HTTPS访问。 这是一个问题。
在前端-方面,我将文件/nestjs-frontend/src/helper.js更改为:
// ./src/helper.js
export const server = {
baseURL: 'https://my_site.ru:3000'
}
NB!端口3000
问题出在从主域https://my_site.com到内部API路径https://my_site.com:3000的访问中
请帮助我解决此问题。
我的Nginx配置是:
server {
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name my_site.com www.my_site.com;
location / {
#proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header SSL_PROTOCOL $ssl_protocol;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
#proxy_set_header X-Client-Verify SUCCESS;
#proxy_set_header X-Client-DN $ssl_client_s_dn;
#proxy_set_header X-SSL-Subject $ssl_client_s_dn;
#proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
proxy_redirect off;
proxy_pass http://127.0.0.1:8080;
}
#listen 8080;
listen 443 ssl; # managed by Certbot
listen [::]:443 ssl ipv6only=on; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/my_site.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/my_site.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
add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload;";
}
server {
if ($host = www.my_site.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = my_site.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 default_server;
listen [::]:80 default_server;
server_name my_site.com www.my_site.com;
return 404; # managed by Certbot
}
upstream app_nodejs {
server 127.0.0.1:3000;
}
upstream web_nodejs {
server 127.0.0.1:8080;
}
答案 0 :(得分:1)
问题在于您的nginx服务器未在端口3000上监听。它仅在端口443(https标准端口)上监听。它还正在侦听端口80(http标准端口),但仅重定向到443。
您需要做的是对从443端口到3000端口的api请求和向8080端口的Web资源请求使用反向代理。
为此,您需要一种区分API请求和Web请求并为每个请求创建不同的location
块的方法。典型的方法是比较部分URL路径。例如,您可以更改您的应用程序,以便所有API请求路径都类似于:
/api/v1/customers
您可以专门为API请求创建一个位置块,如下所示:
location /api/v1 {
...
proxy_pass http://127.0.0.1:3000;
}
您可以保持其他位置信息完好无损。除了proxy_pass
以外,新位置块的内容应与原始内容大致相同。
如果您不想更改应用程序,则可以在一个位置块中使用正则表达式枚举所有请求路径,但这实际上是不可扩展的。看起来像这样:
location ~ ^/{customer|item|group}.*$ {
...
proxy_pass http://127.0.0.1:3000;
}