Nginx 很慢。從 Apache2 更改為 Nginx
我最近將我的伺服器從 Apache 更改為 Nginx。那是因為該網站正在使用 file_get_contents 到另一個網站。當該外部網站出現故障或速度變慢時,執行緒被最大化並且伺服器出現故障。這就像多米諾骨牌效應。
然後,我將伺服器從 Apache2 升級到 Nginx,同時還有一個反向代理也執行 Nginx。這樣,我可以在 1 個 IP 地址上執行具有多個域的多個伺服器。
今天我注意到遊客們正在努力下降,並迅速採取行動。伺服器非常慢,甚至有幾個超時。
我有 3 台伺服器:
- 反向代理 - Nginx(到網際網路的主要連接)
- 第一個網站 - Nginx(每天約有 10,000 名獨立訪問者)
- 第二個網站 - 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 過載的解決方案,而是給它更多的資源。
首先,我會嘗試找對外連結條的哪一部分使網站變慢。
- 使用www.webpagetest.org檢查您的慢速網站。
- 如果“第一個字節的時間”值很高 -> 可能是網路、dns、記憶體或 nginx 相關問題。
- 如果初始請求需要很長時間才能完成 -> 可能是 PHP、數據庫、應用程序或記憶體相關問題。
- 啟動 nginx 日誌記錄的時間變數,以便您可以從日誌文件中獲取更多資訊。請參閱使用 NGINX 日誌記錄進行應用程序性能監控。檢查反向代理和應用伺服器上的 nginx 日誌。
- 如果問題在較高負載下變得更糟,您可以模擬負載取消
ab
工具。例如,要發送 3000 個請求和 100 個並發請求,請使用:ab -c 100 -n 3000 http://domain.de/
我還使用它來檢查我的 PHP-fpm 池套接字文件設置是否在負載下執行良好。 4. 慢速文件大小是否取決於?查找數據包大小、緩沖和保活值。 5. 其他問題?硬碟驅動器故障、切換問題、伺服器上的其他程序佔用 CPU/RAM?