我有一个Angular版本和一个Laravel后端,提供在一台服务器上运行的API。我已经在nginx中配置了它们,前端有后端服务器的代理。
后端正在网址上运行(例如占位符)http://api.example.com并且前端正在http://example.com上运行
前端配置:
server {
listen 80;
server_name example.com;
location /api {
proxy_pass http://api.example.com;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
location / {
root /var/www/angular/em-frontend/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html$is_args$args;
}
}
后端配置:
server {
listen 80;
server_name api.example.com;
root /var/www/angular/em-backend/public;
index index.php index.html index.htm;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ /index.php?$query_string;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
现在,当我从前端进行任何api调用时,我从nginx获得了502 Bad Gateway错误。
来自nginx错误日志:
2017/12/09 23:30:40 [alert] 5932#5932: 768 worker_connections are not enough
2017/12/09 23:30:40 [error] 5932#5932: *770 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: IP_MASKED, server: example.com, request: "GET /api/endpoint HTTP/1.1", upstream: "http://IP_ADDRESS:80/api/endpoint", host: "example.com", referrer: "http://example.com/dashboard"
知道如何解决这个问题吗?
答案 0 :(得分:0)
您必须在位置块中使用代理传递,如下例所示:
upstream myproject {
server ip1 ;
server ip2 ;
server ip3 ;
}
location / {
proxy_pass http://myproject;
}
答案 1 :(得分:0)
我相信你的问题是主机名配置创建一个递归循环,其中一个请求被代理回到前端,很快耗尽所有工作人员。您可以通过对前端的单个请求来识别这一点,从而在访问日志中生成许多条目。
我能够使用您提供的配置快速重新创建该错误。下面是一个修改版本,它消除了在后端服务器上提供2个不同静态文件的配置,以说明所需的最小配置。如果这样做,您可以重新添加cgi_pass配置。
#set api domain to use alternate port, could also just tack onto proxy_pass.
upstream api.example.com {
server localhost:8081;
}
#frontend listening on port 8080
server {
listen 8080;
server_name example.com;
location /api {
proxy_pass http://api.example.com;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
location / {
root /usr/local/var/www;
index index.html index.htm;
try_files $uri $uri/ /index.html$is_args$args;
}
}
#backend listening on 8081
server {
listen 8081;
server_name api.example.com;
index index.php index.html index.htm;
location / { # will match any url not ending in .php
root /usr/local/var/www;
try_files $uri $uri/ /index.html;
}
location ~ \.php { #successfully responds to http://example.com:8080/api/*.php
root /usr/local/var/www;
try_files $uri $uri/ /service.html;
}
}
答案 2 :(得分:0)
我有一个类似的问题,可以通过以下方式解决:
events {
worker_connections 1024;
}
events
块与http
块具有相同的级别。