nginx常用編譯參數
A. 如何 編譯 ngx
一、必要軟體准備
1.安裝pcre
為了支持rewrite功能,我們需要安裝pcre
復制代碼代碼如下:
# yum install pcre* //如過你已經裝了,請跳過這一步
2.安裝openssl
需要ssl的支持,如果不需要ssl支持,請跳過這一步
復制代碼代碼如下:
# yum install openssl*
3.gzip 類庫安裝
復制代碼代碼如下:
yum install zlib zlib-devel
4.安裝wget
下載nginx使用,如果已經安裝,跳過這一步
復制代碼代碼如下:
# yum install wget
二、安裝nginx
1.下載
復制代碼代碼如下:
wget http://nginx.org/download/nginx-1.7.0.tar.gz
2.解壓
復制代碼代碼如下:
tar -zxvf nginx-1.7.0.tar.gz
3.編譯和安裝
執行如下命令:
復制代碼代碼如下:
# cd nginx-1.7.0
# ./configure --prefix=/usr/local/nginx-1.7.0 \
--with-http_ssl_mole --with-http_spdy_mole \
--with-http_stub_status_mole --with-pcre
–with-http_stub_status_mole:支持nginx狀態查詢
–with-http_ssl_mole:支持https
–with-http_spdy_mole:支持google的spdy,想了解請網路spdy,這個必須有ssl的支持
–with-pcre:為了支持rewrite重寫功能,必須制定pcre
最後輸出如下內容,表示configure OK了。
復制代碼代碼如下:
checking for zlib library ... found
creating objs/Makefile
Configuration summary
+ using system PCRE library
+ using system OpenSSL library
+ md5: using OpenSSL library
+ sha1: using OpenSSL library
+ using system zlib library
nginx path prefix: "/usr/local/nginx-1.7.0"
nginx binary file: "/usr/local/nginx-1.7.0/sbin/nginx"
nginx configuration prefix: "/usr/local/nginx-1.7.0/conf"
nginx configuration file: "/usr/local/nginx-1.7.0/conf/nginx.conf"
nginx pid file: "/usr/local/nginx-1.7.0/logs/nginx.pid"
nginx error log file: "/usr/local/nginx-1.7.0/logs/error.log"
nginx http access log file: "/usr/local/nginx-1.7.0/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
# make //確定你的伺服器有安裝make,如果沒有安裝請執行yum install make
# make install
三、啟動、關閉、重置nginx
啟動:直接執行以下命令,nginx就啟動了,不需要改任何配置文件,nginx配置多域名虛擬主機請參考後續文章.
復制代碼代碼如下:
/usr/local/nginx-1.7.0/sbin/nginx
試試訪問:直接使用curl命令來讀取web信息
復制代碼代碼如下:
[root@ns conf]
# curl -s http://localhost | grep nginx.com
nginx.com.
關閉:
復制代碼代碼如下:
/usr/local/nginx-1.7.0/sbin/nginx -s stop
重置:當你有修改配置文件的時候,只需要reload以下即可
復制代碼代碼如下:
/usr/local/nginx-1.7.0/sbin/nginx -s reload
整個nginx的安裝就到這里結束了。
四、nginx編譯參數詳解
復制代碼代碼如下:
–prefix= 指向安裝目錄
–sbin-path 指向(執行)程序文件(nginx)
–conf-path= 指向配置文件(nginx.conf)
–error-log-path= 指向錯誤日誌目錄
–pid-path= 指向pid文件(nginx.pid)
–lock-path= 指向lock文件(nginx.lock)(安裝文件鎖定,防止安裝文件被別人利用,或自己誤操作。)
–user= 指定程序運行時的非特權用戶
–group= 指定程序運行時的非特權用戶組
–builddir= 指向編譯目錄
–with-rtsig_mole 啟用rtsig模塊支持(實時信號)
–with-select_mole 啟用select模塊支持(一種輪詢模式,不推薦在高載環境下使用)禁用:–without-select_mole
–with-poll_mole 啟用poll模塊支持(功能與select相同,與select特性相同,為一種輪詢模式,不推薦在高載環境下使用)
–with-file-aio 啟用file aio支持(一種APL文件傳輸格式)
–with-ipv6 啟用ipv6支持
–with-http_ssl_mole 啟用ngx_http_ssl_mole支持(使支持https請求,需已安裝openssl)
–with-http_realip_mole 啟用ngx_http_realip_mole支持(這個模塊允許從請求標頭更改客戶端的IP地址值,默認為關)
–with-http_addition_mole 啟用ngx_http_addition_mole支持(作為一個輸出過濾器,支持不完全緩沖,分部分響應請求)
–with-http_xslt_mole 啟用ngx_http_xslt_mole支持(過濾轉換XML請求)
–with-http_image_filter_mole 啟用ngx_http_image_filter_mole支持(傳輸JPEG/GIF/PNG 圖片的一個過濾器)(默認為不啟用。gd庫要用到)
–with-http_geoip_mole 啟用ngx_http_geoip_mole支持(該模塊創建基於與MaxMind GeoIP二進制文件相配的客戶端IP地址的ngx_http_geoip_mole變數)
–with-http_sub_mole 啟用ngx_http_sub_mole支持(允許用一些其他文本替換nginx響應中的一些文本)
–with-http_dav_mole 啟用ngx_http_dav_mole支持(增加PUT,DELETE,MKCOL:創建集合,COPY和MOVE方法)默認情況下為關閉,需編譯開啟
–with-http_flv_mole 啟用ngx_http_flv_mole支持(提供尋求內存使用基於時間的偏移量文件)
–with-http_gzip_static_mole 啟用ngx_http_gzip_static_mole支持(在線實時壓縮輸出數據流)
–with-http_random_index_mole 啟用ngx_http_random_index_mole支持(從目錄中隨機挑選一個目錄索引)
–with-http_secure_link_mole 啟用ngx_http_secure_link_mole支持(計算和檢查要求所需的安全鏈接網址)
–with-http_degradation_mole 啟用ngx_http_degradation_mole支持(允許在內存不足的情況下返回204或444碼)
–with-http_stub_status_mole 啟用ngx_http_stub_status_mole支持(獲取nginx自上次啟動以來的工作狀態)
–without-http_charset_mole 禁用ngx_http_charset_mole支持(重新編碼web頁面,但只能是一個方向–伺服器端到客戶端,並且只有一個位元組的編碼可以被重新編碼)
–without-http_gzip_mole 禁用ngx_http_gzip_mole支持(該模塊同-with-http_gzip_static_mole功能一樣)
–without-http_ssi_mole 禁用ngx_http_ssi_mole支持(該模塊提供了一個在輸入端處理處理伺服器包含文件(SSI)的過濾器,目前支持SSI命令的列表是不完整的)
–without-http_userid_mole 禁用ngx_http_userid_mole支持(該模塊用來處理用來確定客戶端後續請求的cookies)
–without-http_access_mole 禁用ngx_http_access_mole支持(該模塊提供了一個簡單的基於主機的訪問控制。允許/拒絕基於ip地址)
–without-http_auth_basic_mole禁用ngx_http_auth_basic_mole(該模塊是可以使用用戶名和密碼基於http基本認證方法來保護你的站點或其部分內容)
–without-http_autoindex_mole 禁用disable ngx_http_autoindex_mole支持(該模塊用於自動生成目錄列表,只在ngx_http_index_mole模塊未找到索引文件時發出請求。)
–without-http_geo_mole 禁用ngx_http_geo_mole支持(創建一些變數,其值依賴於客戶端的IP地址)
–without-http_map_mole 禁用ngx_http_map_mole支持(使用任意的鍵/值對設置配置變數)
–without-http_split_clients_mole 禁用ngx_http_split_clients_mole支持(該模塊用來基於某些條件劃分用戶。條件如:ip地址、報頭、cookies等等)
–without-http_referer_mole 禁用disable ngx_http_referer_mole支持(該模塊用來過濾請求,拒絕報頭中Referer值不正確的請求)
–without-http_rewrite_mole 禁用ngx_http_rewrite_mole支持(該模塊允許使用正則表達式改變URI,並且根據變數來轉向以及選擇配置。如果在server級別設置該選項,那麼他們將在 location之前生效。如果在location還有更進一步的重寫規則,location部分的規則依然會被執行。如果這個URI重寫是因為location部分的規則造成的,那麼 location部分會再次被執行作為新的URI。 這個循環會執行10次,然後Nginx會返回一個500錯誤。)
–without-http_proxy_mole 禁用ngx_http_proxy_mole支持(有關代理伺服器)
–without-http_fastcgi_mole 禁用ngx_http_fastcgi_mole支持(該模塊允許Nginx 與FastCGI 進程交互,並通過傳遞參數來控制FastCGI 進程工作。 )FastCGI一個常駐型的公共網關介面。
–without-http_uwsgi_mole 禁用ngx_http_uwsgi_mole支持(該模塊用來醫用uwsgi協議,uWSGI伺服器相關)
–without-http_scgi_mole 禁用ngx_http_scgi_mole支持(該模塊用來啟用SCGI協議支持,SCGI協議是CGI協議的替代。它是一種應用程序與HTTP服務介面標准。它有些像FastCGI但他的設計 更容易實現。)
–without-http_memcached_mole 禁用ngx_http_memcached_mole支持(該模塊用來提供簡單的緩存,以提高系統效率)
-without-http_limit_zone_mole 禁用ngx_http_limit_zone_mole支持(該模塊可以針對條件,進行會話的並發連接數控制)
–without-http_limit_req_mole 禁用ngx_http_limit_req_mole支持(該模塊允許你對於一個地址進行請求數量的限制用一個給定的session或一個特定的事件)
–without-http_empty_gif_mole 禁用ngx_http_empty_gif_mole支持(該模塊在內存中常駐了一個1*1的透明GIF圖像,可以被非常快速的調用)
–without-http_browser_mole 禁用ngx_http_browser_mole支持(該模塊用來創建依賴於請求報頭的值。如果瀏覽器為modern ,則$modern_browser等於modern_browser_value指令分配的值;如 果瀏覽器為old,則$ancient_browser等於 ancient_browser_value指令分配的值;如果瀏覽器為 MSIE中的任意版本,則 $msie等於1)
–without-http_upstream_ip_hash_mole 禁用ngx_http_upstream_ip_hash_mole支持(該模塊用於簡單的負載均衡)
–with-http_perl_mole 啟用ngx_http_perl_mole支持(該模塊使nginx可以直接使用perl或通過ssi調用perl)
–with-perl_moles_path= 設定perl模塊路徑
–with-perl= 設定perl庫文件路徑
–http-log-path= 設定access log路徑
–http-client-body-temp-path= 設定http客戶端請求臨時文件路徑
–http-proxy-temp-path= 設定http代理臨時文件路徑
–http-fastcgi-temp-path= 設定http fastcgi臨時文件路徑
–http-uwsgi-temp-path= 設定http uwsgi臨時文件路徑
–http-scgi-temp-path= 設定http scgi臨時文件路徑
-without-http 禁用http server功能
–without-http-cache 禁用http cache功能
–with-mail 啟用POP3/IMAP4/SMTP代理模塊支持
–with-mail_ssl_mole 啟用ngx_mail_ssl_mole支持
–without-mail_pop3_mole 禁用pop3協議(POP3即郵局協議的第3個版本,它是規定個人計算機如何連接到互聯網上的郵件伺服器進行收發郵件的協議。是網際網路電子郵件的第一個離線協議標 准,POP3協議允許用戶從伺服器上把郵件存儲到本地主機上,同時根據客戶端的操作刪除或保存在郵件伺服器上的郵件。POP3協議是TCP/IP協議族中的一員,主要用於 支持使用客戶端遠程管理在伺服器上的電子郵件)
–without-mail_imap_mole 禁用imap協議(一種郵件獲取協議。它的主要作用是郵件客戶端可以通過這種協議從郵件伺服器上獲取郵件的信息,下載郵件等。IMAP協議運行在TCP/IP協議之上, 使用的埠是143。它與POP3協議的主要區別是用戶可以不用把所有的郵件全部下載,可以通過客戶端直接對伺服器上的郵件進行操作。)
–without-mail_smtp_mole 禁用smtp協議(SMTP即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。SMTP協議屬於TCP/IP協議族,它幫助每台計算機在發送或中轉信件時找到下一個目的地。)
–with-google_perftools_mole 啟用ngx_google_perftools_mole支持(調試用,剖析程序性能瓶頸)
–with-cpp_test_mole 啟用ngx_cpp_test_mole支持
–add-mole= 啟用外部模塊支持
–with-cc= 指向C編譯器路徑
–with-cpp= 指向C預處理路徑
–with-cc-opt= 設置C編譯器參數(PCRE庫,需要指定–with-cc-opt=」-I /usr/local/include」,如果使用select()函數則需要同時增加文件描述符數量,可以通過–with-cc- opt=」-D FD_SETSIZE=2048」指定。)
–with-ld-opt= 設置連接文件參數。(PCRE庫,需要指定–with-ld-opt=」-L /usr/local/lib」。)
–with-cpu-opt= 指定編譯的CPU,可用的值為: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
–without-pcre 禁用pcre庫
–with-pcre 啟用pcre庫
–with-pcre= 指向pcre庫文件目錄
–with-pcre-opt= 在編譯時為pcre庫設置附加參數
–with-md5= 指向md5庫文件目錄(消息摘要演算法第五版,用以提供消息的完整性保護)
–with-md5-opt= 在編譯時為md5庫設置附加參數
–with-md5-asm 使用md5匯編源
–with-sha1= 指向sha1庫目錄(數字簽名演算法,主要用於數字簽名)
–with-sha1-opt= 在編譯時為sha1庫設置附加參數
–with-sha1-asm 使用sha1匯編源
–with-zlib= 指向zlib庫目錄
–with-zlib-opt= 在編譯時為zlib設置附加參數
–with-zlib-asm= 為指定的CPU使用zlib匯編源進行優化,CPU類型為pentium, pentiumpro
–with-libatomic 為原子內存的更新操作的實現提供一個架構
–with-libatomic= 指向libatomic_ops安裝目錄
–with-openssl= 指向openssl安裝目錄
–with-openssl-opt 在編譯時為openssl設置附加參數
–with-debug 啟用debug日誌
B. nginx代理常用配置
1. 最簡反向代理配置
在http節點下,使用upstream配置服務地址,使用server的location配置代理映射。
upstream my_server {
server 10.0.0.2:8080;
keepalive 2000;
}
server {
listen 80;
server_name 10.0.0.1;
client_max_body_size 1024M;
location /my/ {
proxy_pass http://my_server/;
proxy_set_header Host $host:$server_port;
}
}
通過該配置,訪問nginx地址http://10.0.0.1:80/my的請求會被轉發到my_server服務地址http://10.0.0.2:8080/。
需要注意的是,如果按照如下配置:
upstream my_server {
server 10.0.0.2:8080;
keepalive 2000;
}
server {
listen 80;
server_name 10.0.0.1;
client_max_body_size 1024M;
location /my/ {
proxy_pass http://my_server;
proxy_set_header Host $host:$server_port;
}
}
那麼,訪問nginx地址http://10.0.0.1:80/my的請求會被轉發到my_server服務地址http://10.0.0.2:8080/my。這是因為proxy_pass參數中如果不包含url的路徑,則會將location的pattern識別的路徑作為絕對路徑。
2. 重定向報文代理
即便配置了nginx代理,當服務返回重定向報文時(http code為301或302),會將重定向的目標url地址放入http response報文的header的location欄位內。用戶瀏覽器收到重定向報文時,會解析出該欄位並作跳轉。此時新的請求報文將直接發送給服務地址,而非nginx地址。為了能讓nginx攔截此類請求,必須修改重定向報文的location信息。
location /my/ {
proxy_pass http://my_server;
proxy_set_header Host $host:$server_port;
proxy_redirect / /my/;
}
使用proxy_redirect可以修改重定向報文的location欄位,例子中會將所有的根路徑下的url代理到nginx的/my/路徑下返回給用戶。比如服務返回的重定向報文的location原始值為/login,那麼經過nginx代理後,用戶收到的報文的location欄位為/my/login。此時,瀏覽器將會跳轉到nginx的/my/login地址進行訪問。
需要注意的是,服務返回的重定向報文的location欄位有時會填寫絕對路徑(包含服務的ip/域名和埠),有時候會填寫相對路徑,此時需要根據實際情況進行甄別。
location /my/ {
proxy_pass http://my_server;
proxy_set_header Host $host:$server_port;
proxy_redirect http://my_server/ http://$host:$server_port/my/;
}
上述配置便是將my_server服務的根路徑下的所有路徑代理到nginx地址的/my/路徑下。當nginx配置只有一個server時,http://$host:$server_port前綴可以省略。
3. 報文數據替換
使用nginx代理最牛(dan)逼(sui)的情況就是http響應報文內寫死了服務地址或web絕對路徑。寫死服務地址的情況比較少見,但也偶爾存在。最棘手的是寫死了web絕對路徑,尤其是絕對路徑都沒有公共前綴。舉個例子來說:
一般的web頁面會包含如下類似路徑:
/public:用於靜態頁面資源,如js腳本/public/js,樣式表/public/css,圖片/public/img等。
/static:和/public類似。
/api:用於後台服務API介面。
/login:用於登錄驗證。
其他。
對於這樣的服務,可能的代理配置如下:
location /my/ {
proxy_pass http://my_server/;
proxy_set_header Host $host:$server_port;
proxy_redirect / /my/;
}
location /login/ {
proxy_pass http://my_server/public;
proxy_set_header Host $host:$server_port;
}
location /public/ {
proxy_pass http://my_server/public;
proxy_set_header Host $host:$server_port;
}
location /api/ {
proxy_pass http://my_server/api;
proxy_set_header Host $host:$server_port;
}
由於web頁面或靜態資源內寫死了類似的絕對路徑,那麼對於用戶來說,通過頁面內的鏈接進行跳轉時,都會請求到nginx服務對應的路徑上。一旦存在另一個服務也包含類似的路徑,也需要nginx進行代理,那麼矛盾就出現了:訪問nginx的同一個路徑下的請求究竟轉發給哪一個服務?
要解決這個問題,必須在用戶收到報文前,將報文的數據中包含的絕對路徑都添加統一的前綴,如/my/public,/my/api,/my/login,這樣nginx代理配置則可以簡化為:
location /my/ {
proxy_pass http://my_server/;
proxy_set_header Host $host:$server_port;
proxy_redirect / /my/;
}
location /other/ {
proxy_pass http://other_server/;
proxy_set_header Host $host:$server_port;
proxy_redirect / /other/;
}
nginx的ngx_http_sub_mole模塊提供了類似的報文數據替換功能,該模塊默認不會安裝,需要在編譯nginx時添加--with-http_sub_mole參數,或者直接下載nginx的rpm包。
使用sub_filter對數據包進行替換的語法如下:
location /my/ {
proxy_pass http://my_server/;
proxy_set_header Host $host:$server_port;
sub_filter 'href="/' 'href="/my/';
sub_filter 'src="/' 'src="/my/';
sub_filter_types text/html;
sub_filter_once off;
}
上述配置會將/my/下的所有響應報文內容的href="/替換為href="/my,以及src="/替換為src="/my,即為所有的絕對路徑添加公共前綴。
注意,如果需要配置多個sub_filter,必須保證nginx是1.9.4版本之上的。
C. 您好,我的論壇linux nginx伺服器 速度有些慢,請問有優化方法嗎
一、編譯安裝過程優化
1.減小Nginx編譯後的文件大小
在編譯Nginx時,默認以debug模式進行,而在debug模式下會插入很多跟蹤和ASSERT之類的信息,編譯完成後,一個Nginx要有好幾兆字
節。在編譯前取消Nginx的debug模式,編譯完成後Nginx只有幾百千位元組,因此可以在編譯之前,修改相關源碼,取消debug模式,具體方法如
下:
在Nginx源碼文件被解壓後,找到源碼目錄下的auto/cc/gcc文件,在其中找到如下幾行:
# debug CFLAGS=」$CFLAGS -g」
注釋掉或刪掉這兩行,即可取消debug模式。
2.為特定的CPU指定CPU類型編譯優化
在編譯Nginx時,默認的GCC編譯參數是「-O」,要優化GCC編譯,可以使用以下兩個參數:
--with-cc-opt='-O3'
--with-cpu-opt=CPU #為特定的 CPU 編譯,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
要確定CPU類型,可以通過如下命令:
[root@localhost home]#cat /proc/cpuinfo | grep "model name"
二、利用TCMalloc優化Nginx的性能
TCMalloc的全稱為Thread-Caching
Malloc,是谷歌開發的開源工具「google-perftools」中的一個成員。與標準的glibc庫的malloc相比,TCMalloc庫在
內存分配效率和速度上要高很多,這在很大程度上提高了伺服器在高並發情況下的性能,從而降低系統負載。下面簡單介紹如何為Nginx添加TCMalloc
庫支持。
要安裝TCMalloc庫,需要安裝libunwind(32位操作系統不需要安裝)和google-perftools兩個軟體包,libunwind
庫為基於64位CPU和操作系統的程序提供了基本函數調用鏈和函數調用寄存器功能。下面介紹利用TCMalloc優化Nginx的具體操作過程:
1.安裝libunwind庫
可以從http://download.savannah.gnu.org/releases/libunwind下載相應的libunwind版本,這里下載的是libunwind-0.99-alpha.tar.gz,安裝過程如下:
[root@localhost home]#tar zxvf libunwind-0.99-alpha.tar.gz [root@localhost home]# cd libunwind-0.99-alpha/ [root@localhost libunwind-0.99-alpha]#CFLAGS=-fPIC ./configure [root@localhost libunwind-0.99-alpha]#make CFLAGS=-fPIC [root@localhost libunwind-0.99-alpha]#make CFLAGS=-fPIC install
2.安裝google-perftools
可以從http://google-perftools.googlecode.com下載相應的google-perftools版本,這里下載的是google-perftools-1.8.tar.gz,安裝過程如下:
[root@localhost home]#tar zxvf google-perftools-1.8.tar.gz [root@localhost home]#cd google-perftools-1.8/ [root@localhost google-perftools-1.8]# ./configure [root@localhost google-perftools-1.8]#make && make install [root@localhost google-perftools-1.8]#echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf [root@localhost google-perftools-1.8]# ldconfig
至此,google-perftools安裝完成。
3.重新編譯Nginx
為了使Nginx支持google-perftools,需要在安裝過程中添加「–with-google_perftools_mole」選項重新編譯Nginx,安裝代碼如下:
[[email protected]]#./configure \ >--with-google_perftools_mole --with-http_stub_status_mole --prefix=/opt/nginx [root@localhost nginx-0.7.65]#make [root@localhost nginx-0.7.65]#make install
到這里Nginx安裝完成。
4.為google-perftools添加線程目錄
創建一個線程目錄,這里將文件放在/tmp/tcmalloc下,操作如下:
[root@localhost home]#mkdir /tmp/tcmalloc [root@localhost home]#chmod 0777 /tmp/tcmalloc
5.修改Nginx主配置文件
修改nginx.conf文件,在pid這行的下面添加如下代碼:
#pid logs/nginx.pid; google_perftools_profiles /tmp/tcmalloc;
接著,重啟Nginx,完成google-perftools的載入。
6.驗證運行狀態
為了驗證google-perftools已經正常載入,通過如下命令查看:
[root@ localhost home]# lsof -n | grep tcmalloc nginx 2395 nobody 9w REG 8,8 0 1599440 /tmp/tcmalloc.2395 nginx 2396 nobody 11w REG 8,8 0 1599443 /tmp/tcmalloc.2396 nginx 2397 nobody 13w REG 8,8 0 1599441 /tmp/tcmalloc.2397 nginx 2398 nobody 15w REG 8,8 0 1599442 /tmp/tcmalloc.2398
由於在Nginx配置文件中,設置worker_processes的值為4,因此開啟了4個Nginx線程,每個線程會有一行記錄。每個線程文件後面的數字值就是啟動的Nginx的PID值。
至此,利用TCMalloc優化Nginx的操作完成。
三、Nginx內核參數優化
內核參數的優化,主要是在Linux系統中針對Nginx應用而進行的系統內核參數優化,常見的優化參數值如下。
下面給出一個優化實例以供參考:
net.ipv4.tcp_max_tw_buckets = 6000 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_syncookies = 1 net.core.somaxconn = 262144 net.core.netdev_max_backlog = 262144 net.ipv4.tcp_max_orphans = 262144 net.ipv4.tcp_max_syn_backlog = 262144 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_fin_timeout = 1 net.ipv4.tcp_keepalive_time = 30
將上面的內核參數值加入/etc/sysctl.conf文件中,然後執行如下命令使之生效:
[root@ localhost home]#/sbin/sysctl -p
下面是對實例中選項的含義進行介紹:
net.ipv4.tcp_max_tw_buckets參數用來設定timewait的數量,默認是180000,這里設為6000。
net.ipv4.ip_local_port_range選項用來設定允許系統打開的埠范圍。
net.ipv4.tcp_tw_recycle選項用於設置啟用timewait快速回收。
net.ipv4.tcp_tw_reuse選項用於設置開啟重用,允許將TIME-WAIT sockets重新用於新的TCP連接。
net.ipv4.tcp_syncookies選項用於設置開啟SYN Cookies,當出現SYN等待隊列溢出時,啟用cookies進行處理。
net.core.somaxconn選項默認值是128, 這個參數用於調節系統同時發起的tcp連接數,在高並發的請求中,默認的值可能會導致鏈接超時或者重傳,因此,需要結合並發請求數來調節此值。
net.core.netdev_max_backlog選項表示當每個網路介面接收數據包的速率比內核處理這些包的速率快時,允許發送到隊列的數據包的最大數目。
net.ipv4.tcp_max_orphans選項用於設定系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數
字,孤立連接將立即被復位並列印出警告信息。這個限制只是為了防止簡單的DoS攻擊。不能過分依靠這個限制甚至人為減小這個值,更多的情況是增加這個值。
net.ipv4.tcp_max_syn_backlog選項用於記錄那些尚未收到客戶端確認信息的連接請求的最大值。對於有128MB內存的系統而言,此參數的默認值是1024,對小內存的系統則是128。
net.ipv4.tcp_synack_retries參數的值決定了內核放棄連接之前發送SYN+ACK包的數量。
net.ipv4.tcp_syn_retries選項表示在內核放棄建立連接之前發送SYN包的數量。
net.ipv4.tcp_fin_timeout選項決定了套接字保持在FIN-WAIT-2狀態的時間。默認值是60秒。正確設置這個值非常重要,有時候即使一個負載很小的Web伺服器,也會出現因為大量的死套接字而產生內存溢出的風險。
net.ipv4.tcp_keepalive_time選項表示當keepalive啟用的時候,TCP發送keepalive消息的頻度。默認值是2(單位是小時)。
D. windows下怎樣修改nginx的編譯參數呢
我不熟悉匯編,但是我知道c++和匯編兼容的。
你可以試試直接開一個windows的console的project,然後把內容轉成vc編譯器的寫法吧。
我的經驗是main函數的名字肯定不一樣,所以當把main裡面的內容拷貝過去,main的框子直接用vc自己的。
不熟匯編,但望有幫助。
E. 安全開發運維必備的Nginx代理Web伺服器性能優化與安全加固配置
為了更好的指導部署與測試藝術升系統nginx網站伺服器高性能同時下安全穩定運行,需要對nginx服務進行調優與加固;
本次進行Nginx服務調優加固主要從以下幾個部分:
本文檔僅供內部使用,禁止外傳,幫助研發人員,運維人員對系統長期穩定的運行提供技術文檔參考。
Nginx是一個高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。Nginx作為負載均衡伺服器, Nginx 既可以在內部直接支持 Rails 和 PHP 程序對外進行服務,也可以支持作為 HTTP代理伺服器對外進行服務。
Nginx版本選擇:
項目結構:
Nginx文檔幫助: http://nginx.org/en/docs/
Nginx首頁地址目錄: /usr/share/nginx/html
Nginx配置文件:
localtion 請求匹配的url實是一個正則表達式:
Nginx 匹配判斷表達式:
例如,匹配末尾為如下後綴的靜態並判斷是否存在該文件, 如不存在則404。
查看可用模塊編譯參數:http://nginx.org/en/docs/configure.html
http_gzip模塊
開啟gzip壓縮輸出(常常是大於1kb的靜態文件),減少網路傳輸;
http_fastcgi_mole模塊
nginx可以用來請求路由到FastCGI伺服器運行應用程序由各種框架和PHP編程語言等。可以開啟FastCGI的緩存功能以及將靜態資源進行剝離,從而提高性能。
keepalive模塊
長連接對性能有很大的影響,通過減少CPU和網路開銷需要開啟或關閉連接;
http_ssl_mole模塊
Nginx開啟支持Https協議的SSL模塊
Linux內核參數部分默認值不適合高並發,Linux內核調優,主要涉及到網路和文件系統、內存等的優化,
下面是我常用的內核調優配置:
文件描述符
文件描述符是操作系統資源,用於表示連接、打開的文件,以及其他信息。NGINX 每個連接可以使用兩個文件描述符。
例如如果NGINX充當代理時,通常一個文件描述符表示客戶端連接,另一個連接到代理伺服器,如果開啟了HTTP 保持連接,這個比例會更低(譯註:為什麼更低呢)。
對於有大量連接服務的系統,下面的設置可能需要調整一下:
精簡模塊:Nginx由於不斷添加新的功能,附帶的模塊也越來越多,建議一般常用的伺服器軟體使用源碼編譯安裝管理;
(1) 減小Nginx編譯後的文件大小
(2) 指定GCC編譯參數
修改GCC編譯參數提高編譯優化級別穩妥起見採用 -O2 這也是大多數軟體編譯推薦的優化級別。
GCC編譯參數優化 [可選項] 總共提供了5級編譯優化級別:
常用編譯參數:
緩存和壓縮與限制可以提高性能
NGINX的一些額外功能可用於提高Web應用的性能,調優的時候web應用不需要關掉但值得一提,因為它們的影響可能很重要。
簡單示例:
1) 永久重定向
例如,配置 http 向 https 跳轉 (永久)
nginx配置文件指令優化一覽表
描述:Nginx因為安全配置不合適導致的安全問題,Nginx的默認配置中存在一些安全問題,例如版本號信息泄露、未配置使用SSL協議等。
對Nginx進行安全配置可以有效的防範一些常見安全問題,按照基線標准做好安全配置能夠減少安全事件的發生,保證採用Nginx伺服器系統應用安全運行;
Nginx安全配置項:
溫馨提示: 在修改相應的源代碼文件後需重新編譯。
設置成功後驗證:
應配置非root低許可權用戶來運行nginx服務,設置如下建立Nginx用戶組和用戶,採用user指令指運行用戶
加固方法:
我們應該為提供的站點配置Secure Sockets Layer Protocol (SSL協議),配置其是為了數據傳輸的安全,SSL依靠證書來驗證伺服器的身份,並為瀏覽器和伺服器之間的通信加密。
不應使用不安全SSLv2、SSLv3協議即以下和存在脆弱性的加密套件(ciphers), 我們應該使用較新的TLS協議也應該優於舊的,並使用安全的加密套件。
HTTP Referrer Spam是垃圾信息發送者用來提高他們正在嘗試推廣的網站的互聯網搜索引擎排名一種技術,如果他們的垃圾信息鏈接顯示在訪問日誌中,並且這些日誌被搜索引擎掃描,則會對網站排名產生不利影響
加固方法:
當惡意攻擊者採用掃描器進行掃描時候利用use-agent判斷是否是常用的工具掃描以及特定的版本,是則返回錯誤或者重定向;
Nginx支持webdav,雖然默認情況下不會編譯。如果使用webdav,則應該在Nginx策略中禁用此規則。
加固方法: dav_methods 應設置為off
當訪問一個特製的URL時,如"../nginx.status",stub_status模塊提供一個簡短的Nginx伺服器狀態摘要,大多數情況下不應啟用此模塊。
加固方法:nginx.conf文件中stub_status不應設置為:on
如果在瀏覽器中出現Nginx自動生成的錯誤消息,默認情況下會包含Nginx的版本號,這些信息可以被攻擊者用來幫助他們發現伺服器的潛在漏洞
加固方法: 關閉"Server"響應頭中輸出的Nginx版本號將server_tokens應設置為:off
client_body_timeout設置請求體(request body)的讀超時時間。僅當在一次readstep中,沒有得到請求體,就會設為超時。超時後Nginx返回HTTP狀態碼408(Request timed out)。
加固方法:nginx.conf文件中client_body_timeout應設置為:10
client_header_timeout設置等待client發送一個請求頭的超時時間(例如:GET / HTTP/1.1)。僅當在一次read中沒有收到請求頭,才會設為超時。超時後Nginx返回HTTP狀態碼408(Request timed out)。
加固方法:nginx.conf文件中client_header_timeout應設置為:10
keepalive_timeout設置與client的keep-alive連接超時時間。伺服器將會在這個時間後關閉連接。
加固方法:nginx.conf文件中keepalive_timeout應設置為:55
send_timeout設置客戶端的響應超時時間。這個設置不會用於整個轉發器,而是在兩次客戶端讀取操作之間。如果在這段時間內,客戶端沒有讀取任何數據,Nginx就會關閉連接。
加固方法:nginx.conf文件中send_timeout應設置為:10
GET和POST是Internet上最常用的方法。Web伺服器方法在RFC 2616中定義禁用不需要實現的可用方法。
加固方法:
limit_zone 配置項限制來自客戶端的同時連接數。通過此模塊可以從一個地址限制分配會話的同時連接數量或特殊情況。
加固方法:nginx.conf文件中limit_zone應設置為:slimits $binary_remote_addr 5m
該配置項控制一個會話同時連接的最大數量,即限制來自單個IP地址的連接數量。
加固方法:nginx.conf 文件中 limit_conn 應設置為: slimits 5
加固方法:
加固方法:
解決辦法:
描述後端獲取Proxy後的真實Client的IP獲取需要安裝--with-http_realip_mole,然後後端程序採用JAVA(request.getAttribute("X-Real-IP"))進行獲取;
描述: 如果要使用geoip地區選擇,我們需要再nginx編譯時加入 --with-http_geoip_mole 編譯參數。
描述: 為了防止外部站點引用我們的靜態資源,我們需要設置那些域名可以訪問我們的靜態資源。
描述: 下面收集了Web服務中常規的安全響應頭, 它可以保證不受到某些攻擊,建議在指定的 server{} 代碼塊進行配置。
描述: 為了防止某些未備案的域名或者惡意鏡像站域名綁定到我們伺服器上, 導致伺服器被警告關停,將會對業務或者SEO排名以及企業形象造成影響,我們可以通過如下方式進行防範。
執行結果:
描述: 有時你的網站可能只需要被某一IP或者IP段的地址請求訪問,那麼非白名單中的地址訪問將被阻止訪問, 我們可以如下配置;
常用nginx配置文件解釋:
(1) 阿里巴巴提供的Concat或者Google的PageSpeed模塊實現這個合並文件的功能。
(2) PHP-FPM的優化
如果您高負載網站使用PHP-FPM管理FastCGI對於PHP-FPM的優化非常重要
(3) 配置Resin on Linux或者Windows為我們可以打開 resin-3.1.9/bin/httpd.sh 在不影響其他代碼的地方加入:-Dhttps.protocols=TLSv1.2, 例如
原文地址: https://blog.weiyigeek.top/2019/9-2-122.html
F. Linux 搭建 Nginx (圖片伺服器)
打開nginx官網 http://nginx.org/en/download.html
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
cd /usr/local/
tar -zxvf nginx-1.20.1.tar.gz
./configure --with-http_ssl_mole
編譯參數有很多,這邊我只增加了SSL模塊,小夥伴可以根據自身情況調整
--prefix=PATH:指定 nginx 的安裝目錄
--conf-path=PATH:指定 nginx.conf 配置文件路徑
--user=NAME:nginx 工作進程的用戶
--with-pcre:開啟 PCRE 正則表達式的支持
--with-http_ssl_mole:啟動 SSL 的支持
--with-http_stub_status_mole:用於監控 Nginx 的狀態
--with-http-realip_mole:允許改變客戶端請求頭中客戶端 IP 地址
--with-file-aio:啟用 File AIO
--add-mole=PATH:添加第三方外部模塊
make
執行完上述命令後,在解壓目錄下,多出一個Makefile文件
make install
因編譯時未指定安裝目錄,執行make install 命令後看到反饋日誌信息,實際安裝目錄為/usr/local/nginx
進入實際安裝目錄,看看,並在其sbin目錄下執行啟動nginx
cd /usr/local/nginx/
瀏覽器訪問 http://ip:80 , 顯示如下圖則代表部署成功
進入 /usr/local/nginx/conf/ 文件夾,找到nginx.conf 文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8088;
server_name localhost;
location ~ .*.(gif|jpg|jpeg|png|apk|pdf)$ {
expires 24h;
root /usr/local/img/;#指定圖片存放路徑
access_log /usr/local/nginx/logs/images.log;#日誌路徑
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path /usr/local/img/;#代理臨時路徑
proxy_redirect off;
}
修改配置文件,內容如上
cd /usr/local/nginx/sbin
./nginx -s reload
瀏覽器輸入 http://ip:8088/1.png ,查看是否能正常顯示圖片