目錄
一、這裡的最佳化主要是指nginx的配置最佳化,一般來說nginx設定檔中對最佳化比較有作用的主要有以下幾項:
二、關於FastCGI的幾個指令
首頁 後端開發 php教程 高並發中nginx較優的配置方法介紹(程式碼分析)

高並發中nginx較優的配置方法介紹(程式碼分析)

Sep 14, 2018 pm 02:31 PM
nginx 負載平衡

這篇文章帶給大家的內容是關於高並發中nginx較優的配置方法介紹(程式碼分析),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

一、這裡的最佳化主要是指nginx的配置最佳化,一般來說nginx設定檔中對最佳化比較有作用的主要有以下幾項:

nginx進程數,建議依照cpu數目來指定,一般跟cpu核數相同或為它的倍數。

worker_processes 8;
登入後複製

為每個進程分配cpu,上例中將8個進程分配到8個cpu,當然可以寫多個,或將一個進程分配到多個cpu。

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
登入後複製

下面這個指令是指當一個nginx進程打開的最多檔案描述符數目,理論值應該是系統的最多開啟檔案數(ulimit-n)與nginx進程數相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit -n的值保持一致。

worker_rlimit_nofile 65535;
登入後複製

使用epoll的I/O模型,用這個模型來高效處理非同步事件

use epoll;
登入後複製

每個進程允許的最多連接數,理論上每台nginx伺服器的最大連接數為worker_processes*worker_connections。

worker_connections 65535;
登入後複製

http連線逾時時間,預設是60s,功能是使客戶端到伺服器端的連線在設定的時間內持續有效,當出現對伺服器的後繼請求時,該功能避免了建立或重新建立連線。記得這個參數也不能設定過大!否則會導致許多無效的http連線佔據著nginx的連線數,終nginx崩潰!

keepalive_timeout 60;
登入後複製

客戶端請求頭部的緩衝區大小,這個可以根據你的系統分頁大小來設置,一般一個請求的頭部大小不會超過1k,不過由於一般系統分頁都要大於1k,所以這裡設定為分頁大小。分頁大小可以用指令getconf PAGESIZE取得。

client_header_buffer_size 4k;
登入後複製
登入後複製

下面這個參數將為開啟檔案指定緩存,預設是沒有啟用的,max指定快取數量,建議和開啟檔案數一致,inactive是指經過多久檔案沒被要求後刪除緩存。

open_file_cache max=102400 inactive=20s;
登入後複製

下面這個是指多久檢查一次快取的有效資訊。

open_file_cache_valid 30s;
登入後複製

open_file_cache指令中的inactive參數時間內檔案的最少使用次數,如果超過這個數字,檔案描述子一直是在快取中開啟的,如上例,如果有一個檔案在inactive時間內一次沒被使用,它將被移除。

open_file_cache_min_uses 1;
登入後複製
登入後複製

隱藏回應頭中的有關作業系統和web server(Nginx)版本號的信息,這樣對於安全性是有好處的。

server_tokens off;
登入後複製

可以讓sendfile()發揮作用。 sendfile()可以在磁碟和TCP socket之間互相拷貝資料(或任意兩個檔案描述符)。 Pre-sendfile是傳送資料之前在使用者空間申請資料緩衝區。之後用read()將資料從檔案拷貝到這個緩衝區,write()將緩衝區資料寫入網路。 sendfile()是立即將資料從磁碟讀到OS快取。因為這種拷貝是在內核完成的,sendfile()要比組合read()和write()以及打開關閉丟棄緩衝更加有效(更多有關於sendfile)。

sendfile on;
登入後複製

#告訴nginx在一個資料包裡發送所有頭文件,而不一個接一個的發送。就是說資料包不會馬上傳送出去,等到資料包最大時,一次性的傳輸出去,這樣有助於解決網路堵塞。

tcp_nopush on;
登入後複製

#告訴nginx不要緩存數據,而是一段一段的發送--當需要及時發送數據時,就應該給應用設置這個屬性,這樣發送一小塊數據信息時就不能立即得到返回值。

tcp_nodelay on;
登入後複製

例如:

http { 
server_tokens off; 
sendfile on; 
tcp_nopush on; 
tcp_nodelay on; 
......
}
登入後複製

客戶端請求頭部的緩衝區大小,這個可以根據系統分頁大小來設置,一般一個請求頭的大小不會超過1k,但由於一般系統分頁都要大於1k,所以這裡設定為分頁大小。

client_header_buffer_size 4k;
登入後複製
登入後複製

客戶端請求頭部的緩衝區大小,這個可以根據系統分頁大小來設置,一般一個請求頭的大小不會超過1k,但由於一般系統分頁都要大於1k,所以這裡設置為分頁大小。分頁大小可以用指令getconf PAGESIZE取得。

[root@test-huanqiu ~]# getconf PAGESIZE 
4096
登入後複製

但也有client_header_buffer_size超過4k的情況,但是client_header_buffer_size該值必須設定為「系統分頁大小」的整倍數。

為開啟檔案指定緩存,預設是沒有啟用的,max 指定快取數量,建議和開啟檔案數一致,inactive 是指經過多久檔案沒被要求後刪除快取。

open_file_cache max=65535 inactive=60s;
登入後複製

open_file_cache 指令中的inactive 參數時間內檔案的最少使用次數,如果超過這個數字,檔案描述子一直是在快取中開啟的,如上例,如果有一個檔案在inactive 時間內一次沒被使用,它將被移除。

open_file_cache_min_uses 1;
登入後複製
登入後複製

指定多久檢查一次快取的有效資訊。

open_file_cache_valid 80s;
登入後複製

下面是一個使用的簡單的nginx設定檔:

[root@dev-huanqiu ~]# cat /usr/local/nginx/conf/nginx.conf
user   www www;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;
error_log   /www/log/nginx_error.log   crit;
pid         /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 65535;
 
events
{
   use epoll;
   worker_connections 65535;
}
 
http
{
   include       mime.types;
   default_type   application/octet-stream;
 
   charset   utf-8;
 
   server_names_hash_bucket_size 128;
   client_header_buffer_size 2k;
   large_client_header_buffers 4 4k;
   client_max_body_size 8m;
 
   sendfile on;
   tcp_nopush     on;
 
   keepalive_timeout 60;
 
   fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2
                 keys_zone=TEST:10m
                 inactive=5m;
   fastcgi_connect_timeout 300;
   fastcgi_send_timeout 300;
   fastcgi_read_timeout 300;
   fastcgi_buffer_size 16k;
   fastcgi_buffers 16 16k;
   fastcgi_busy_buffers_size 16k;
   fastcgi_temp_file_write_size 16k;
   fastcgi_cache TEST;
   fastcgi_cache_valid 200 302 1h;
   fastcgi_cache_valid 301 1d;
   fastcgi_cache_valid any 1m;
   fastcgi_cache_min_uses 1;
   fastcgi_cache_use_stale error timeout invalid_header http_500; 
   open_file_cache max=204800 inactive=20s;
   open_file_cache_min_uses 1;
   open_file_cache_valid 30s; 
 
   tcp_nodelay on;
   
   gzip on;
   gzip_min_length   1k;
   gzip_buffers     4 16k;
   gzip_http_version 1.0;
   gzip_comp_level 2;
   gzip_types       text/plain application/x-javascript text/css application/xml;
   gzip_vary on;
 
   server
   {
     listen       8080;
     server_name   huan.wangshibo.com;
     index index.php index.htm;
     root   /www/html/;
 
     location /status
     {
         stub_status on;
     }
 
     location ~ .*\.(php|php5)?$
     {
         fastcgi_pass 127.0.0.1:9000;
         fastcgi_index index.php;
         include fcgi.conf;
     }
 
     location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
     {
       expires       30d;
     }
 
     log_format   access   '$remote_addr - $remote_user [$time_local] "$request" '
               '$status $body_bytes_sent "$http_referer" '
               '"$http_user_agent" $http_x_forwarded_for';
     access_log   /www/log/access.log   access;
       }
}
登入後複製

二、關於FastCGI的幾個指令

這個指令為FastCGI快取指定一個路徑,目錄結構等級,關鍵字區域儲存時間和非活動刪除時間。

fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
登入後複製

指定連線到後端FastCGI的逾時時間。

fastcgi_connect_timeout 300;
登入後複製

向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。

fastcgi_send_timeout 300;
登入後複製

接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。

fastcgi_read_timeout 300;
登入後複製

指定读取FastCGI应答第一部分 需要用多大的缓冲区,这里可以设置为fastcgi_buffers指令指定的缓冲区大小,上面的指令指定它将使用1个 16k的缓冲区去读取应答的第一部分,即应答头,其实这个应答头一般情况下都很小(不会超过1k),但是你如果在fastcgi_buffers指令中指 定了缓冲区的大小,那么它也会分配一个fastcgi_buffers指定的缓冲区大小去缓存。

fastcgi_buffer_size 16k;
登入後複製

指定本地需要用多少和多大的缓冲区来 缓冲FastCGI的应答,如上所示,如果一个php脚本所产生的页面大小为256k,则会为其分配16个16k的缓冲区来缓存,如果大于256k,增大 于256k的部分会缓存到fastcgi_temp指定的路径中, 当然这对服务器负载来说是不明智的方案,因为内存中处理数据速度要快于硬盘,通常这个值 的设置应该选择一个你的站点中的php脚本所产生的页面大小的中间值,比如你的站点大部分脚本所产生的页面大小为 256k就可以把这个值设置为16 16k,或者4 64k 或者64 4k,但很显然,后两种并不是好的设置方法,因为如果产生的页面只有32k,如果用4 64k它会分配1个64k的缓冲区去缓存,而如果使用64 4k它会分配8个4k的缓冲区去缓存,而如果使用16 16k则它会分配2个16k去缓存页面,这样看起来似乎更加合理。

fastcgi_buffers 16 16k;
登入後複製

这个指令我也不知道是做什么用,只知道默认值是fastcgi_buffers的两倍。

fastcgi_busy_buffers_size 32k;
登入後複製

在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍。

fastcgi_temp_file_write_size 32k;
登入後複製

开启FastCGI缓存并且为其制定一个名称。个人感觉开启缓存非常有用,可以有效降低CPU负载,并且防止502错误。但是这个缓存会引起很多问题,因为它缓存的是动态页面。具体使用还需根据自己的需求。

fastcgi_cache TEST
登入後複製

为指定的应答代码指定缓存时间,如上例中将200,302应答缓存一小时,301应答缓存1天,其他为1分钟。

fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
登入後複製

缓存在fastcgi_cache_path指令inactive参数值时间内的最少使用次数,如上例,如果在5分钟内某文件1次也没有被使用,那么这个文件将被移除。

fastcgi_cache_min_uses 1;
登入後複製

不知道这个参数的作用,猜想应该是让nginx知道哪些类型的缓存是没用的。

fastcgi_cache_use_stale error timeout invalid_header http_500;
登入後複製

相关推荐:

nginx+keepalived配置高可用HTTP群集

高流量站点NGINX与PHP-fpm配置优化(译)

以上是高並發中nginx較優的配置方法介紹(程式碼分析)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

tomcat伺服器怎麼能讓外網訪問 tomcat伺服器怎麼能讓外網訪問 Apr 21, 2024 am 07:22 AM

tomcat伺服器怎麼能讓外網訪問

nginx啟動指令和停止指令是什麼 nginx啟動指令和停止指令是什麼 Apr 02, 2024 pm 08:45 PM

nginx啟動指令和停止指令是什麼

thinkphp怎麼運行 thinkphp怎麼運行 Apr 09, 2024 pm 05:39 PM

thinkphp怎麼運行

Welcome to nginx!怎麼解決? Welcome to nginx!怎麼解決? Apr 17, 2024 am 05:12 AM

Welcome to nginx!怎麼解決?

nodejs專案怎麼部署到伺服器 nodejs專案怎麼部署到伺服器 Apr 21, 2024 am 04:40 AM

nodejs專案怎麼部署到伺服器

phpmyadmin怎麼註冊 phpmyadmin怎麼註冊 Apr 07, 2024 pm 02:45 PM

phpmyadmin怎麼註冊

造訪網站出現nginx怎麼解決 造訪網站出現nginx怎麼解決 Apr 02, 2024 pm 08:39 PM

造訪網站出現nginx怎麼解決

docker容器之間如何通信 docker容器之間如何通信 Apr 07, 2024 pm 06:24 PM

docker容器之間如何通信

See all articles