Nginx

Nginx 很慢。從 Apache2 更改為 Nginx

  • June 23, 2018

我最近將我的伺服器從 Apache 更改為 Nginx。那是因為該網站正在使用 file_get_contents 到另一個網站。當該外部網站出現故障或速度變慢時,執行緒被最大化並且伺服器出現故障。這就像多米諾骨牌效應。

然後,我將伺服器從 Apache2 升級到 Nginx,同時還有一個反向代理也執行 Nginx。這樣,我可以在 1 個 IP 地址上執行具有多個域的多個伺服器。

今天我注意到遊客們正在努力下降,並迅速採取行動。伺服器非常慢,甚至有幾個超時。


我有 3 台伺服器:

  1. 反向代理 - Nginx(到網際網路的主要連接)
  2. 第一個網站 - Nginx(每天約有 10,000 名獨立訪問者)
  3. 第二個網站 - Apache2(實驗網站,非常快速的響應)

連接第一個網站時非常慢(等待時間約 28 秒),但連接第二個網站時非常快(等待時間約 0.8 秒)

當時我對 Nginx 知之甚少,因為我已經使用 Apache2 2 年了。


反向代理 - /etc/nginx/sites-available/default

是的,我在第一個域名上有一堆域名

server {
   listen 80;

   server_name domain.com www.domain.com domain.org www.domain.org domain.co.uk www.domain.co.uk domain.co www.domain.co domain.me www.domain.me domain.se www.domain.se;

   location / {
       proxy_pass http://192.168.1.237;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection 'upgrade';
       proxy_set_header Host $host;
       proxy_cache_bypass $http_upgrade;
       real_ip_header X-Real-IP;
       real_ip_recursive on;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

       }
}
server {
   listen 80;

   server_name www.domain2.com domain2.com;

   location / {
       proxy_pass http://192.168.1.230;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection 'upgrade';
       proxy_set_header Host $host;
       proxy_cache_bypass $http_upgrade;
    }
}
server {
   listen 80;

   server_name controller.domain.com;

   location / {
       allow 84.71.x.x/21;
       allow 192.168.0.0/16;
       deny all;
       proxy_pass http://192.168.1.1;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection 'upgrade';
       proxy_set_header Host $host;
       proxy_cache_bypass $http_upgrade;

       }
}

第一個網路伺服器 - /etc/nginx/nginx.conf

user www-data;
worker_processes 10;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
       worker_connections 1024;
       # multi_accept on;
}

http {

       ##
       # Basic Settings
       ##

       sendfile on;
       tcp_nopush on;
       tcp_nodelay on;
       keepalive_timeout 65;
       types_hash_max_size 2048;
       # server_tokens off;

       # server_names_hash_bucket_size 64;
       # server_name_in_redirect off;

       include /etc/nginx/mime.types;
       default_type application/octet-stream;

       ##
       # SSL Settings
       ##

       ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
       ssl_prefer_server_ciphers on;

       ##
       # Logging Settings
       ##

       access_log /var/log/nginx/access.log;
       error_log /var/log/nginx/error.log;

       ##
       # Gzip Settings
       ##

       gzip on;
       gzip_disable "msie6";

       # gzip_vary on;
       # gzip_proxied any;
       # gzip_comp_level 6;
       # gzip_buffers 16 8k;
       # gzip_http_version 1.1;
       # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

       ##
       # nginx-naxsi config
       ##
       # Uncomment it if you installed nginx-naxsi
       ##

       #include /etc/nginx/naxsi_core.rules;

       ##
       # Virtual Host Configs
       ##

       include /etc/nginx/conf.d/*.conf;
       include /etc/nginx/sites-enabled/*;
}

第一個網路伺服器 - /etc/nginx/sites-available/default

server {
       listen 80 default_server;
       listen [::]:80 default_server;

       root /var/www/html/pi;
       index index.php;

       # It seems like the server only needed 1 of these, as all the other domains redirects to the main domain
       server_name domain.com domain.org;

       error_page 404 /missing.php;
       error_page 403 /forbidden.php;

       location / {
               # First attempt to serve request as file, then
               # as directory, then fall back to displaying a 404.
               try_files $uri $uri/ =404;
               # Uncomment to enable naxsi on this location
               # include /etc/nginx/naxsi.rules;
       }

       # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
       #
       location ~ \.php$ {
               include snippets/fastcgi-php.conf;
               fastcgi_param REMOTE_ADDR $http_x_real_ip;

               # With php5-cgi alone:
               #fastcgi_pass 127.0.0.1:9000;
               # With php5-fpm:
               fastcgi_pass unix:/var/run/php5-fpm.sock;
       }

       # deny access to .htaccess files, if Apache's document root
       # concurs with nginx's one
       #
       #location ~ /\.ht {
       #       deny all;
       #}
}

我不確定問題出在哪裡,所以我連結了一些配置文件。

我使用了這篇文章的一些內容(我沒有更改埠,只是停止了 apache,安裝了 nginx,然後解除安裝了 apache)從 Apache 遷移到 Nginx。

所有電腦都執行 Debian。

目前我用這個命令計算了每小時大約 4600 個請求:sudo grep -o '13/Feb/2018:09:' /var/log/nginx/access.log | wc -l

你有什麼建議或事情我可以嘗試解決這個問題嗎?


編輯

在高負載下似乎會出現此問題。


更新

伺服器現在似乎工作正常。我找到了這個連結並以配置為例。然後我刪除/編輯以匹配基礎設施(反向代理、自定義參數)。

這是上一周/一天的伺服器狀態的視覺化表示 (Monitorix)。我在圖像上添加了描述。

我會讓伺服器按照目前的配置繼續執行,看看我是否會遇到任何未來的錯誤。

更新 2

已經快一周了,我希望問題得到解決……問題又回來了。

現在它不斷拋出這個錯誤:

2018/02/17 18:52:21 [error] 18185#18185: *2065 connect() to unix:/var/run/php5-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 66.249.x.x, server: domain.org, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "domain.org"

我還發現伺服器通過重新啟動 php5-fpm 變得非常快,但只持續了大約 10 秒。

我覺得很奇怪,伺服器已經正常執行了一周,現在突然又出現了這個問題?

RAM 在 1 GB / 4 GB 時令人不寒而栗,而在查看 monitorix 時唯一明顯的不同(除了所有網路活動下降)就是這個。最後的顛簸是網站關閉時,但我認為這並不重要。

有什麼建議嗎?

更新 3

過去一周我一直在密切關注伺服器,它非常不穩定。有時我的速度非常快,有時可能需要 20 秒左右才能載入到網頁中。

我更改了 nginx.conf 的配置,但似乎只有一點幫助。我開始認為 PHP 是問題所在,而不是 nginx。我發現這個問題連結到一篇文章。我將 www.conf 中的幾個下午更改為:

pm.max_children = 20
pm.start_servers = 8
pm.min_spare_servers = 8
pm.max_spare_servers = 15
pm.max_requests = 500

在過去的一個小時內,響應時間約為 400 毫秒。

我會等待一段時間,看看問題是否再次出現。

所以過了將近半年之後,問題又出現了。可能是因為訪問量幾乎翻了一番,所以需要更多的資源。

我下載了一個新的監控工具Netdata,重啟php5-fpm後仔細查看,發現了這個

當 PHP 套接字用盡時,網站變慢了。所以我發現了問題。

增加PHP的資源後,又執行正常了

這些是我目前的設置/etc/php5/fpm/pool.d/www.conf

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 2000

是的,這不是 PHP 過載的解決方案,而是給它更多的資源。

首先,我會嘗試找對外連結條的哪一部分使網站變慢。

  1. 使用www.webpagetest.org檢查您的慢速網站。
  • 如果“第一個字節的時間”值很高 -> 可能是網路、dns、記憶體或 nginx 相關問題。
  • 如果初始請求需要很長時間才能完成 -> 可能是 PHP、數據庫、應用程序或記憶體相關問題。
  1. 啟動 nginx 日誌記錄的時間變數,以便您可以從日誌文件中獲取更多資訊。請參閱使用 NGINX 日誌記錄進行應用程序性能監控。檢查反向代理和應用伺服器上的 nginx 日誌。
  2. 如果問題在較高負載下變得更糟,您可以模擬負載取消ab工具。例如,要發送 3000 個請求和 100 個並發請求,請使用:
ab -c 100 -n 3000 http://domain.de/

我還使用它來檢查我的 PHP-fpm 池套接字文件設置是否在負載下執行良好。 4. 慢速文件大小是否取決於?查找數據包大小、緩沖和保活值。 5. 其他問題?硬碟驅動器故障、切換問題、伺服器上的其他程序佔用 CPU/RAM?

引用自:https://serverfault.com/questions/897002