我已设置了 angular 和 spring boot 项目,其中 nginx 反向代理到 apache 以服务 angular 应用程序,而嵌入式服务器则通过 nginx 反向代理 spring boot。现在我可以正常加载 angular,但当向 spring boot 服务器发出请求时,它给出 404。我尝试 curl localhost:8085/api/hello
,它有效,或者通过隧道将 localhost 公开给公众,它工作正常。我只是在配置中缺少了一些东西。
Nginx 配置
server {
listen 154.62.107.99:80 default;
server_name _;
access_log /var/log/nginx/154.62.107.99.log main;
error_log /var/log/nginx/error.log debug;
location / {
proxy_pass http://154.62.107.99:8080;
}
location /api/ {
# Simple requests
if ($request_method ~* "(GET|POST)") {
add_header "Access-Control-Allow-Origin" "*";
}
proxy_pass http://0.0.0.0:8085/;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
}
server {
listen 154.62.107.99:443 ssl http2;
server_name _;
ssl_certificate /usr/local/hestia/ssl/certificate.crt;
ssl_certificate_key /usr/local/hestia/ssl/certificate.key;
access_log /var/log/nginx/154.62.107.99_https.log main;
error_log /var/log/nginx/error_https.log debug;
# return 301 http://$host$request_uri;
location / {
# root /var/www/document_errors/;
# Handle preflight requests (OPTIONS)
if ($request_method = OPTIONS ) {
add_header "Access-Control-Allow-Origin" "*";
add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS, HEAD";
add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept";
return 200;
}
# Handle other requests
# Add any additional configuration for handling other requests
# Redirect other requests
return 301 http://$host$request_uri;
}
location /error/ {
alias /var/www/document_errors/;
}
}
在这里,我尝试将所有请求重定向/
到正在运行的 apache 服务器8080
。我需要将所有请求重定向/api/
到我的 spring boot 服务器。
我怀疑这个反向代理是否真的有效。以下是一些观察结果:
- 停止 nginx 服务器会导致网站无法加载,因此请求从那里进行处理。
- 停止 Apache 服务器时出现内部服务器错误
- 对于 location,
/
当我注释掉该行时proxy_pass http://154.62.107.99:8080
,它仍然会加载前端,这很令人惊讶,因为我以为我正在将请求从 nginx 重定向到 apache。我不明白这是怎么发生的。
更新::
这是我的 apache2 配置
Listen 154.62.107.99:8443
Listen 154.62.107.99:8080
<VirtualHost 154.62.107.99:8080>
ServerName 154.62.107.99
DocumentRoot /var/www/html/
Alias /error/ /var/www/document_errors/
</VirtualHost>
<VirtualHost 154.62.107.99:8443>
ServerName 154.62.107.99
DocumentRoot /var/www/html/
Alias /error/ /var/www/document_errors/
SSLEngine on
SSLVerifyClient none
SSLCertificateFile /usr/local/hestia/ssl/certificate.crt
SSLCertificateKeyFile /usr/local/hestia/ssl/certificate.key
</VirtualHost>
现在 dist 文件夹的内容不在 /var/www/html 中,它仅包含一个成功文件。现在,当我停止 apache2 时,我收到内部服务器错误并且页面无法加载,但 apache2 中肯定不会从此处提供 angular 项目。
它在目录中有另一个配置文件/domains
,可以正确配置文档根目录。
<VirtualHost 154.62.107.99:8080>
ServerName nirbhaysingh.dev
ServerAlias www.nirbhaysingh.dev
ServerAdmin [email protected]
DocumentRoot /home/admin/web/nirbhaysingh.dev/public_html
ScriptAlias /cgi-bin/ /home/admin/web/nirbhaysingh.dev/cgi-bin/
Alias /vstats/ /home/admin/web/nirbhaysingh.dev/stats/
Alias /error/ /home/admin/web/nirbhaysingh.dev/document_errors/
#SuexecUserGroup admin admin
CustomLog /var/log/apache2/domains/nirbhaysingh.dev.bytes bytes
CustomLog /var/log/apache2/domains/nirbhaysingh.dev.log combined
ErrorLog /var/log/apache2/domains/nirbhaysingh.dev.error.log
IncludeOptional /home/admin/conf/web/nirbhaysingh.dev/apache2.forcessl.conf*
<Directory /home/admin/web/nirbhaysingh.dev/stats>
AllowOverride All
</Directory>
<Directory /home/admin/web/nirbhaysingh.dev/public_html>
AllowOverride All
Options +Includes -Indexes +ExecCGI
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.0-fpm-nirbhaysingh.dev.sock|fcgi://localhost"
</FilesMatch>
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
IncludeOptional /home/admin/conf/web/nirbhaysingh.dev/apache2.conf_*
IncludeOptional /etc/apache2/conf.d/*.inc
</VirtualHost>
我的猜测是,重定向失败了,因此 Angular 应用程序的内容要么直接从 nginx 提供,如其域配置中定义的那样。我正在处理这个问题,并在此不断更新
答案1
在这种设置中,Nginx 代理最常见的用例是提供 TLS 终止并阻止客户端直接使用未加密的后端服务。
其 Nginx 配置如下:
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
location / {
proxy_pass http://127.0.0.1:8080;
}
location /api/ {
proxy_pass http://127.0.0.1:8085/api/;
}
}
然后,为了提高安全性,Apache 和 Spring Boot 都会监听本地环回而不是公共 IP 地址。
阿帕奇:
Listen 127.0.0.1:8080 <VirtualHost 127.0.0.1:8080> # Directives </VirtualHost>
Spring Boot:
server.address=127.0.0.1 server.port=8085
此外,最好直接使用 Nginx 提供任何静态文件。