Nginx常用配置【入門級】

title: Nginx常用配置【入門級】
date: 2018年10月22日
categories: 技術(shù)
tags: [Nginx]
author: 夏天(tian.xia)
top: false


推薦閱讀人群:@nginx零基礎(chǔ)的小伙伴們??

nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev.

如官網(wǎng)所說:nginx是一個HTTP和反向代理服務(wù)器档桃、郵件代理服務(wù)器,也是一個通用的TCP/UDP代理服務(wù)器,最初由俄羅斯人Igor Sysoev編寫夷蚊。

nginx的功能有很多郭膛,本文旨在讓零基礎(chǔ)的小伙伴可以搭起nginx服務(wù)并進行一些常用的配置横堡。

一粪薛、nginx安裝

  • Homebrew安裝:brew install nginx
  • 源碼編譯安裝:可以參考官網(wǎng)掘宪,以下是我在服務(wù)器上源碼安裝的過程「環(huán)境:CentOS-7」
    • 源碼包安裝略復雜穴肘,其實如果只用到nginx的基本配置歇盼,那簡單安裝就夠了,可以略過以下安裝步驟直接往后看哦??
  1. 官網(wǎng)下載nginx源碼包
    wget http://nginx.org/download/nginx-1.15.5.tar.gz

  2. 解壓
    tar -zxvf /root/Desktop/nginx-1.15.5.tar.gz -C /usr/local/src/

    • tar -C 指定解壓目錄為 /usr/local/src/
  3. 安裝
    正式開始前评抚,編譯環(huán)境gcc gcc-c++豹缀、開發(fā)庫之類的需要提前裝好

  1. 安裝gcc gcc-c++yum install -y gcc gcc-c++
  2. 安裝pcre:PCRE(Perl Compatible Regular Expressions即perl語言兼容正則表達式),是一個Perl庫慨代,包括 perl 兼容的正則表達式庫邢笙,作用是使nginx支持HTTP Rewrite模塊,讓nginx能夠兼容正則表達式侍匙,實現(xiàn)正則匹配氮惯。
wget "https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz"
tar -zxvf pcre-8.41.tar.gz -C /usr/local/src/
cd /usr/local/src/pcre-8.41
./configure 
#./configure是源代碼安裝的第一步,主要作用是對即將安裝的軟件進行配置丈积,檢查當前的環(huán)境是否滿足要安裝軟件的依賴關(guān)系
#編譯
make
#編譯安裝
make install 

? 3) 安裝zlib:為了支持gzip壓縮筐骇。

wget "http://zlib.net/zlib-1.2.11.tar.gz"
tar -zxvf zlib-1.2.11.tar.gz -C /usr/local/src/
cd /usr/local/src/zlib-1.2.11
./configure
make && make install

? 4) 安裝ssl

wget "https://www.openssl.org/source/openssl-1.1.1.tar.gz"
tar -zxvf openssl-1.1.1.tar.gz -C /usr/local/src/
cd /usr/local/src/openssl-1.1.1
./config
make && make install

? 5) 安裝Nginx

cd /usr/local/src/nginx-1.15.5/
./configure --prefix=/usr/local/webserver/nginx --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.41 --with-zlib=/usr/local/src/zlib-1.2.11 --with-openssl=/usr/local/src/openssl-1.1.1
# --prefix:指定安裝路徑,指定了路徑后就不會一團糟啦
make && make install
  • 安裝目錄:
    - conf:里面是各種配置文件
    - html:一些頁面(404,50X…)
    - logs:日志文件
    - sbin:sbin目錄下有一個nginx江滨,代表nginx應(yīng)用程序铛纬,啟動nginx時,需要進入sbin目錄下唬滑,啟動sbin目錄下的nginx可執(zhí)行文件

二告唆、nginx的啟停

首先進入nginx安裝目錄cd /usr/local/webserver/nginx/

  1. 啟動nginx ./sbin/nginx -c conf/nginx.conf
  • -c 指定配置文件,不指定則使用默認配置文件/usr/local/webserver/nginx/conf/nginx.conf
  1. 重新加載nginx ./sbin/nginx -s reload
  2. 停止nginx ./sbin/nginx -s stop
  3. 驗證nginx是否啟動 ps -ef | grep nginx

三晶密、配置文件結(jié)構(gòu)

  • 安裝完成后擒悬,在/usr/local/webserver/nginx/conf目錄下有一個默認的配置文件nginx.conf,打開乍一看上去很多內(nèi)容稻艰,我把主要內(nèi)容抽象出來就明朗很多了懂牧,這樣一個配置文件就可以滿足我們一些簡單的功能:
# nginx進程數(shù)(最合適的數(shù)值是cpu的核數(shù))
worker_processes  1;
# 工作模式與連接數(shù)上線
events {
    #設(shè)置單個進程最大連接數(shù)
    worker_connections  1024;
}
# http服務(wù)器配置部分
http {
    # 虛擬主機的配置部分
    server {
        # 監(jiān)聽端口
        listen       8080;
        # 域名(可以有多個,空格隔開)
        server_name  localhost;
        # URL匹配配置部分,支持正則表達式,if條件判斷匹配
        location / {
            # 設(shè)置網(wǎng)頁的根目錄
            root   html;
            # 默認首頁地址
            index  index.html index.htm;
        }
    server {

    }   
}

圖示:


image.png

大致可分如下四部分:
main(全局配置)僧凤、server(主機配置)畜侦、upstream(負載均衡配置)、location(URL匹配特定位置的配置)躯保。

  • main部分配置的指令將會影響其他所有設(shè)置旋膳;
  • server部分的配置主要用于指定主機和端口;
  • upstream部分的配置用于負載均衡途事,設(shè)置一系列的后端服務(wù)器验懊;
  • location部分的配置用于匹配url;
  • 它們四大塊配置的繼承關(guān)系是:server繼承main的尸变,location繼承server的义图,upstream既不繼承其他配置也不會被繼承。

四振惰、常用配置

以下歌溉,是說起nginx,大家腦海中可能會立刻閃現(xiàn)出的一些名詞骑晶,我就由此入手痛垛,說一下如何進行配置:

反向代理

反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受internet上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器桶蛔,并將從服務(wù)器上得到的結(jié)果返回給internet上請求連接的客戶端匙头,此時代理服務(wù)器對外就表現(xiàn)為一個反向代理服務(wù)器。

??:
以YouTube為例仔雷,由于YouTube的訪問量很大蹂析,為了一系列目的,他有很多臺服務(wù)器碟婆,這時就需要代理服務(wù)器把來自各個客戶端的請求(或者客戶端通過正向代理服務(wù)器發(fā)出的請求)代理到某臺服務(wù)器上电抚。這個中間服務(wù)器就是反向代理服務(wù)器。反向代理的特點是客戶端不知道他最終訪問的是哪個服務(wù)器竖共。

  • nginx反向代理基礎(chǔ)配置:
worker_processes 1;
events {
    worker_connections 1024;
}   
http {
    server {
        listen    80;
        location / {
            #打到這個nginx服務(wù)的請求 全被反向代理到https://github.com
            proxy_pass  https://github.com/;
        }
    }
}

提及反向代理蝙叛,就連帶也說一下正向代理吧

正向代理,意思是一個位于客戶端和原始服務(wù)器(origin server)之間的服務(wù)器公给,為了從原始服務(wù)器取得內(nèi)容借帘,客戶端向代理發(fā)送一個請求并指定目標(原始服務(wù)器),然后代理向原始服務(wù)器轉(zhuǎn)交請求并將獲得的內(nèi)容返回給客戶端淌铐。

??:vpn就是典型的正向代理
還以YouTube為例肺然,我(也就是客戶端)想要訪問YouTube,但是由于YouTube被中國國家防火墻拒之門外腿准,我們無法直接訪問到际起。那我們可以翻墻到國外一個可以訪問YouTube的服務(wù)器,通過這個服務(wù)器去訪問YouTube ,那這個中間服務(wù)器做的就是正向代理加叁。正向代理的特點是服務(wù)器端不會知道最初是哪里來訪問的倦沧。

負載均衡

  • 為什么需要負載均衡唇撬?
    服務(wù)器訪問量越大它匕,壓力就越大,甚至會奔潰窖认。為了避免服務(wù)器崩潰豫柬,采用負載均衡的方式,分擔服務(wù)器的壓力扑浸。
  • Nginx負載均衡的實現(xiàn)
    • Nginx是通過反向代理實現(xiàn)負載均衡的烧给。使用nginx實現(xiàn)負載均衡,用戶會首先訪問到nginx服務(wù)器喝噪,nginx服務(wù)器從服務(wù)器集群待選列表中按照某種規(guī)則選擇一臺服務(wù)器础嫡,將該請求引到這臺服務(wù)器上
    • Nginx會把服務(wù)器集群中崩潰的服務(wù)器從待選列表中刪除,保證不會分配給用戶訪問到
    • HTTP upstream模塊:nginx服務(wù)器的一個重要模塊酝惧。實現(xiàn)客戶端ip和后端ip之間的負載均衡 榴鼎。從待選服務(wù)器列表中選取服務(wù)器的方法:默認使用輪詢算法。
    • ??:touch upstream_demo.conf 寫入如下配置
user nobody;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    #設(shè)置待負載均衡的服務(wù)器列表
    upstream summer {
        #server指令:用來指定服務(wù)器的IP地址(后面要寫IP地址晚唇,而不是域名)支持加參數(shù)weight(權(quán)重),權(quán)重值越大巫财,被訪問到的概率就越大,不寫weight 權(quán)重默認是1
        server 192.168.1.7:80 weight=2;
        server 192.168.1.17:80 weight=1;
    }
    server {
        listen       8080;
        location / {
            # 指定一個服務(wù)器列表哩陕,要與上面upstream后起的名對應(yīng)上
            proxy_pass http://summer;
        }
    }
}
  • nginx支持的負載均衡策略:
    1. 輪詢(default):每個請求按時間順序逐一分配到不同的后端服務(wù)器平项。
    2. 加權(quán)輪詢:指定輪詢幾率,weight和訪問比率成正比悍及,用于后端服務(wù)器性能不均的情況闽瓢。
    3. ip_hash:每個請求按訪問ip的hash結(jié)果分配,這樣每個訪客固定訪問一個后端服務(wù)器心赶,可以解決session的問題扣讼。
    4. fair按后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配园担。
    5. url_hash按訪問url的hash結(jié)果來分配請求届谈,使每個url定向到同一個后端服務(wù)器,后端服務(wù)器為緩存時比較有效弯汰。

location

  • 語法:location [ = | ~ | ~* | ^~ ] uri { ... }
  • 作用域:server, location
  • ??:
location = / {
    # 精確匹配 / 艰山,主機名后面不能帶任何字符串
    [ configuration A ]
}

location / {
    # 因為所有的地址都以 / 開頭,所以這條規(guī)則將匹配到所有請求
    # 但是最長字符優(yōu)先匹配
    [ configuration B ]
}

location /documents/ {
    # 匹配任何以 /documents/ 開頭的地址咏闪,匹配符合以后曙搬,還要繼續(xù)往下搜索
    # 只有后面的正則表達式?jīng)]有匹配到時,這一條才會采用這一條
    [ configuration C ]
}

location ^~ /images/ {
    # 匹配任何以 /images/ 開頭的地址,匹配符合以后纵装,停止往下搜索正則征讲,采用這一條。
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    # 匹配所有以 .gif,.jpg或.jpeg 結(jié)尾的請求
    # 然而橡娄,所有請求 /images/ 下的圖片會被[configuration D]處理
    [ configuration E ]
}
# = 表示精確匹配诗箍。如 A 中只匹配根目錄結(jié)尾的請求,后面不能帶任何字符串挽唉;
# ^~ 表示uri以某個常規(guī)字符串開頭滤祖,不是正則匹配;
# ~ 表示區(qū)分大小寫的正則匹配瓶籽;
# ~* 表示不區(qū)分大小寫的正則匹配匠童;
# / 通用匹配, 如果沒有其它匹配,任何請求都會匹配到。
# 優(yōu)先級排序: 精確匹配 location =, location完整路徑, location ^~, (location ~, location ~*正則匹配的優(yōu)先級會根據(jù)location寫的先后順序) , location 部分前綴匹配, 通用匹配location /

rewrite

  1. rewrite簡介
  • rewrite功能:使用PERL標準正則和標志位實現(xiàn)url重寫或重定向塑顺。
  • 作用域:server, location, if
  • 語法格式:rewrite regex replacement [flag];
  1. flag標志位
  • last : 相當于Apache的[L]標記汤求,表示完成rewrite,將rewrite后的地址重新在server標簽執(zhí)行严拒;
  • break : 停止執(zhí)行當前虛擬主機的后續(xù)rewrite指令集扬绪,將rewrite后地址重新在當前的location標簽執(zhí)行;
  • redirect : 返回302臨時重定向糙俗,通知客戶端重定向到rewrtie后面的地址勒奇,地址欄會顯示跳轉(zhuǎn)后的地址
  • permanent : 返回301永久重定向,通知客戶端永久重定向到rewrtie后面的地址巧骚,地址欄會顯示跳轉(zhuǎn)后的地址
  1. if指令
  • 作用域:server赊颠,location
  • if指令不支持嵌套,不支持 &&|| 的處理
  • if中可以填入的表達式
    (1)變量名:變量值為空劈彪,或者是以0開頭的字符串會當作false
    (2)變量比較可以使用=!=
    (3)可以匹配正則表達式竣蹦,~表示匹配區(qū)分大小寫 ~* 表示匹配不區(qū)分大小寫
    (4)!~!~* 表示取反(不匹配),和上一條正好相反
    (5)-f!-f 判斷本地可訪問的文件是否存在
    (5)-d!-d 判斷本地可訪問的路徑是否存在
    (6)-e!-e 判斷本地可訪問的文件或路徑是否存在
    (7)-x!-x 判斷本地可訪問的文件是否可執(zhí)行
    (8)部分正則表達式可以使用模式沧奴,模式的取值可以用$1...$n進行取值
    ??:
if ($request_method = POST) {
    return 405;
} //如果請求方法為POST痘括,則返回狀態(tài)405(Method not allowed)。

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

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

五疮绷、總結(jié)

相信看完本文翰舌,大家對nginx都有了初步的了解,也可以輕松搭起Nginx服務(wù)并進行一些常用的配置了吧冬骚。其實Nginx是一個非常輕便好用的工具椅贱,對它稍做了解就會發(fā)現(xiàn)懂算,工作中的很多事情可以用Nginx解決呢。我就先拋出這塊兒磚庇麦,希望能引出大佬們對Nginx深層次计技、多方面的分享 ??

六、參考資料

七山橄、附錄:

  1. nginx常用指令:
  • nginx -V 查看版本垮媒,以及配置文件地址
  • nginx -v 查看nginx版本
  • nginx -c filename 指定配置文件
  • nginx -h 幫助
  • nginx -s reload|reopen|stop|quit 重新加載配置|重啟|停止|退出nginx
  • nginx -t 測試nginx.conf配置是否有語法錯誤
  1. nginx部分常用變量(ps:想了解全部點這里
  • $args : #這個變量等于請求行中的參數(shù),同$query_string

  • $content_length : 請求頭中的Content-length字段驾胆。

  • $content_type : 請求頭中的Content-Type字段涣澡。

  • $document_root : 當前請求在root指令中指定的值。

  • $host : 請求主機頭字段丧诺,否則為服務(wù)器名稱。

  • $http_user_agent : 客戶端agent信息

  • $http_cookie : 客戶端cookie信息

  • $limit_rate : 這個變量可以限制連接速率奄薇。

  • $request_method : 客戶端請求的動作驳阎,通常為GET或POST。

  • $remote_addr: 客戶端的IP地址馁蒂。

  • $remote_port : 客戶端的端口呵晚。

  • $remote_user : 已經(jīng)經(jīng)過Auth Basic Module驗證的用戶名。

  • $request_filename : 當前請求的文件路徑沫屡,由root或alias指令與URI請求生成饵隙。

  • $scheme : HTTP方法(如http,https)沮脖。

  • $server_protocol : 請求使用的協(xié)議金矛,通常是HTTP/1.0或HTTP/1.1。

  • $server_addr : 服務(wù)器地址勺届,在完成一次系統(tǒng)調(diào)用后可以確定這個值驶俊。

  • $server_name : 服務(wù)器名稱。

  • $server_port: 請求到達服務(wù)器的端口號免姿。

  • $request_uri : 包含請求參數(shù)的原始URI饼酿,不包含主機名。
    ??:

    以這個url為例:http://localhost:8080/pic/baby/1.png

    • $host:localhost

    • $server_port:8080

    • $request_uri:/pic/baby/1.png

    • $document_root:/var/www/html

    • $request_filename:/var/www/html/pic/baby/1.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胚膊,一起剝皮案震驚了整個濱河市故俐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌紊婉,老刑警劉巖药版,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肩榕,居然都是意外死亡刚陡,警方通過查閱死者的電腦和手機惩妇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筐乳,“玉大人歌殃,你說我怎么就攤上這事◎疲” “怎么了氓皱?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長勃刨。 經(jīng)常有香客問我波材,道長,這世上最難降的妖魔是什么身隐? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任廷区,我火速辦了婚禮,結(jié)果婚禮上贾铝,老公的妹妹穿的比我還像新娘隙轻。我一直安慰自己,他們只是感情好垢揩,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布玖绿。 她就那樣靜靜地躺著,像睡著了一般叁巨。 火紅的嫁衣襯著肌膚如雪斑匪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天锋勺,我揣著相機與錄音蚀瘸,去河邊找鬼。 笑死宙刘,一個胖子當著我的面吹牛苍姜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悬包,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼衙猪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了布近?” 一聲冷哼從身側(cè)響起垫释,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撑瞧,沒想到半個月后棵譬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡预伺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年订咸,在試婚紗的時候發(fā)現(xiàn)自己被綠了曼尊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡脏嚷,死狀恐怖骆撇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情父叙,我是刑警寧澤神郊,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站趾唱,受9級特大地震影響涌乳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甜癞,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一夕晓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧带欢,春花似錦运授、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柒室。三九已至渡贾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雄右,已是汗流浹背空骚。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留擂仍,地道東北人囤屹。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像逢渔,于是被迫代替她去往敵國和親肋坚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361