十八般武藝之Nginx踩坑總結(jié)

顯示亂碼問題

server {
  listen 80;
  server_name example.com;
  root /var/www/example;

  location / {
    charset utf-8; #一般是在個別的location中加入此項左权,具體情況具體對待
    rewrite .* /index.html break;
  }
}

index顯示列表(一般為企業(yè)內(nèi)部使用)

可在在location server 或 http段中加入

autoindex on;//自動顯示目錄
autoindex_exact_size off;//人性化方式顯示文件大小否則以byte顯示
autoindex_localtime on;//按服務器時間顯示楼咳,否則以gmt時間顯示

location用法

=:對URI做精確匹配苛蒲;
    location = / {
        ...
    }
~:對URI做正則表達式模式匹配霞扬,區(qū)分字符大小寫撒顿;
~*:對URI做正則表達式模式匹配,不區(qū)分字符大小寫;
^~:對URI的左半部分做匹配檢查,不區(qū)分字符大小寫煤篙;
不帶符號:匹配起始于此uri的所有的url;
location /lizi {
        ...
    }
    例如www.example.com/lizi/xxx/xxx
    只要是路徑以/lizi開頭的都匹配毁腿,這種一般用于最后的通用匹配辑奈。

注意:匹配優(yōu)先級:=, ^~, ~/~*,不帶符號已烤;

具體匹配方式 http://seanlook.com/2015/05/17/nginx-location-rewrite/


常用優(yōu)化配置

1.網(wǎng)絡連接的優(yōu)化:

只能在events模塊設(shè)置鸠窗,用于防止在同一一個時刻只有一個請求的情況下,出現(xiàn)多個睡眠進程會被喚醒但只能有一個進程可獲得請求的尷尬草戈,如果不優(yōu)化塌鸯,在多進程的nginx會影響以部分性能侍瑟。

events {
accept_mutex on; #優(yōu)化同一時刻只有一個請求而避免多個睡眠進程被喚醒的設(shè)置唐片,on為防止被同時喚醒,默認為off涨颜,因此nginx剛安裝完以后要進行適當?shù)膬?yōu)化费韭。
}

2.隱藏ngxin版本號:

當前使用的nginx可能會有未知的漏洞,如果被黑客使用將會造成無法估量的損失庭瑰,但是我們可以將nginx的版本隱藏星持,如下:

server_tokens off; #在http 模塊當中配置

3.選擇事件驅(qū)動模型:

Nginx支持眾多的事件驅(qū)動,比如select弹灭、poll督暂、epoll揪垄,只能設(shè)置在events模塊中設(shè)置:

events {
accept_mutex on;
multi_accept on;
use epoll; #使用epoll事件驅(qū)動,因為epoll的性能相比其他事件驅(qū)動要好很多
}

4.配置單個工作進程的最大連接數(shù):

通過worker_connections number逻翁;進行設(shè)置饥努,numebr為整數(shù),number的值不能大于操作系統(tǒng)能打開的最大的文件句柄數(shù)八回,使用ulimit -n可以查看當前操作系統(tǒng)支持的最大文件句柄數(shù)酷愧,默認為為1024.

events {
    worker_connections  102400; #設(shè)置單個工作進程最大連接數(shù)102400
}

5.配置允許sendfile方式傳輸文件:

是由后端程序負責把源文件打包加密生成目標文件,然后程序讀取目標文件返回給瀏覽器缠诅;這種做法有個致命的缺陷就是占用大量后端程序資源溶浴,如果遇到一些訪客下載速度巨慢,就會造成大量資源被長期占用得不到釋放(如后端程序占用的CPU/內(nèi)存/進程等)管引,很快后端程序就會因為沒有資源可用而無法正常提供服務士败。通常表現(xiàn)就是 nginx報502錯誤,而sendfile打開后配合location可以實現(xiàn)有nginx檢測文件使用存在褥伴,如果存在就有nginx直接提供靜態(tài)文件的瀏覽服務拱烁,因此可以提升服務器性能.

    sendfile        on; #   可以配置在http、server或者location模塊噩翠,配置如下:
    sendfile_max_chunk 512k;   #Nginxg工作進程每次調(diào)用sendfile()傳輸?shù)臄?shù)據(jù)最大不能超出這個值戏自,默認值為0表示無限制,可以設(shè)置在http/server/location模塊中伤锚。

6.會話保持時間:

用戶和服務器建立連接后客戶端分配keep-alive鏈接超時時間擅笔,服務器將在這個超時時間過后關(guān)閉鏈接,我們將它設(shè)置低些可以讓ngnix持續(xù)工作的時間更長屯援,1.8.1默認為65秒猛们,一般不超過120秒。

 keepalive_timeout  65 60;  #后面的60為發(fā)送給客戶端應答報文頭部中顯示的超時時間設(shè)置為60s:如不設(shè)置客戶端將不顯示超時時間狞洋。
  Keep-Alive:timeout=60  #瀏覽器收到的服務器返回的報文

如果設(shè)置為0表示關(guān)閉會話保持功能弯淘,將如下顯示:
  Connection:close  #瀏覽器收到的服務器返回的報文

7.配置nginx worker進程最大打開文件數(shù)

worker_rlimit_nofile 65535;

8.配置nginx gzip壓縮實現(xiàn)性能優(yōu)化

圖片、視頻(流媒體)等文件盡量不要壓縮吉懊,因為這些文件大多都是經(jīng)過壓縮的庐橙,如果再壓縮很可能不會減小或減小很少,或者有可能增大借嗽,而在壓縮時還會消耗大量的CPU态鳖、內(nèi)存資源


gzip on;                               #表示開啟壓縮功能

gzip_min_length  1k;                 #表示允許壓縮的頁面最小字節(jié)數(shù),頁面字節(jié)數(shù)從header頭的Content-Length中獲取恶导。默認值是0浆竭,表示不管頁面多大都進行壓縮,建議設(shè)置成大于1K。如果小于1K可能會越壓越大

gzip_buffers     432k;                   #壓縮緩存區(qū)大小

gzip_http_version 1.1;                  #壓縮版本

gzip_comp_level 9;                    #壓縮比率

gzip_types  text/css text/xml application/javascript;  #指定壓縮的類型

gzip_vary on;                       #vary header支持

9.nginx expires功能

為用戶訪問網(wǎng)站的內(nèi)容設(shè)定一個過期時間邦泄,當用戶第一次訪問到這些內(nèi)容時删窒,會把這些內(nèi)容存儲在用戶瀏覽器本地,這樣用戶第二次及之后繼續(xù)訪問該網(wǎng)站顺囊,瀏覽器就會檢查已經(jīng)緩存在用戶瀏覽器本地的內(nèi)容易稠,就不會去瀏覽器下載了,直到緩存的內(nèi)容過期或者被清除為止包蓝。

## Add expires header according to URI(path or dir).

location ~ ^/(images|javascript|js|css|flash|media|static)/ {
    expires 360d;
}

常用正則(跟Linux上的正則沒什么區(qū)別)

. : 匹配除換行符以外的任意字符
? : 重復0次或1次
+ : 重復1次或更多次
* : 重復0次或更多次
\d :匹配數(shù)字
^ : 匹配字符串的開始
$ : 匹配字符串的結(jié)束
{n} : 重復n次
{n,} : 重復n次或更多次
[c] : 匹配單個字符c
[a-z] : 匹配a-z小寫字母的任意一個

類似分組():小括號()之間匹配的內(nèi)容驶社,可以在后面通過1來引用,2表示的是前面第二個()里的內(nèi)容测萎。正則里面容易讓人困惑的是\轉(zhuǎn)義特殊字符亡电。


rewrite實例

http {
    # 定義image日志格式
    log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
    # 開啟重寫日志
    rewrite_log on;

    server {
        root /home/www;

        location / {
                # 重寫規(guī)則信息
                error_log logs/rewrite.log notice;
                # 注意這里要用‘’單引號引起來,避免{}
                rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;
                # 注意不能在上面這條規(guī)則后面加上“l(fā)ast”參數(shù)硅瞧,否則下面的set指令不會執(zhí)行
                set $image_file $3;
                set $image_type $4;
        }

        location /data {
                # 指定針對圖片的日志格式份乒,來分析圖片類型和大小
                access_log logs/images.log mian;
                root /data/images;
                # 應用前面定義的變量。判斷首先文件在不在腕唧,不在再判斷目錄在不在或辖,如果還不在就跳轉(zhuǎn)到最后一個url里
                try_files /$arg_file /image404.html;
        }
        location = /image404.html {
                # 圖片不存在返回特定的信息
                return 404 "image not found\n";
        }
}

if語句塊

  • 例子是網(wǎng)上找的,if語句塊長用在做單獨的限制枣接,如限制訪問特定的資源颂暇,然后對此類請求做處理,rewire或者deny或者proxy_pass等等但惶。
  • 例子中的set語句沒怎么用過耳鸯。也沒再去查資料,用的時候再查 = =
if ($http_user_agent ~ MSIE) {proxy_pass
    rewrite ^(.*)$ /msie/$1 break;
} //如果UA包含"MSIE"膀曾,rewrite請求到/msid/目錄下

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
 } //如果cookie匹配正則县爬,設(shè)置變量$id等于正則引用部分

if ($request_method = POST) {
    return 405;
} //如果提交方法為POST,則返回狀態(tài)405(Method not allowed)添谊。return不能返回301,302

if ($slow) {
    limit_rate 10k;
} //限速财喳,$slow可以通過 set 指令設(shè)置

if (!-f $request_filename){
    break;
    proxy_pass  http://127.0.0.1;
} //如果請求的文件名不存在,則反向代理到localhost 斩狱。這里的break也是停止rewrite檢查

if ($args ~ post=140){
    rewrite ^ http://example.com/ permanent;
} //如果query string中包含"post=140"耳高,永久重定向到example.com

location ~* \.(gif|jpg|png|swf|flv)$ {
    valid_referers none blocked www.jefflei.com www.leizhenfang.com;
    if ($invalid_referer) {
        return 404;
    } //防盜鏈
}

https

  • 定義一個新的server,配置如下喊废,必須的配置有l(wèi)isten ,server_name, ssl ,ssl_certificate, ssl_certificate_key,一般配置的時候我都是直接復制祝高,然后改主機名,證書私鑰文件污筷,日志路徑,root的根目錄這幾項。
  • 如果想讓訪問80的轉(zhuǎn)到443瓣蛀,可用rewrite語句
listen 443;
server_name agent.t.jlhcar.com;

ssl on;
ssl_certificate, "/usr/local/certificate/agent.t.jlhcar.com.pem";\\證書
ssl_certificate_key "/usr/local/certificate/agent.t.jlhcar.com.key";\\私鑰
ssl_session_cache shared:SSL:1m;
ssl_session_timeout  10m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\\協(xié)議
...
//日志以及root根目錄的其他配置

server {
        listen 80;
        server_name agent.xxx.com;
        rewrite ^/(.*)$ https://agent.xxx.com/$1;
}

注意:曾經(jīng)遇到過這么一個坑陆蟆,http轉(zhuǎn)https的時候會將POST轉(zhuǎn)換為GET請求,此時需要這樣配置

server {
        listen 80;
        server_name dev-payment.xxxx.cn;
        return 307 https://dev-payment.xxxx.cn$request_uri;
}

php后端處理(fastcgi)

location ~ \.php($|/) {
        fastcgi_pass unix:/dev/shm/php-fpm.unix; //最重要的一項惋增,根據(jù)實際情況來配置(根據(jù)php的配置文件listen的配置來配置,其值可以是一個域名叠殷、IP地址:端口、或者是一個Unix的Socket文件诈皿。
)
        fastcgi_index index.php; //當請求以/結(jié)尾的時候林束,會將請求傳遞給所設(shè)置的index.php文件處理。


        fastcgi_split_path_info ^(.+\.php)(.*)$; //Nginx默認獲取不到PATH_INFO的值稽亏,得通過fastcgi_split_path_info指定定義的正則表達式來給$fastcgi_path_info賦值壶冒。


        fastcgi_param PATH_INFO $fastcgi_path_info; //
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi.conf;
}

示例鏈接:https://segmentfault.com/q/1010000010786459


負載均衡和反向代理

  • 在http配置段要配置一個upstream
upstream ucart{
    server 119.29.48.27:80;
    server 119.29.48.27:80;
}

注意:nginx中不識別_(下劃線),否則會出現(xiàn)400錯誤

然后再server配置段截歉,將所需要處理的請求反向代理至后端服務器胖腾,在可根據(jù)需要和服務器配置情況來定義權(quán)重,實現(xiàn)負載均衡

location /ucarapi/ {
    proxy_pass http://ucar_t/;
    proxy_connect_timeout   3; //連接超時時間
    proxy_read_timeout      30;
    proxy_set_header  Host tapi.51ucar.cn; //HTTP頭信息,后端服務器根據(jù)此來找到特定虛擬主機
    proxy_set_header X-Real-IP $remote_addr; //HTTP頭信息瘪松,真實IP
    proxy_set_header X-Scheme $scheme;
}

喜歡我寫的東西的朋友可以關(guān)注一下我的公眾號,上面有我的學習資源以及一些其他福利咸作。:Devops部落


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市宵睦,隨后出現(xiàn)的幾起案子记罚,更是在濱河造成了極大的恐慌,老刑警劉巖壳嚎,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毫胜,死亡現(xiàn)場離奇詭異,居然都是意外死亡诬辈,警方通過查閱死者的電腦和手機酵使,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焙糟,“玉大人口渔,你說我怎么就攤上這事〈┐椋” “怎么了缺脉?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長悦穿。 經(jīng)常有香客問我攻礼,道長,這世上最難降的妖魔是什么栗柒? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任礁扮,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘太伊。我一直安慰自己雇锡,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布僚焦。 她就那樣靜靜地躺著锰提,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芳悲。 梳的紋絲不亂的頭發(fā)上立肘,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音名扛,去河邊找鬼谅年。 笑死,一個胖子當著我的面吹牛罢洲,可吹牛的內(nèi)容都是我干的踢故。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惹苗,長吁一口氣:“原來是場噩夢啊……” “哼殿较!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起桩蓉,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤淋纲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后院究,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洽瞬,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年业汰,在試婚紗的時候發(fā)現(xiàn)自己被綠了伙窃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡样漆,死狀恐怖为障,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情放祟,我是刑警寧澤鳍怨,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站跪妥,受9級特大地震影響鞋喇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眉撵,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一侦香、第九天 我趴在偏房一處隱蔽的房頂上張望落塑。 院中可真熱鬧,春花似錦鄙皇、人聲如沸芜赌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至膘壶,卻和暖如春错蝴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颓芭。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工顷锰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亡问。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓官紫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親州藕。 傳聞我的和親對象是個殘疾皇子束世,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 大多數(shù) Nginx 新手都會頻繁遇到這樣一個困惑,那就是當同一個location配置塊使用了多個 Nginx 模塊...
    SkTj閱讀 7,710評論 0 12
  • Nginx簡介 解決基于進程模型產(chǎn)生的C10K問題,請求時即使無狀態(tài)連接如web服務都無法達到并發(fā)響應量級一萬的現(xiàn)...
    魏鎮(zhèn)坪閱讀 2,005評論 0 9
  • 《老男孩Linux運維》筆記 隱藏Nginx軟件版本號 一般來說床玻,軟件的漏洞都和版本有關(guān)毁涉。因此要盡量隱藏對訪問用戶...
    Zhang21閱讀 3,644評論 0 28
  • 1.簡介: ? Nginx:engine X ,2002年锈死,開源贫堰,商業(yè)版? http協(xié)議:web服務器(類似于ht...
    尛尛大尹閱讀 1,867評論 0 3
  • Page 1:nginx 服務器安裝及配置文件詳解 CentOS 6.2 x86_64 安裝 nginx 1.1 ...
    xiaojianxu閱讀 8,539評論 1 41