Articles of nginx

Nginx和php-fpm在高负载下失败:“端口80可能发生SYN溢出”和“104:由对等端重置连接”

我有相当沉重的Web服务器使用: Ubuntu server nginx php-fpm + apc 昨天我的服务器发生了一些奇怪的事情。 它崩溃,并停止响应,并在我重新启动后,网页开始加载非常缓慢,在大多数情况下“请求超时”。 我检查了/var/log/syslog并看到了很多消息,例如: TCP: Possible SYN flooding on port 80. Sending cookies. 页面大约需要2分钟才能在本地加载: time wget -O /dev/null mysite.net –2012-12-21 13:17:15– http://mysite.net/ Resolving ficbook.net… 85.254.49.180 Connecting to mysite.net|85.254.49.180|:80… connected. HTTP request sent, awaiting response… 200 OK Length: 1311 (1.3K) [text/html] Saving to: `/dev/null' 100%[========================================================================================================>] 1,311 –.-K/s in 0s 2012-12-21 […]

如何从nginx地图提供静态文件?

我有一个看起来像这样的configuration中的nginx 映射 : map $uri $route { /route_a /path/to/a.html; /route_b /path/to/b.html; } server { listen 8080; server_name example.dev; } 我尝试在服务器块内rewrite : rewrite ^ $route break; 但尝试访问/route_a时得到了404。 我尝试在服务器块内的location和alias : location ~ ^ { alias $route; } 哪些工作,但服务我的内容作为application/octet-stream 。 什么是正确的方法来做到这一点? 我的约束是,URIpath到文件必须在地图块内定义。

如何将所有HTTPstream量redirect到HTTPS,以使用SSL证书在ELB后面的nginx / uWSGI后面运行的Django 1.4应用程序

我想知道如何把我的整个Django网站后面的HTTPS。 如果有人试图通过HTTP来,我希望该用户被redirect到HTTPS。 目前,Firefox给我的错误是“Firefox已经检测到服务器正在redirect这个地址的请求,永远不会完成”。 我的设置是: 1.一个带SSL证书的AWS负载均衡器(ELB)ELB有两个监听器: 负载均衡器端口80(HTTP)指向实例端口80(HTTP) 指向实例端口80(HTTP)的负载平衡器端口443(HTTPS) 2.运行nginx / uWSGI的ELB后面有一个EC2实例 nginxconfiguration server { listen 80; return 301 https://$host$request_uri; } server { listen 443 ssl; set $home /server/env.example.com; client_max_body_size 10m; keepalive_timeout 120; location / { uwsgi_pass uwsgi_main; include uwsgi_params; uwsgi_param SCRIPT_NAME ""; uwsgi_param UWSGI_CHDIR $home/project; uwsgi_param UWSGI_SCRIPT wsgi; uwsgi_param UWSGI_PYHOME $home; } } uwsgiconfiguration # file: […]

是否有可能告诉nginx通过fastcgi通过一个连接:closures标题通过未改变?

TL; DR :如何告诉nginx从我的php-fpm后端到a)发送一个“Connection:close”标题和b)不缓冲我的回应? 我有一个运行在nginx后面的php-fpm。 一般来说,这样做效果很好,我对此感到满意,但是有几个脚本非常希望向客户端浏览器发送一个“Connection:close”头文件(一个确保一个全新的连接到达HAProxy ),一个是为了能够响应客户端不能处理分块传输编码(.NET有一个错误)。 现在,如果我在PHP中这样做: <?php header('Connection: close'); echo "foobar"; 并尝试curl,我得到这个: curl -I http://localhost/foo.php HTTP/1.1 200 OK Server: nginx/1.1.19 Date: Tue, 19 Feb 2013 08:07:03 GMT Content-Type: text/html Connection: keep-alive X-Powered-By: PHP/5.4.11 正如你所看到的,“closures”已经变成了“保持活力”。 但不仅如此:显然,nginx也会caching这个响应并一次性发送(通过发送大量数据,睡眠,发送更多的数据来确认)。 看看这个文档,我发现了在这里代理的“X-Accel-Buffering”头文件。 这个头看起来应该是做我想要的东西(好吧,它不能解决连接头问题,但至less应该停止缓冲),但是,唉,没有运气 <?php header('Connection: close'); header('X-Accel-Buffering: no'); echo "foobar"; curl -I http://localhost/foo.php HTTP/1.1 200 OK Server: nginx/1.1.19 Date: Tue, […]

如何理解Nginx中的随机500内部错误?

我们的服务器显示了大量的500个内部错误页面随机请求。 我们知道应用程序正在工作,因为我们的代码是unit testing。 服务器设置是Nginx,Unicorn在Ubuntu 10.4 LTS上运行单个Rails应用程序。 据我们所知,请求在传递给Unicorn之前失败了,因为Unicorn的日志文件或我们的Airbrake(我们正在使用的另一个日志logging服务)中没有日志条目,但Nginx的日志文件确实显示了500个状态条目。 服务器正常负载,所以它没有用完内存或任何东西。 Nginx的error.log文件实际上并没有给我们任何有用的东西。 没有build议文件问题或资源问题的条目。 我应该如何继续寻找这个问题? 谢谢 这是我们的网站的nginxconfiguration: # This is the socket that unicorn listens to upstream unicorn { server unix:/tmp/unicorn.sock; } server { listen 80; client_max_body_size 10m; server_name oursite.com; root /var/www/current/public; access_log /var/log/nginx/access.log; error_page 500 502 503 504 /var/www/shared/500.html; if ($http_user_agent ~* (majestic12|easou|Sogou|baidu|ahrefs) ) { return 403; } […]

静态的大文件和安全的服务方式(中央authenticationCDN)

我需要向几个用户提供几个静态大文件(每个大约4GB),使用5个位于不同地理区域的服务器。 这个想法是没有其他人获得这些内容,因为这些文件中的信息并不是针对公众的。 其任务是使用Web服务器和一些authentication机制来提供这些文件,或者重新编写URL,或者及时到期。 为此,我可以做一个Web应用程序,为客户端提供访问文件所需的链接和/或凭证。 例如,我已经看到,nginx可以检查cookie是否在浏览器中设置,并可以根据这个事实做一个URL重写,但这可能是不够的,因为我似乎无法findvalidationcookie内容的方法。 我也看到了nginx http_auth在电子邮件的反向代理上工作。 这可能是一个好主意,但同样,静态的大文件和安全地提供服务的方法。 有任何想法吗?

到期内容与Nginx创build404s?

我有一个包含以下location块的虚拟主机: server { listen 80; server_name ~^(?<username>[^.]+)\.project*/\.client\.com$; root /home/$username/project/app/webroot; index index.php; access_log /var/log/nginx/project.sandbox.access.log; error_log /var/log/nginx/project.sandbox.error.log; location / { try_files $uri $uri/ /index.php?url=$uri; } location ~ \.php$ { include /etc/nginx/includes/php; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } include /etc/nginx/includes/ignore; } 我从来没有遇到过任何问题,但我只是添加了一个function,允许用户上传和存储文件。 如果用户上传pdf,txt文件等一切正常,我可以通过它的URL加载上传。 另一方面,图像并不是那么多。 404s到处都是。 我已经缩小到这个区块,但是我不明白。 其他图像资产加载正常。 唯一的区别在于,上传的资源不会按照server块的root指令定义的加载到webroot中。 上传存储在/opt/www/app/plugins/… 。 有什么理由应该重要吗? 我的前端控制器处理上传资产的路由。 我想caching/过期的内容,但我需要先修复404s。

如何使用iptables删除“空”HTTP数据包?

我有一个运行在Ubuntu 10.04 LTS上的1GB-VPS托pipe站点。 我正在使用nginx作为Web服务器。 该网站已经运行了三年的相对稳定的configuration,每个月处理约400万的综合浏览量。 在过去的16个小时里,我一直在看到我认为是一个“温和”的DDoS攻击。 传出stream量已经乘以5,CPU使用率大约增加了三倍。 我在我的nginx日志中看到一个或两个IP每秒同时发送多个请求(每个1-10个)。 这些请求似乎没有去我的url,但我的IP地址直接。 由于我对nginx.conf有一定的了解,因此我在这里设置了一个单独的“默认”服务器模块来捕获这个stream量并logging下来。 我有它设置为logging该stream量,并返回错误代码444。 我也为这个stream量设置了limit_req_zone和limit_conn_zone,尽pipe因为这些是不同的IP发送请求,所以影响不大。 这里是nginx.conf的相关部分: limit_req_zone $binary_remote_addr zone=ddos:25m rate=1r/m; limit_conn_zone $binary_remote_addr zone=blockedfuckers:20m; server { listen 80 default_server; server_name _; access_log /var/log/nginx/a2.log hackers; limit_req zone=ddos nodelay; limit_conn blockedfrakers 1; return 444; } 这个CPU使用率下降了30%左右,但是输出stream量仍然很高,CPU仍然超过了一倍。 出于某种原因,日志显示请求正在发送一个400响应,而不是我试图发送的444。 例如: 109.198.195.28 [12/Mar/2013:22:49:24 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: – 107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: […]

连接超时NGINX php-fpm mail()

我正在从Apache服务器和NGINX服务器移植一个PHP站点。 首先,我将摆脱apache以避免任何问题: # service httpd stop # yum erase httpd* 现在我要安装php-fpm所以我可以通过NGINX扩展phpfunction: # yum install php-fpm 让我们确保php-fpm在正确的用户下运行: # ps aux | grep apache apache 1658 0.0 0.5 222552 5316 ? S 20:41 0:00 php-fpm: pool www apache 1659 0.0 1.0 227268 10536 ? S 20:41 0:00 php-fpm: pool www apache 1660 0.0 1.0 227268 10420 ? […]

是否有可能有相同的URL服务于另一个端口上的不同网站?

使用NGINX并尝试使用相同的URLredirectstream量,但通过另一个端口访问另一个网站。 这可能吗: server { listen 80 server_name myurl.com; } server { listen 8080; server_name myurl.com:8080; }