? ? 前段時間,登上公司網(wǎng)站測試用的伺服器,無意中看到一個access.log.gz的文件包,好奇心驅(qū)使我將其從遠(yuǎn)端伺服器下載到了本地,然後解壓,打開看,是一份訪問日誌,之前總是聽到他們維運的提到訪問日誌訪問日誌,腦子只對它有印象,但不知道具體是什麼,現(xiàn)在知道了,然後,然後不懂就要問呀,了解到了一個叫nginx的伺服器軟體。利用業(yè)餘時間簡單的了解後,就想能不能在自己的電腦上安裝一個nginx,平時開發(fā)調(diào)試時,也可以監(jiān)控用的最多的幾個端口,雖然感覺並沒有什麼意義,但也可看作是一種學(xué)習(xí),畢竟自己動手操作一遍比僅僅只看書或資料體會的會更加深刻。今天只講下配置,隨著學(xué)習(xí)的深入還會接觸到負(fù)載平衡、反向代理、優(yōu)化等等,講得不正確的地方歡迎指正,相互學(xué)習(xí),共同進(jìn)步!
? ? ?Nginx相比Apaceh等,它的優(yōu)點很多資料了上有,不在此過多強(qiáng)調(diào),無非就是高並發(fā)連接、內(nèi)存消耗少、成本低廉、配置文件簡單等等。
(一)安裝
????在ubuntu系統(tǒng)上安裝nginx,很簡單,一條指令就可以搞定。
sudo apt-get install nginx
? ?
順便提醒下:如果你在安裝時報錯,終端提示“無法解析或打開軟體包的列表或是狀態(tài)文件”,具體如下:
E: Encountered a section with no Package: header
E: Problem with MergeList /var/lib/apt/lists/cn.archive.ubuntu.com_ubuntu_dists_natty_main_i18n_Translation-en
E: 無法解析或開啟軟體包的清單或是狀態(tài)檔。
解決方法:
sudo rm /var/lib/apt/lists/* -vf ? ?//如果無法刪除則可以用強(qiáng)制刪除,加個參數(shù)-r ??
sudo apt-get update
如果你的電腦裡安裝有Apache,而且已經(jīng)運作了,把Apache停了,因為Apache和Nginx的預(yù)設(shè)埠都是80。 安裝成功後,就會有一個可執(zhí)行指令,開啟終端機(jī)輸入指令nginx -h,會出現(xiàn)一些指令參數(shù)資訊。nginx -T ? ? ? ?測試設(shè)定檔並轉(zhuǎn)儲
nginx -q ? ? ? ? 在設(shè)定測試期間抑制非錯誤訊息
nginx -s signal ?發(fā)送訊號到主程式,其中訊號有stop,停止nginx;quit,退出;reopen,????? ? ?
nginx -p prefix ?設(shè)定前綴路徑,預(yù)設(shè)為/usr/share/nginx/
nginx -c filename 設(shè)定設(shè)定文件,預(yù)設(shè)為/etc/nginx/nginx.conf
ngnix -g的全域指令
註:如果在使用這些指令時報錯,有可能是權(quán)限問題,切換到root下執(zhí)行就可以。
(二)設(shè)定檔
主設(shè)定檔為nginx.conf,預(yù)設(shè)路勁在/etc/nginx/下
與PHP相關(guān)的是fastcgi_params,與Python相關(guān)的是uwsgi_params
如下:user www www ;
kill ?-訊號類型` cat /run/nginx.pid`
這個指令是指當(dāng)一個nginx進(jìn)程打開的最多文件描述符數(shù)目,理論值應(yīng)該是最多打開文件數(shù)(ulimit -n)與nginx進(jìn)程數(shù)相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit -n 的值保持一致。
現(xiàn)在在Linux 2.6核心下開啟檔案開啟數(shù)為65535,worker_rlimit_nofile就對應(yīng)應(yīng)該填入65535。
這是因為nginx調(diào)度時分配請求到進(jìn)程並不是那麼的均衡,所以假如填寫10240,總併發(fā)量達(dá)到3-4萬時就有進(jìn)程可能超過10240了,這時會返回502錯誤。
events
{
use epoll;
使用epoll的網(wǎng)路I/O 模型。 linux建議epoll,F(xiàn)reeBSD建議採用kqueue,window下不指定。
關(guān)於什麼時epoll、select、kqueue可以查相關(guān)資料。
worker_connections 204800;
????每個工作進(jìn)程的最大連線數(shù)量。根據(jù)硬體調(diào)整,和前面工作進(jìn)程配合起來用,盡量大,但是別把cpu跑到100%就行。每個進(jìn)程允許的最多連線數(shù),理論上每臺nginx伺服器的最大連線數(shù)為worker_processes*worker_connections
keepalive_timeout 60;
keepalive逾時時間。
client_header_buffer_size 4k;
客戶端請求頭部的緩衝區(qū)大小。這個可以根據(jù)你的系統(tǒng)分頁大小來設(shè)置,一般一個請求頭的大小不會超過1k,但由於一般系統(tǒng)分頁都要大於1k,所以這裡設(shè)置為分頁大小。
分頁大小可以用指令getconf PAGESIZE 取得。
但也有client_header_buffer_size超過4k的情況,但是client_header_buffer_size該值必須設(shè)定為「系統(tǒng)分頁大小」的整倍數(shù)。
open_file_cache max=65535 inactive=60s;
這個將為打開文件指定緩存,默認(rèn)是沒有啟用的,max指定緩存數(shù)量,建議和打開文件數(shù)一致,inactive是指經(jīng)過多長時間文件沒被請求後刪除緩存。
open_file_cache_valid 80s;
這個是指多久檢查一次快取的有效資訊。
open_file_cache_min_uses 1;
open_file_cache指令中的inactive參數(shù)時間內(nèi)檔案的最少使用次數(shù),如果超過這個數(shù)字,檔案描述子一直是在快取中開啟的,如上例,如果有一個檔案在inactive時間內(nèi)一次沒被使用,它將被移除。
}
?##下面是設(shè)定http伺服器,利用它的反向代理功能提供負(fù)載平衡支援
http
{
include mime.types;
類型檔案定義default_type application/octet-stream;gzip on :
開啟gzip壓縮輸出,減少網(wǎng)路傳輸。
gzip_min_length 1k?
設(shè)定允許壓縮的頁面最小位元組數(shù),頁面位元組數(shù)從header頭得content-length中取得。預(yù)設(shè)值是20。建議設(shè)定成大於1k的位元組數(shù),小於1k可能會越壓越大。
gzip_buffers 4 16k?
?設(shè)定係統(tǒng)取得幾個單位的快取用於儲存gzip的壓縮結(jié)果資料流。 4 16k代表以16k為單位,安裝原始資料大小以16k為單位的4倍申請記憶體。
gzip_http_version 1.0?
?用來識別http 協(xié)定的版本,早期的瀏覽器不支援Gzip 壓縮,使用者就會看到亂碼,所以為了支援前期版本加上了這個選項,如果你用了Nginx 的反向代理並期望也啟用Gzip 壓縮的話,由於末端通訊是http/1.0,故請設(shè)定為1.0。
gzip_comp_level 6?
?gzip壓縮比,1壓縮比最小處理速度最快,9壓縮比最大但處理速度最慢(傳輸快但比較消耗cpu)
gzip_types?
匹配mime類型進(jìn)行壓縮,無論是否指定,」text/html ”類型總是會被壓縮的。
gzip_proxied any?
?Nginx作為反向代理的時候啟用,決定開啟或關(guān)閉後端伺服器回傳的結(jié)果是否壓縮,符合的前提是後端伺服器必須傳回包含」Via」的 header頭。
gzip_vary on?
和http頭有關(guān)係,會在回應(yīng)頭加個 Vary: Accept-Encoding ,可以讓前端的快取伺服器快取經(jīng)過gzip壓縮的頁面,例如,用Squid快取經(jīng)過Nginx壓縮的資料。 。
server_names_hash_bucket_size 128;
保存伺服器名稱的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。參數(shù)hash bucket size總是等於hash表的大小,並且是一路處理器快取大小的倍數(shù)。在減少了在記憶體中的訪問次數(shù)後,使在處理器中加速查找hash表鍵值成為可能。如果hash bucket size等於一路處理器快取的大小,那麼在查找鍵的時候,最壞的情況下在記憶體中查找的次數(shù)為2。第一次是確定儲存單元的位址,第二次是在儲存單元中尋找鍵 值。因此,如果Nginx給出需要增加hash max size 或 hash bucket size的提示,那麼首要的是增大前一個參數(shù)的大小.
client_header_buffer_size 4k;
客戶端請求頭部的緩衝區(qū)大小。這個可以根據(jù)你的系統(tǒng)分頁大小來設(shè)置,一般一個請求的頭部大小不會超過1k,但由於一般系統(tǒng)分頁都要大於1k,所以這裡設(shè)置為分頁大小。分頁大小可以用指令getconf PAGESIZE取得。
large_client_header_buffers 8 128k;
客戶請求頭緩衝大小。 nginx預(yù)設(shè)會用client_header_buffer_size這個buffer來讀取header值,如果
header過大,它會使用large_client_header_buffers來讀取。
open_file_cache max=102400 inactive=20s;
這個指令指定快取是否啟用。同時也指定了快取最大數(shù)目,以及快取的時間。我們可以設(shè)定一個相對高的最大時間,這樣我們可以在它們不活動超過20秒後清除掉
open_file_cache_errors on | off?
預(yù)設(shè)值:open_file_cache_errors off 使用欄位:http, server, location ,這個指令指定是否在搜尋一個檔案是記錄cache錯誤.
open_file_cache_min_uses
語法:open_file_cache_min_uses number 預(yù)設(shè)值:open_file_cache_min_uses 1 使用欄位:http, server, location 這個指令指定了一定的時間範(fàn)圍內(nèi)的最小指令值檔案數(shù),如果使用更大的值,檔案描述子在cache總是開啟狀態(tài).
open_file_cache_valid
語法:open_file_cache_valid time 預(yù)設(shè)值:open_file_cache_valid 60 使用欄位:http, server, location 這個指令指定了何時需要檢查open_file_cache中快取項目的有效資訊.
client_max_body_size 300m;
設(shè)定透過nginx上傳檔案的大小
sendfile on;
指令是否開啟高效率檔案傳輸模式,sendfilesendinx使用者空間到核心空間的上下文切換。對於普通應(yīng)用程式設(shè)為 on,如果用來進(jìn)行下載等應(yīng)用磁碟IO重負(fù)載應(yīng)用,可設(shè)定為off,以平衡磁碟與網(wǎng)路I/O處理速度,降低系統(tǒng)的負(fù)載。
tcp_nopush on;
此選項允許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用
proxy_connect_timeout 90;?
proxy_read_timeout 180;連線成功後等候後端伺服器回應(yīng)時間,其實已經(jīng)進(jìn)入後端的排隊之中等候處理(也可以說是後端伺服器處理請求的時間)proxy_send_timeout 180;伺服器回傳時間,就是在規(guī)定時間之內(nèi)後端伺服器必須傳完所有的資料proxy_buffer_size 4k;設(shè)定從被代理伺服器讀取的第一部分應(yīng)答的緩衝區(qū)大小,通常情況下這部分應(yīng)答中包含一個小的應(yīng)答頭,預(yù)設(shè)這個值的大小為指令proxy_buffers中指定的一個緩衝區(qū)的大小,不過可以將其設(shè)定為更小proxy_buffers 4 32k;設(shè)定用於讀取應(yīng)答(來自被讀取應(yīng)答代理伺服器)的緩衝區(qū)數(shù)目和大小,預(yù)設(shè)情況也是分頁大小,根據(jù)作業(yè)系統(tǒng)的差異可能是4k或8kproxy_busy_buffers_size 64k;高負(fù)載下緩衝大?。╬roxy_buffers*2)高負(fù)載下緩衝大?。╬roxy_buffers*2)
當(dāng)快取被代理的伺服器回應(yīng)到臨時檔案時,這個選項限制每次寫臨時檔案的大小。 proxy_temp_path(可以在編譯的時候)指定寫到哪那個目錄。
proxy_temp_path /data0/proxy_temp_dir;
proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區(qū)
proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
#設(shè)定記憶體快取空間大小為200MB,1天沒有被快取的內(nèi)容自動快取。
keepalive_timeout 120;
長連接超時時間,單位是秒,這個參數(shù)很敏感,涉及瀏覽器的種類、後端伺服器的超時設(shè)定、作業(yè)系統(tǒng)的設(shè)置,可以另外起一片文章了。長連線要求大量小檔案的時候,可以減少重建連線的開銷,但假如有大檔案上傳,65s內(nèi)沒上傳完成會導(dǎo)致失敗。如果設(shè)定時間過長,用戶多,長時間保持連線會佔用大量資源。
send_timeout 120;
?用來指定回應(yīng)客戶端的逾時時間。這個逾時僅限於兩個連線活動之間的時間,如果超過這個時間,客戶端沒有任何活動,Nginx將會關(guān)閉連線。
tcp_nodelay on;
告訴nginx不要緩存數(shù)據(jù),而是一段一段的發(fā)送–當(dāng)需要及時發(fā)送數(shù)據(jù)時,就應(yīng)該給應(yīng)用設(shè)置這個屬性,這樣發(fā)送一小塊數(shù)據(jù)信息時就不能立即得到返回值。
client_body_buffer_size 512k;
如果把它設(shè)定為比較大的數(shù)值,例如256k,那麼,無論使用firefox還是IE瀏覽器,來提交任意小於256k的圖片,都很正常。如果註解該指令,使用預(yù)設(shè)的client_body_buffer_size設(shè)置,也就是作業(yè)系統(tǒng)頁面大小的兩倍,8k或16k,問題就出現(xiàn)了。
無論使用firefox4.0或IE8.0,提交一個比較大,200k左右的圖片,都回傳500 Internal Server Error錯誤
proxy_intercept_errors on;
表示使nginx阻止HTTPTPTP 。
upstream bakend {
server 127.0.0.1:8027;
server 127.0.0.1:8028;
server 127.0.0.1:8029;這個設(shè)計到負(fù)載平衡問題。
nginx的upstream目前支援以下種方式的分配
1、輪詢(預(yù)設(shè))
每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
2、weight
指定輪詢幾率,weight和存取比率成正比,用於後端伺服器效能不均的情況。
例如:
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15ip weight=100;分配,這樣每個訪客固定存取一個後端伺服器,可以解決session的問題。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server??端伺服器的回應(yīng)時間來分配請求,回應(yīng)時間短的優(yōu)先分配。
upstream backend {
server server1;
server server2;
fair;
}
5、url_hash(第三方)
}
5、url_hash(第三方)
}
5、url_hash(第三方)
}按訪問一個後端伺服器,後端伺服器為快取時比較有效。
例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數(shù),hash_method是使用的hash演算法
upstream backend {
server squid1:3128;
3
hash $request_uri;hash_method crc32;}#定義負(fù)載平衡設(shè)備的Ip及設(shè)備狀態(tài)upstream bakend{ip_hashdupstream bakend{ip_hash; .0.1: 8080 weight=2;server 127.0.0.1:6060;server 127.0.0.1:7070 backup;}在需要使用負(fù)載平衡的server中增加每個設(shè)備的狀態(tài)設(shè)定為:1.down表示單前的server暫時不參與負(fù)載2.weight為weight越大,負(fù)載的權(quán)重越大。 3.max_fails:允許請求失敗的次數(shù)預(yù)設(shè)為1.當(dāng)超過最大次數(shù)時,返回proxy_next_upstream模組定義的錯誤4.fail_timeout:max_fails次失敗後,暫停的時間。 5.backup: 其它所有的非backup機(jī)器down或忙碌的時候,請求backup機(jī)器。所以這臺機(jī)器壓力會最輕。 nginx支援同時設(shè)定多組的負(fù)載平衡,用來給不用的server來使用。 client_body_in_file_only設(shè)定為On 可以講client post過來的資料記錄到檔案中用來做debugclient_body_temp_path設(shè)定記錄檔的目錄可以設(shè)定最多3層目錄location對URL進(jìn)行比對.的代理負(fù)載平衡##配置虛擬機(jī)server{listen 80;設(shè)定監(jiān)聽埠?server_name image.***.com;設(shè)定監(jiān)聽埠?server_name image.***.com; mp3|exe)$ {正規(guī)表示式,以「mp3或exe」結(jié)尾的位址進(jìn)行負(fù)載平衡proxy_pass http://img_relay$request_uri;設(shè)定被代理伺服器的連接埠或套接字伺服器URLproxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;以上三行,目的是將代理伺服器收到的使用者的資訊傳送到真實伺服器上
}
location/face { "
rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;}#這裡牽涉Nginx的Rewrite規(guī)則問題,由於篇幅有限,下節(jié)再講 http ://img_relay$request_uri;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_p } }}
從上面也可以看出nginx.conf檔案的主要格式是:
events
{
http
{
? ......
? ? ?}? ?......}
?Nginx的配置是一大特色??梢灶惐萩ss檔案中樣式的定義,子元素會繼承父元素的樣式定義並且可以選擇是否覆蓋,nginx配置中同樣存在類似的繼承關(guān)係。
為理解nginx配置的繼承模型,需要知道nginx配置有好幾個區(qū)塊,一個區(qū)塊也被稱為一個上下文(context),例如在server上下文中定義的指令存放在server{}區(qū)塊中,http上下文中定義的指令存放在http{}區(qū)塊中。
在nginx中存在6種可能的上下文,順序由高到低依序是:
Global
Http
Server
默認(rèn)的繼承模型方向是低層繼承高層,而不是橫向或逆向。一個常見的場景是,重寫請求從一個location內(nèi)部跳到另一個location,那麼在第一個location區(qū)塊中定義的指令就會被忽略,而只有第二個location區(qū)塊中定義的指令在location context中有效,這裡只是簡單的提下。
其實Nginx配置不只是這些,還有其它的,畢竟Nginx有很多模組,每個模組可能又有些特殊的配置命令,這裡講得只是一些基本的配置信息,等學(xué)得,理解的更深刻後,再逐步補充吧,不正之處歡迎批評指涉!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

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

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

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

熱門話題

Docker 容器啟動步驟:拉取容器鏡像:運行 "docker pull [鏡像名稱]"。創(chuàng)建容器:使用 "docker create [選項] [鏡像名稱] [命令和參數(shù)]"。啟動容器:執(zhí)行 "docker start [容器名稱或 ID]"。檢查容器狀態(tài):通過 "docker ps" 驗證容器是否正在運行。

可以通過以下步驟查詢 Docker 容器名稱:列出所有容器(docker ps)。篩選容器列表(使用 grep 命令)。獲取容器名稱(位於 "NAMES" 列中)。

確認(rèn) Nginx 是否啟動的方法:1. 使用命令行:systemctl status nginx(Linux/Unix)、netstat -ano | findstr 80(Windows);2. 檢查端口 80 是否開放;3. 查看系統(tǒng)日誌中 Nginx 啟動消息;4. 使用第三方工具,如 Nagios、Zabbix、Icinga。

在 Docker 中創(chuàng)建容器: 1. 拉取鏡像: docker pull [鏡像名] 2. 創(chuàng)建容器: docker run [選項] [鏡像名] [命令] 3. 啟動容器: docker start [容器名]

問題:如何啟動 Nginx?答案:安裝 Nginx啟動 Nginx驗證 Nginx 是否已啟動探索其他啟動選項自動啟動 Nginx

NGINX和Apache各有優(yōu)劣,適合不同場景。 1.NGINX適合高並發(fā)和低資源消耗場景。 2.Apache適合需要復(fù)雜配置和豐富模塊的場景。通過比較它們的核心特性、性能差異和最佳實踐,可以幫助你選擇最適合需求的服務(wù)器軟件。

提升CentOS系統(tǒng)下PhpStorm性能的實用技巧本文提供多種方法,幫助您優(yōu)化CentOS系統(tǒng)中PhpStorm的性能,從而提高開發(fā)效率。在實施任何優(yōu)化措施前,請務(wù)必備份重要數(shù)據(jù)并在測試環(huán)境中驗證效果。一、系統(tǒng)級優(yōu)化精簡系統(tǒng)服務(wù):禁用不必要的系統(tǒng)服務(wù)和守護(hù)進(jìn)程,減少系統(tǒng)資源占用。無界面模式:如果不需要圖形界面,切換到無界面模式可顯著節(jié)省資源。卸載冗余軟件:移除不再使用的軟件包和服務(wù),釋放系統(tǒng)資源。二、PHP配置優(yōu)化啟用OPcache:安裝并配置OPcache擴(kuò)展,顯

NGINX和Apache都是強(qiáng)大的Web服務(wù)器,各自在性能、可擴(kuò)展性和效率上有獨特的優(yōu)勢和不足。 1)NGINX在處理靜態(tài)內(nèi)容和反向代理時表現(xiàn)出色,適合高並發(fā)場景。 2)Apache在處理動態(tài)內(nèi)容時表現(xiàn)更好,適合需要豐富模塊支持的項目。選擇服務(wù)器應(yīng)根據(jù)項目需求和場景來決定。
