我有一个 nginx 服务器(CentOS 5.3,linux),在 8 个 ruby on Rails 应用程序服务器前面用作反向代理负载平衡器。随着这些服务器上的负载增加,我开始想知道 nginx 服务器什么时候会成为瓶颈?CPU 几乎不被使用,但这是可以预料的。记忆力好像还不错。没有IO可言。
那么我唯一的限制是网卡带宽吗?目前,根据一些 cacti 图表,服务器在高负载期间每个 NIC 的速度约为 700Kbps(平均 5 分钟)。我觉得这个比例还是很低的。
或者,限制是否在套接字或操作系统中的其他资源中?
感谢您的任何想法和见解。
编辑:
骑车者:
感谢您的见解。我做了更多的挖掘。我有 1 个工作人员允许 1024 个工作连接。我们假设 95% 的请求都是针对少量数据的。关于 512MB 的系统应该能够处理什么连接方面有什么建议吗?
另外,计算连接数的好方法是什么?这样的事情准确吗?:
netstat -np | grep ESTABLISHED | grep nginx | wc -l
Run Code Online (Sandbox Code Playgroud)
结束编辑
亚伦
有谁知道如何在公司防火墙后面设置 nginx,以将代理请求反向到防火墙外的服务器?
我想这样做的原因是我试图使用一个不支持标准 http_proxy 设置的应用程序,欺骗它认为有问题的资源位于防火墙内部(即使用 nginx 反向代理它们)。
我已经尝试过以下方法:
首先尝试 proxy_pass 并传递主机:
http {
upstream corporate_proxy {
server web-proxy.mycorp.com:8080;
}
server {
listen 80;
rewrite_log on;
location / {
proxy_buffering off;
proxy_pass_header on;
proxy_set_header Host "http://public-website.com";
proxy_pass http://corporate_proxy;
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二次尝试重写并将 URL 传递到公司防火墙:
http {
upstream corporate_proxy {
server web-proxy.corp.hpecorp.net:8080;
}
server {
listen 80;
rewrite_log on;
location / {
rewrite ^(.*)$ "http://public-website.com$1" break;
proxy_buffering off;
proxy_pass_header on;
proxy_pass http://corporate_proxy;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法最初让我很兴奋,但它实际上只是做了一个重定向,并没有正确代理,最终失败了。我在这里缺少什么吗?
编辑: 感谢下面的评论者发现了我的错误,我在 Host header var 中有协议 …
我正在遵循Nginx docx 中的示例配置。反向代理工作正常,只是它不缓存结果。
这是我的 nginx.conf:
user http http;
worker_processes 1;
events {
worker_connections 1024;
}
http {
proxy_cache_path /srv/http/my.site/cache levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1000m;
proxy_temp_path /srv/http/my.site/tmp;
server {
listen 8081;
server_name my.site remote.host;
location / {
proxy_pass http://remote.host;
proxy_cache STATIC;
proxy_cache_valid 200 302 1d;
proxy_cache_valid 404 1m;
}
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,文件夹权限是可以的:
ls -l /srv/http/my.site/
total 8
drwxr-xr-x 2 http http 4096 Dec 21 04:24 cache
drwxr-xr-x 2 http http 4096 Dec 21 04:24 tmp
Run Code Online (Sandbox Code Playgroud) 我有多个网络服务器,托管多个域。有时,我需要将域从一台 Web 服务器移动到另一台。我不想更新域的 DNS 以指向新的服务器位置,而是希望将所有域设置为指向反向代理 (?),然后将 Web 请求传递到正确的服务器。我正在尝试使用 haproxy 来实现这一目标,但没有取得太大成功。
举个例子:
有两个服务器:web1.foo.com 和 web2.foo.com。web1 为 abc.com 和 def.com 提供站点。web2 为 cba.com 和 fed.com 提供网站服务。
还有一个代理服务器 proxy.foo.com。
abc.com 等的 dns 指向 proxy.foo.com,它被配置为将域映射到服务器,如下所示:
abc.com -> web1.foo.com def.com -> web1.foo.com cba.com -> web2.foo.com fed.com -> web2.foo.com
问题是,我无法使用 haproxy 让它工作...它正在尝试负载平衡而不是反向代理...如果我访问 abc.com,它将在 web1 和 web2 之间循环。
所以,我想我想知道,haproxy 是否可以做到这一点?如果可以,我的配置哪里出了问题?我的配置如下所示:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default …Run Code Online (Sandbox Code Playgroud) 我在 https 上为我的网站提供了这个 nginx 配置,其中 nginx 用作反向代理服务器:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name my_domain123.com www.my_domain123.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name localhost www.my_domain123.com;
return 301 https://my_domain123.com$request_uri;
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name my_domain123.com;
location / {
proxy_redirect http://localhost:4000 https://my_domain123.com;
# ...........................
}
Run Code Online (Sandbox Code Playgroud)
我应该如何调整它以便我可以在同一台服务器上托管具有不同域名的多个网站?我应该在配置中的哪个位置插入新网站的新配置?
或者我也应该为它再创建一个可用/启用的站点?然而,问题仍然存在:我将如何正确组合 2 个或更多配置——同一服务器、多个域——?
我想在 proxy_pass 服务器上使用 API 创建 CORS 站点。但
location / {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header 'Access-Control-Max-Age' 86400;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204; break;
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header …Run Code Online (Sandbox Code Playgroud) 我有一个在 nginx 1.15 后面反向代理的 Web 应用程序服务器,如下所示:
location / {
proxy_pass https://some.awesome.IP:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
add_header Content-Security-Policy "default-src 'self'; frame-ancestor https://subdomain.domain.org 'self'";
Run Code Online (Sandbox Code Playgroud)
现在这个 Web 应用程序服务器认为将标头设置Content-Security-Policy为frame-ancestors 'self'- 这会破坏我的前端,因为我需要将该页面包装在托管于 的 iframe 中https://subdomain.domain.org。
那么,在将响应传递给客户端之前,如何在 nginx 中更改/覆盖/删除从 Web 应用程序服务器返回的标头?add_header这里显然被忽略了。
在我的生产服务器中,我们有几个上游,它们是在带有 nginx 的反向代理后面运行的 docker 容器。其中一个容器是 mqtt 代理(mosquitto),我们用来通过 websockets 进行连接。这是我们的 nginx.conf 文件:
worker_processes 1;
events {
worker_connections 1024;
}
http {
upstream br-frontend {
server br-frontend:3000;
}
upstream br-backend {
server br-backend:5000;
}
upstream mosquitto {
server mosquitto:9001;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
server {
listen 443 ssl default_server;
server_name _;
location / {
proxy_pass http://br-frontend/;
}
location /api {
proxy_pass http://br-backend;
}
location /swagger.json {
proxy_pass http://br-backend/swagger.json;
}
location /swaggerui { …Run Code Online (Sandbox Code Playgroud) 客户端正在向我的 Nginx 反向代理发送自定义 HTTP 标头X-ABC-LOGIN-NAME。为了确保它确实到达,安装了 PHP 服务器 (fastcgi),并且此标头确实显示在phpinfo()“PHP 变量”部分中(带有值)。
我使用 Gunicorn 服务器操作 Django 后端,并在 Django 代码中将所有标头打印到控制台。当我为 /etc/nginx/sites-enabled/default 中的 分配静态值时X-ABC-LOGIN-NAME,该值到达后端。在 nginxdefault文件中,如下所示:
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# include snippets/self-signed.conf;
# include snippets/ssl-params.conf;
# server_name localhost;
server_name dev_server;
underscores_in_headers on;
location / {
proxy_pass http://localhost:8000;
proxy_pass_request_headers on;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header X-ABC-LOGIN-NAME "static_name"; # <-- "static_name" arrives …Run Code Online (Sandbox Code Playgroud) 我在负载均衡器后面有一个 nginx 服务器,nginx 服务器将请求传递到各种服务,但在本例中是一个运行 apache 的 docker 容器。负载均衡器正确设置了 X-Forwarded-For,但当它到达 docker 容器时,X-Forwarded-For 已设置为 LB IP。
我在 nginx 配置中有这个:
/etc/nginx/conf.d/real_ip.conf
set_real_ip_from {{LB IP}};
real_ip_header X-Real-IP;
real_ip_recursive on;
Run Code Online (Sandbox Code Playgroud)
这是虚拟主机:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name *.domain domain;
include /etc/nginx/snippets/domain_ssl.conf;
add_header X-Nginx-Debug "hi";
proxy_pass_request_headers on;
location / {
proxy_pass_request_headers on;
proxy_pass http://container-php;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Remote-Addr $remote_addr;
proxy_set_header X-Real-IP $http_x_real_ip;
proxy_set_header X-Header-Test "Hello World - $http_x_forwarded_for";
proxy_set_header X-Forwarded-Proto $scheme; …Run Code Online (Sandbox Code Playgroud)