nginx 安裝配置使用
nginx 安裝
命令列安裝
sudo apt-get install nginx
安裝好的檔案位置
/usr/sbin/nginx:主程式
/etc/nginx:存放配置檔案
/usr/share/nginx:存放靜態檔案
/var/log/nginx:存放日誌
開始建立自己的conf檔案
cd /etc/nginx/conf.d
在此目錄下建立自己的配置檔案
配置
nginx.conf配置檔案,基本就分為以下幾塊:
main events { .... } http { .... upstream myproject { ..... } server { .... location { .... } } server { .... location { .... } } .... }
nginx配置檔案主要分為六個區域:
- main(全域性設定)
- events(nginx工作模式)
- http(http設定)
- sever(主機設定)
- location(URL匹配)
- upstream(負載均衡伺服器設定)
下面依次來看下具體內容
-
main模組
下面時一個main區域,他是一個全域性的設定:
user nobody nobody; worker_processes 2; error_log /usr/local/var/log/nginx/error.log notice; pid /usr/local/var/run/nginx/nginx.pid; worker_rlimit_nofile 1024;
user 來指定Nginx Worker程序執行使用者以及使用者組,預設由nobody賬號執行。
worker_processes來指定了Nginx要開啟的子程序數。每個Nginx程序平均耗費10M~12M記憶體。根據經驗,一般指定1個程序就足夠了,如果是多核CPU,建議指定和CPU的數量一樣的程序數即可。我這裡寫2,那麼就會開啟2個子程序,總共3個程序。
error_log用來定義全域性錯誤日誌檔案。日誌輸出級別有debug、info、notice、warn、error、crit可供選擇,其中,debug輸出日誌最為最詳細,而crit輸出日誌最少。
pid用來指定程序id的儲存檔案位置。
worker_rlimit_nofile用於指定一個nginx程序可以開啟的最多檔案描述符數目,這裡是65535,需要使用命令“ulimit -n 65535”來設定。
-
events 模組
events模組來用指定nginx的工作模式和工作模式及連線數上限,一般是這樣:
events {
use epoll; #Linux平臺
worker_connections 1024;
}
use用來指定Nginx的工作模式。Nginx支援的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是標準的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平臺上,而kqueue用在BSD系統中,對於Linux系統,epoll工作模式是首選。
worker_connections用於定義Nginx每個程序的最大連線數,即接收前端的最大請求數,預設是1024。最大客戶端連線數由worker_processes和worker_connections決定,即Max_clients=worker_processes*worker_connections,在作為反向代理時,Max_clients變為:Max_clients = worker_processes * worker_connections/4。 程序的最大連線數受Linux系統程序的最大開啟檔案數限制,在執行作業系統命令“ulimit -n 65536”後worker_connections的設定才能生效。
-
http 模組
http模組可以說是最核心的模組了,它負責HTTP伺服器相關屬性的配置,它裡面的server和upstream子模組,至關重要,等到反向代理和負載均衡以及虛擬目錄等會仔細說。
http{
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /usr/local/var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 10;
#gzip on;
upstream myproject {
.....
}
server {
....
}
}
下面詳細介紹下這段程式碼中每個配置選項的含義。
include 來用設定檔案的mime型別,型別在配置檔案目錄下的mime.type檔案定義,來告訴nginx來識別檔案型別。
default_type設定了預設的型別為二進位制流,也就是當檔案型別未定義時使用這種方式,例如在沒有配置asp 的locate 環境時,Nginx是不予解析的,此時,用瀏覽器訪問asp檔案就會出現下載了。
log_format用於設定日誌的格式,和記錄哪些引數,這裡設定為main,剛好用於access_log來紀錄這種型別。
sendfile引數用於開啟高效檔案傳輸模式。將tcp_nopush和tcp_nodelay兩個指令設定為on用於防止網路阻塞。
keepalive_timeout設定客戶端連線保持活動的超時時間。在超過這個時間之後,伺服器會關閉該連線。
-
server 模組
sever 模組是http的子模組,它用來定一個虛擬主機,我們先講最基本的配置,這些在後面再講。
我們看一下一個簡單的server 是如何做的?
server {
listen 8080;
server_name localhost 192.168.12.10 www.yangyi.com;
# 全域性定義,如果都是這一個目錄,這樣定義最簡單。
root /Users/yangyi/www;
index index.php index.html index.htm;
charset utf-8;
access_log usr/local/var/log/host.access.log main;
aerror_log usr/local/var/log/host.error.log error;
....
}
server標誌定義虛擬主機開始。
listen用於指定虛擬主機的服務埠。
server_name用來指定IP地址或者域名,多個域名之間用空格分開。
root 表示在這整個server虛擬主機內,全部的root web根目錄。注意要和locate {}下面定義的區分開來。
index 全域性定義訪問的預設首頁地址。注意要和locate {}下面定義的區分開來。
charset用於設定網頁的預設編碼格式。
access_log用來指定此虛擬主機的訪問日誌存放路徑,最後的main用於指定訪問日誌的輸出格式。
-
location 模組
location模組是nginx中用的最多的,也是最重要的模組了,什麼負載均衡啊、反向代理啊、虛擬域名啊都與它相關。
location 根據它字面意思就知道是來定位的,定位URL,解析URL,所以,它也提供了強大的正則匹配功能,也支援條件判斷匹配,使用者可以通過location指令實現Nginx對動、靜態網頁進行過濾處理。
location /表示匹配訪問根目錄。
root指令用於指定訪問根目錄時,虛擬主機的web目錄,這個目錄可以是相對路徑(相對路徑是相對於nginx的安裝目錄)。也可以是絕對路徑。
#反向代理配置
location /itcast/ {
proxy_pass http://127.0.0.1:12345;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header Host $http_host;
}
#採用uwsgi方式
location /python/ {
include uwsgi_params;
uwsgi_pass 127.0.0.1:33333;
}
#訪問nginx本機目錄的檔案
location / {
root /home/itcast/xwp/itcast/;
index index.html index.htm;
}
location /static/ {
alias /var/static/;
}
-
upstram 模組
upstream 模組負債負載均衡模組,通過一個簡單的排程演算法來實現客戶端IP到後端伺服器的負載均衡。
upstream test.com{
ip_hash;
server 192.168.123.1:80;
server 192.168.123.2:80 down;
server 192.168.123.3:8080 max_fails=3 fail_timeout=20s;
server 192.168.123.4:8080;
}
在上面的例子中,通過upstream指令指定了一個負載均衡器的名稱test.com。這個名稱可以任意指定,在後面需要的地方直接呼叫即可。
裡面是ip_hash這是其中的一種負載均衡排程演算法。
Nginx的負載均衡模組目前支援4種排程演算法:
- weight 輪詢(預設)。每個請求按時間順序逐一分配到不同的後端伺服器,如果後端某臺伺服器宕機,故障系統被自動剔除,使使用者訪問不受影響。weight。指定輪詢權值,weight值越大,分配到的訪問機率越高,主要用於後端每個伺服器效能不均的情況下。
- ip_hash。每個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個後端伺服器,有效解決了動態網頁存在的session共享問題。
- fair。比上面兩個更加智慧的負載均衡演算法。此種演算法可以依據頁面大小和載入時間長短智慧地進行負載均衡,也就是根據後端伺服器的響應時間來分配請求,響應時間短的優先分配。Nginx本身是不支援fair的,如果需要使用這種排程演算法,必須下載Nginx的upstream_fair模組。
- url_hash。按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,可以進一步提高後端快取伺服器的效率。Nginx本身是不支援url_hash的,如果需要使用這種排程演算法,必須安裝Nginx 的hash軟體包。
在HTTP Upstream模組中,可以通過server指令指定後端伺服器的IP地址和埠,同時還可以設定每個後端伺服器在負載均衡排程中的狀態。常用的狀態有:
down,表示當前的server暫時不參與負載均衡。
backup,預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,才會請求backup機器,因此這臺機器的壓力最輕。
max_fails,允許請求失敗的次數,預設為1。當超過最大次數時,返回proxy_next_upstream 模組定義的錯誤。
fail_timeout,在經歷了max_fails次失敗後,暫停服務的時間。max_fails可以和fail_timeout一起使用。
注意 當負載排程演算法為ip_hash時,後端伺服器在負載均衡排程中的狀態不能是weight和backup。
備註: nginx的worker_rlimit_nofile達到上限時,再有客戶端連結報502錯誤. 用了log_format指令設定了日誌格式之後,需要用access_log指令指定日誌檔案的存放路徑.
反向代理
正向代理,也就是傳說中的代理,他的工作原理就像一個跳板,簡單的說,我是一個使用者,我訪問不了某網站,但是我能訪問一個代理伺服器,這個代理伺服器呢,他能訪問那個我不能訪問的網站,於是我先連上代理伺服器,告訴他我需要那個無法訪問網站的內容,代理伺服器去取回來,然後返回給我。 從網站的角度,只在代理伺服器來取內容的時候有一次記錄,有時候並不知道是使用者的請求,也隱藏了使用者的資料,這取決於代理告不告訴網站。結論就是,正向代理 是一個位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設定才能使用正向代理。
反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器。
負載均衡
負載均衡是由多臺伺服器以對稱的方式組成一個伺服器集合,每臺伺服器都具有等價的地位,都可以單獨對外提供服務而無須其他伺服器的輔助。通過某種負載分擔技術,將外部發送來的請求按照事先設定分配演算法分配到對稱結構中的某一臺伺服器上,而接收到請求的伺服器獨立地迴應客戶的請求。
均衡負載能夠平均分配客戶請求到伺服器列陣,籍此提供快速獲取重要資料,解決大量併發訪問服務問題。
1.upstream塊
upstream name {...}
配置塊 http
upstream塊定義一個上游伺服器的叢集,便於反向代理中的proxy_pass使用
upstream mynet{
server www.wopai1.com;
server www.wopai2.com;
server www.wopai3.com;
}
server {
location /{
proxy_pass http://mynet;
}
}
2.server
server name [paramenters]
配置塊upstream
server配置項指定了一臺上游伺服器的名字,可以是域名 IP地址埠 UNIX控制代碼
weight= number;設定向這臺伺服器轉發的權重,預設為1
max_fails=number;該選項域fail_timeout配合使用
指在fail_timeout時間段內如果轉發上游失敗超過number次就認為當前的fail_timeout時間內
這臺伺服器不可用,max_fails預設為1 如果設定為0 表示不檢查失敗次數
fail_timeout=time; fail_timeout表示該時間內轉發多少次失敗後就認為上游不可用.預設10s
down 表示上游伺服器永久下線,只能在ip_hash配置時才有效
backup 在ip_hash配置時無效.只有所有非備份機都失敗,才向上遊備份伺服器轉發請求.
upstream mynet{
server www.wopai1.com weight=5;
server www.wopai2.com:8081 max_fails=3 fail_timeout=300s;
server www.wopai2.com down;
}
3. ip_hash
配置塊 upstream
希望來自某一個使用者的請求始終落在固定的一臺伺服器上進行處理.
根據客戶端的IP雜湊計算出一個key,將key按照upstream叢集中的上游伺服器進行取模,求得的值對應的主機接收轉發請求.
ip_hash不可以與weight同時使用
如果upstream配置中有一臺伺服器暫時不可用,不能直接刪除該配置,而應該使用down標識.
upstream mynet{
ip_hash;
server www.wowpai1.top;
server www.wowpai2.top;
server www.wowpai3.top down;
}
例子,伺服器負載均衡基本配置,nginx中可以進行負載均衡的相關設定:
upstream my.net{ #my.net是自定義的命名 在server結構中引用即可
#代理伺服器為 兩臺機器192.168.22.136 192.168.22.147做負載均衡操作
#兩臺機器上 可以跑apache負載功能更為強大的網頁相關任務
#max_fails 表示嘗試出錯最大次數 即可認為該伺服器 在fail_timeout時間內不可用
# server servername:port servername可以寫主機名 或者點分式IP
server 192.168.22.136:80 max_fails=1 fail_timeout=300s;
server 192.168.22.147:80 max_fails=1 fail_timeout=300s;
}
server {
listen 80;
server_name localhost;
location / {
#upstream 塊名
proxy_pass http://my.net;
root html;
index index.html index.htm;
}
淘寶團隊出品,高質量講nginx的電子書
http://tengine.taobao.org/book/