Nginx (「engine x」) 是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。Nginx是由Igor Sysoev爲俄羅斯訪問量第二的Rambler.ru站點開發的,第一個公開版本0.1.0發佈於2004年10月4日。其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4發佈。php
Nginx是一款輕量級的WEB服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。由俄羅斯的程序設計師Igor Sysoev所開發,供俄國大型的入口網站及搜索引擎Rambler(俄文:Рамблер)使用。其特色是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。html
通常狀況下普通php引擎支持的併發鏈接參考爲300-1000,Java引擎和數據庫的併發鏈接參考值爲300-1500.固然架構不一樣可能會有浮動前端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
yum install pcre pcre-devel –y
yum install openssl openssl-devel –y
useradd nginx -M -s /sbin/nologin
./configure --user=nginx --group=nginx --prefix=/application/nginx1.6.2 --with-http_stub_status_module --with-http_ssl_module
make&&make install
ln -s /application/nginx1.6.2/ /application/nginx
/application/nginx/sbin/nginx –t
/application/nginx/sbin/nginx
|
各個命令解釋linux
1
|
yum install pcre pcre-devel –y
|
1
|
yum install openssl openssl-devel –y
|
1
|
useradd nginx -M -s /sbin/nologin
|
1
2
3
|
./configure --user=nginx --group=nginx --prefix=/application/nginx1.6.2 --with-http_stub_status_module --with-http_ssl_module
make&&make install
|
1
2
3
4
5
|
/application/nginx/sbin/nginx –t
/application/nginx/sbin/nginx
/application/nginx/sbin/nginx –s reload
|
1
|
/etc/init.d/iptables stop 或 service iptables stop
|
a、查看selinux的狀態:nginx
能夠經過/usr/sbin/sestatus –v 或者用命令 getenforceweb
Disabled爲關閉正則表達式
b、更改selinux的方式:數據庫
setenforce 0(臨時關閉)ubuntu
vi編輯/etc/selinux/config進行下面更改後端
SELINUX=disabled(永久關閉)
安裝故障處理:
故障一:沒有安裝pcre或pcre-devel
報錯爲:./configure: error: the HTTP rewrite module requires the PCRE library.
故障二:沒有安裝openssl和openssl-devel
報錯爲:./configure: error: SSL modules require the OpenSSL library.
故障三:nginx.pid文件缺失
執行:/application/nginx1.6.2/sbin/nginx -c /application/nginx1.6.2/conf/nginx.conf
從新指定下配置文件的位置
報錯爲:nginx: [error] open() "/application/nginx1.6.2/logs/nginx.pid" failed (2: No such file or directory)
若是yum報錯請:
http://user.qzone.qq.com/616745045/2 按照上述文檔進行配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Nginx http 功能模塊 模塊說明
Ngx_http_core_module 包括一些核心的http參數配置,對應Nginx的配合爲HTTP區塊部分
Ngx_http_access_module 訪問控制模塊,用來控制網站用戶對Nginx的訪問
Ngx_http_gzip_module 壓縮模塊,對Nginx返回的數據壓縮,屬於性能優化模塊
Ngx_http_fastcgi_module FastCGI模塊,和動態應用相關的模塊,例如PHP
Ngx_http_proxy_module Proxy 代理模塊
Ngx_http_upstream_module 負載均衡模塊,能夠實現網站的負載均衡功能及節點的健康檢查
Ngx_http_rewrite_module URL地址重寫模塊
Ngx_http_limit_conn_module 限制用戶併發鏈接數及請求數模塊
Ngx_http_limit_req_module 根據定義的key限制Nginx請求過程的速率
Ngx_http_log_module 訪問日誌模塊,以指定的格式記錄Nginx客戶訪問日誌等信息
Ngx_http_auth_basic_module web認證模塊,設置web用戶經過帳號,密碼訪問Nginx
Ngx_http_ssl_module ssl模塊,用於加密的http鏈接如https
Ngx_http_stub_status_module 記錄Nginx基本訪問狀態信息等的模塊
|
egrep -v "#|^$" nginx.conf.default >nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
worker_processes 1; #worker進程的數量
event { #事件區塊的開始
worker_connections 1024; #每一個worker進程支持的最大鏈接數
} #事件區塊的結束
http { #http區塊的開始
include mime.types; #nginx支持的媒體類型庫文件
default_type application/octet-stream;#默認的媒體類型
sendfile on; #開啓高效傳輸模式
keepalive_timeout 65; #鏈接超時
server { #第一個server區塊開始,表示一個獨虛擬主機站點
listen 80; #服務端口,默認80
server_name localhost; #提供服務的域名主機名
location / { #第一個location區塊開始
root html; #站點的根目錄,至關於Nginx的安裝目錄
index index.html index.htm; #默認的首頁文件,若是多個用空格分開
} #第一個location區塊結束
error_page 500 502 503 504 /50x.html;#出現對象http狀態碼時使用50x.html迴應用戶
location = /50x.html {
root html;
}
}
}
|
Location 模塊
location 模塊的做用是根據用戶請求的URI來執行不一樣的應用,匹配成功了進行相關的操做
什麼是統一資源標示符URI(Uniform Resource Identifier):
是一個用於標識某一互聯網資源名稱的字符串,該種標識容許用戶對任何的資源經過特定的協議進行交互操做。URI由包括肯定語法和相關協議的方案所定義。Web上可用的每種資源 HTML文檔、圖像、視頻片斷、程序等 - 由一個統一資源標識符進行定位。
Location基礎語法
1
|
location [ = | ~ | ~* | ^~ ] uri { ... }
|
6種location格式的區別
一、^~ 特殊字符串匹配 匹配到相應的字符串後,不會對後面正則進行匹配
二、~* 正則匹配 不區分大小寫
三、‘=‘ 精確查找
四、/xxx/ 普通字符串路徑匹配
五、/ 根 當全部匹配結束 沒有符合的 匹配默認的 / 根路徑
六、~ 表示uri包含正則,而且區分大小寫
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
server
{
listen 80;
server_name www.imdsx.cn;
location / {
return 401;
}
location = / {
return 400;
}
location ^~ /bbb/ {
return 402;
}
location ~* \.(gif|jpg|jpeg)$ {
return 403;
}
location /aaa/ {
return 502;
}
}
|
實驗1、輸入www.imdsx.cn
nginx代理走的是精確匹配全部走到了400(這裏多提一句,當屢次使用的路徑時 可使用精確匹配方式,加快匹配速度提升性能)
實驗2、輸入http://www.imdsx.cn/123456
nginx全部location都沒有匹配到找到了默認的根 也就是401
實驗3、輸入http://www.imdsx.cn/1.gif
nginx匹配的事正則 *.gif 也就走到了 403
組合實驗
實驗4、輸入www.imdsx.com/aaa/1.gif
同時存在普通路徑、和正則的狀況下nginx又是如何匹配的呢?
nginx匹配的是正則,由於nginx在匹配時會先記錄最高匹配度的普通uri,再去匹配正則,若是正則有匹配的則展現正則,不然展現普通uri
實驗5、輸入www.imdsx.cn/aaa/1.abc
咱們輸入了一個不符合正則的URI nginx匹配到了普通URI 502錯誤
實驗5、輸入www.imdsx.com/bbb/1.gif
nginx這時匹配的是402錯誤,^~ 方式若是匹配到普通uri後就不在繼續正則匹配
從新改下location
1
2
3
4
5
6
|
location ^ ~ / aaa / {
return 400;
}
location ^ ~ / aaa / bbb / {
return 401;
}
|
實驗6、「^~」遵循最大匹配原則
nginx匹配了 400
nginx匹配了 401
從新改下location
1
2
3
4
5
6
|
location /aaa/ {
reutrn 400;
}
location = /aaa/ {
return 401;
}
|
試驗7、當最長匹配(^~)和精確匹配(=)相同時
nginx 匹配到了 401 匹配到了精確匹配(=)
Nginx對於靜態文件的緩存配置
只要訪問的是圖片文件,就會根據圖片的名稱在image的這個目錄中尋找
1
2
3
|
location ~*.\.(jpg|gif|bmp|gif|png)$ {
root image; # 註明個人文件存放的位置 默認以nginx的根目錄算起
}
|
爲何配置靜態緩存?
一、爲了提升響應速度
二、減輕真實服務器的負載
對於靜態資源(長久使用不變更的文件或圖片)咱們能夠在反向代理服務器中進行緩存,nginx在跳轉時只要匹配到了緩存中的文件,講直接經過nginx返回給客戶端,若是沒有則在下發到個服務器進行處理。大大優化了客戶的訪問速度和對真是服務器所形成的真實壓力
upstream模塊
Upstream的牛逼之處在於,它解決了nginx跨越單機的限制,完成網絡數據的接收、處理和轉發。實現了負載均衡的能力。數據轉發功能,爲nginx提供了跨越單機的橫向處理能力,使nginx擺脫只能爲終端節點提供單一功能的限制,而使它具有了網路應用級別的拆分、封裝和整合的戰略功能。在雲模型大行其道的今天,數據轉發使nginx有能力構建一個網絡應用的關鍵組件。
Upstream的四種命中機制
一、ip_hash;
iphash 可以避免同一個客戶端連續的web請求分發到多個機器 涉及到session校驗問題 經過iphash解決該問題
二、least_conn;
請求分發到最少鏈接數的服務器上
三、Round Robin(輪訓)
默認是輪訓機制,當有服務器down掉,就從負載列表清除掉
輪詢時默認的weight=1;
四、Weight(權重)(weighted round robin)
基於權重的反向代理 weight值越大越有概率被分配
在實際應用中iphash和weight能夠搭配使用
反向代理的配置設置
1
2
3
4
5
6
7
8
9
10
|
proxy_pass http://xxxx # 經過proxy_pass 來聲明要跳轉upstream設置的名字
proxy_set_header Host $host; # 獲取經過什麼域名訪問的主機
proxy_set_header X-Forwarded-Fori $remote_addr; #後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP
proxy_connect_timeout 60; # 反向代理和後端節點服務器 連接超時時間 發起握手後的時間
proxy_send_timeout 60; # 後端服務器數據回傳的超時時間
proxy_read_timeout 60; # Nginx 從後端讀取數據的超時時間
proxy_buffer_size 4k; # 設定頭部緩衝區大小
proxy_buffers 4 32k; # 設定緩衝的的數量和大小
proxy_busy_buffers_size 64k; # 當系統繁忙時 可以使用該緩衝區的大小
proxy_temp_file_write_size 64k; # 臨時緩存文件大小
|
proxy_buffering參數
1
|
proxy_buffering on|off
|
代理緩存的開啓和關閉,不影響proxy_buffer_size的做用,只做用在proxy_buffers、proxy_busy_buffers_size
1
|
proxy_buffer_size 4k
|
接受服務器返回的第一個部分 response header 建議設置爲proxy_buffers的一個buffer的大小
1
|
proxy_buffers 4 4k
|
設置buffer的數量和大小
1
|
proxy_busy_buffers_size 8k
|
nginx在接受服務器的數據的同時,並非所有接受服務器回傳的數據在返回客戶端而是有部分數據在接收的同時返回客戶端,返回的大小經過proxy_busy_buffers_size 設置,建議是單個buffer的兩倍。若是緩衝區和busy緩衝區都滿了則寫到磁盤的臨時文件中。經過下方的參數設置
1
|
proxy_max_temp_file_size 1024m
|
responser返回佔滿了全部buffer則存在temp_file下 而最多能接收的大小則經過proxy_max_temp_file_size設置 當涉及到磁盤存儲時就涉及到IO的操做,則會影響到客戶端體驗的效果
1
|
proxy_temp_file_write_size 8k
|
是一次訪問能寫入的臨時文件的大小,默認的大小單個buffer的2倍
1
2
3
4
5
6
7
8
9
10
11
12
13
|
狀態碼
詳細描述說明
200-OK 服務器成功返回網頁,這是成功的狀態碼
301-Moved Permanently 永久跳轉,所請求的網頁將永久跳轉到被設定的新位置
403-Forbidden 禁止訪問,雖然這個請求時合法的,可是服務器端由於匹配了預先設置的規則而拒絕相應客戶端的請求,
此類問題通常爲服務器或服務器權限配置不當所致
404-Not Found 服務器找不到客戶端請求的指定頁面,多是客戶端請求了服務器上不存在的資源所致使
500-Internal Server Error 內部服務器錯誤,服務器遇到了意料不到的狀況,不能完成客戶的請求,
這是一個較爲籠統的報錯,通常爲服務器的設置或內部程序問題致使
502-Bad Gateway 壞的網關,通常是代理服務器請求後端服務時,後端服務不可用或沒有完成相應網關服務器,
這一般爲反向代理服務器下面的節點出問題致使
503-Service Unavailable 服務當前不可用,多是服務器超載或停機維護致使的,或者是反向代理沒有能夠提供的服務節點
504-Gateway Timeout 網關超時,通常是網關代理服務器請求後端服務時,後端服務沒有在特定的時間內完成處理請求,
多數是服務器過載致使沒有在指定的時間內返回數據給前端代理服務器
|