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的基本配置歇盼,那簡單安裝就夠了,可以略過以下安裝步驟直接往后看哦??
從官網(wǎng)下載nginx源碼包
wget http://nginx.org/download/nginx-1.15.5.tar.gz
-
解壓
tar -zxvf /root/Desktop/nginx-1.15.5.tar.gz -C /usr/local/src/
- tar -C 指定解壓目錄為
/usr/local/src/
- tar -C 指定解壓目錄為
安裝
正式開始前评抚,編譯環(huán)境gcc
gcc-c++
豹缀、開發(fā)庫之類的需要提前裝好
- 安裝
gcc
gcc-c++
:yum install -y gcc gcc-c++
- 安裝
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/
- 啟動nginx
./sbin/nginx -c conf/nginx.conf
- -c 指定配置文件,不指定則使用默認配置文件/usr/local/webserver/nginx/conf/nginx.conf
- 重新加載nginx
./sbin/nginx -s reload
- 停止nginx
./sbin/nginx -s stop
- 驗證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 {
}
}
圖示:
大致可分如下四部分:
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支持的負載均衡策略:
- 輪詢(default):每個請求按時間順序逐一分配到不同的后端服務(wù)器平项。
- 加權(quán)輪詢:指定輪詢幾率,weight和訪問比率成正比悍及,用于后端服務(wù)器性能不均的情況闽瓢。
- ip_hash:每個請求按訪問ip的hash結(jié)果分配,這樣每個訪客固定訪問一個后端服務(wù)器心赶,可以解決session的問題扣讼。
- fair按后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配园担。
- 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
- rewrite簡介
- rewrite功能:使用PERL標準正則和標志位實現(xiàn)url重寫或重定向塑顺。
- 作用域:
server
,location
,if
- 語法格式:
rewrite regex replacement [flag];
- 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)后的地址
-
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深層次计技、多方面的分享 ??
六、參考資料
七山橄、附錄:
- nginx常用指令:
-
nginx -V
查看版本垮媒,以及配置文件地址 -
nginx -v
查看nginx版本 -
nginx -c
filename 指定配置文件 -
nginx -h
幫助 -
nginx -s reload|reopen|stop|quit
重新加載配置|重啟|停止|退出nginx -
nginx -t
測試nginx.conf配置是否有語法錯誤
- 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