1. Nginx 介紹
Nginx是一款輕量級(jí)的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,并在一個(gè)BSD-like 協(xié)議下發(fā)行。由俄羅斯的程序設(shè)計(jì)師Igor Sysoev所開發(fā),供俄國大型的入口網(wǎng)站及搜索引擎Rambler(俄文:Рамблер)使用。其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),
Nginx 是一個(gè)高性能的 Web 和反向代理服務(wù)器, 它具有有很多非常優(yōu)越的特性:
作為 Web 服務(wù)器:相比 Apache,Nginx 使用更少的資源,支持更多的并發(fā)連接,體現(xiàn)更高的效率,這點(diǎn)使 Nginx 尤其受到虛擬主機(jī)提供商的歡迎。能夠支持高達(dá) 50,000 個(gè)并發(fā)連接數(shù)的響應(yīng),感謝 Nginx 為我們選擇了 epoll and kqueue 作為開發(fā)模型.作為負(fù)載均衡服務(wù)器:Nginx 既可以在內(nèi)部直接支持 Rails 和 PHP,也可以支持作為 HTTP代理服務(wù)器 對(duì)外進(jìn)行服務(wù)。Nginx 用 C 編寫, 不論是系統(tǒng)資源開銷還是 CPU 使用效率都比 Perlbal 要好的多。
- Nginx一般用戶七層負(fù)載均衡,其吞吐量有一定的限制。為了提高整體的吞吐量,會(huì)在DNS和Nginx之間引入LVS(軟件負(fù)載均衡器)、F5(硬負(fù)載均衡器) 可以做四層負(fù)載均衡,首先DNS解析到LVS(F5),讓后LVS(F5)轉(zhuǎn)發(fā)給Nginx,在有Nginx轉(zhuǎn)發(fā)給真實(shí)的服務(wù)器
2. Linux安裝Nginx
- 安裝依賴包
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
- 下載解壓nginx安裝包
//創(chuàng)建一個(gè)文件夾
cd /usr/local
mkdir nginx
cd nginx
//下載tar包
wget http://nginx.org/download/nginx-1.6.3.tar.gz
tar -xvf nginx-1.6.3.tar.gz
- 安裝nginx
//進(jìn)入nginx目錄
cd /usr/local/nginx
//進(jìn)入目錄
cd nginx-1.6.3
//執(zhí)行命令
./configure
//執(zhí)行make命令
make
//執(zhí)行make install命令
make install
- 啟動(dòng)nginx
/usr/local/nginx/sbin/nginx -s reload
如果出現(xiàn)報(bào)錯(cuò):nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed
則運(yùn)行: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
3. Nginx應(yīng)用場景
- http服務(wù)器。Nginx是一個(gè)http服務(wù)可以獨(dú)立提供http服務(wù)。可以做網(wǎng)頁靜態(tài)服務(wù)器。
- 虛擬主機(jī)??梢詫?shí)現(xiàn)在一臺(tái)服務(wù)器虛擬出多個(gè)網(wǎng)站,例如個(gè)人網(wǎng)站使用的虛擬機(jī)。
- 反向代理,負(fù)載均衡。當(dāng)網(wǎng)站的訪問量達(dá)到一定程度后,單臺(tái)服務(wù)器不能滿足用戶的請(qǐng)求時(shí),需要用多臺(tái)服務(wù)器集群可以使用nginx做反向代理。并且多臺(tái)服務(wù)器可以平均分擔(dān)負(fù)載,不會(huì)應(yīng)為某臺(tái)服務(wù)器負(fù)載高宕機(jī)而某臺(tái)服務(wù)器閑置的情況。
- nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口網(wǎng)關(guān),對(duì)每個(gè)接口服務(wù)進(jìn)行攔截。
4. Nginx目錄結(jié)構(gòu)
執(zhí)行命令 tree /application/nginx ;如果tree命令找不到就執(zhí)行 yum install tree -y安裝
yum install tree -y
[root@vm10-0-0-128 local]# tree nginx/
nginx/
├── client_body_temp
├── conf #這是Nginx所有配置文件的目錄,極其重要
│ ├── fastcgi.conf #fastcgi相關(guān)參數(shù)的配置文件
│ ├── fastcgi.conf.default #fastcgi.conf的原始備份
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types
│ ├── mime.types.default
│ ├── nginx.conf #這是Nginx默認(rèn)的主配置文件
│ ├── nginx.conf.default
│ ├── scgi_params
│ ├── scgi_params.default
│ ├── uwsgi_params
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp #fastcgi臨時(shí)數(shù)據(jù)目錄
├── html #這是編譯安裝時(shí)Nginx的默認(rèn)站點(diǎn)目錄 nginx首頁與錯(cuò)誤頁面
│ ├── 50x.html
│ └── index.html
├── logs #這是Nginx默認(rèn)的日志路徑,包括錯(cuò)誤日志及訪問日志
│ ├── access.log #這是Nginx的默認(rèn)訪問日志文件,使用tail -f access.log,可以實(shí)時(shí)觀看網(wǎng)站用戶訪問情況信息
│ ├── error.log #這是Nginx的錯(cuò)誤日志文件,如果Nginx出現(xiàn)啟動(dòng)故障等問題,一定要看看這個(gè)錯(cuò)誤日志
│ └── nginx.pid #Nginx的pid文件,Nginx進(jìn)程啟動(dòng)后,會(huì)把所有進(jìn)程的ID號(hào)寫到此文件
├── proxy_temp #臨時(shí)目錄
├── sbin #這是Nginx命令的目錄,如Nginx的啟動(dòng)命令nginx
│ └── nginx
├── scgi_temp #臨時(shí)目錄
└── uwsgi_temp #臨時(shí)目錄
5. Nginx主配置文件nginx.conf
#user nobody; #定義Nginx運(yùn)行的用戶和用戶組
worker_processes 1; #nginx進(jìn)程數(shù),建議設(shè)置為等于CPU總核心數(shù)。
#error_log logs/error.log; #全局錯(cuò)誤日志定義類型,
#error_log logs/error.log notice; #進(jìn)程文件
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024; #單個(gè)進(jìn)程最大連接數(shù)(最大連接數(shù)=連接數(shù)*進(jìn)程數(shù))
}
#HTTP區(qū)塊開始 核心區(qū)域
http {
include mime.types; #Nginx支持的媒體類型庫文件
default_type application/octet-stream; #默認(rèn)媒體類型
#client_header_buffer_size 32k; #上傳文件大小限制
large_client_header_buffers 4 64k; #設(shè)定請(qǐng)求緩存值
sendfile on; #開啟高效文件傳輸模式,s
#tcp_nopush on; #防止網(wǎng)絡(luò)阻塞
#tcp_nodelay on; #防止網(wǎng)絡(luò)阻塞
#keepalive_timeout 0;
keepalive_timeout 65; #連接超時(shí),單位是秒
#FastCGI相關(guān)參數(shù)是為了改善網(wǎng)站的性能:減少資源占用,提高訪問速度。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip模塊設(shè)置
#gzip on; #開啟gzip壓縮輸出
#虛擬主機(jī)的配置
server {
listen 8080; #監(jiān)聽端口
server_name localhost; #提供服務(wù)的域名主機(jī)名
# location的作用
# location指令的作用是根據(jù)用戶請(qǐng)求的URI來執(zhí)行不同的應(yīng)用,也就是根據(jù)用戶請(qǐng)求的網(wǎng)站URL進(jìn)行匹配,匹配成功即進(jìn)行相關(guān)的操作。
# 1. =開頭表示精確匹配
# 2. ^~ 開頭表示uri以某個(gè)常規(guī)字符串開頭
# 3. ~ 開頭表示區(qū)分大小寫的正則匹配;
# 4. ~* 開頭表示不區(qū)分大小寫的正則匹配
# 5. / 通用匹配, 如果沒有其它匹配,任何請(qǐng)求都會(huì)匹配到
location /{ # 對(duì) /進(jìn)行反向代理
root html; #站點(diǎn)的根目錄
index index.html index.htm; #默認(rèn)的首頁文件
try_files $uri $uri/ /index.html;
proxy_set_header X-Real-IP $remote_addr; #后端的Web服務(wù)器可以通過X-Forwarded-For獲取用戶真實(shí)IP
#以下是一些反向代理的配置,可選
proxy_set_header Host $host;
client_max_body_size 10m; #允許客戶端請(qǐng)求的最大單文件字節(jié)數(shù)
client_body_buffer_size 128k; #緩沖區(qū)代理緩沖用戶端請(qǐng)求的最大字節(jié)數(shù),
proxy_connect_timeout 90; #nginx跟后端服務(wù)器連接超時(shí)時(shí)間(代理連接超時(shí))
proxy_send_timeout 90; #后端服務(wù)器數(shù)據(jù)回傳時(shí)間(代理發(fā)送超時(shí))
proxy_read_timeout 90; #連接成功后,后端服務(wù)器響應(yīng)時(shí)間(代理接收超時(shí))
proxy_buffer_size 4k; #設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小
proxy_buffers 4 32k; #proxy_buffers緩沖區(qū),網(wǎng)頁平均在32k以下的設(shè)置
proxy_busy_buffers_size 64k; #高負(fù)荷下緩沖大?。╬roxy_buffers*2)
proxy_temp_file_write_size 64k; #設(shè)定緩存文件夾大小,大于這個(gè)值,將從upstream服務(wù)器傳
}
location /i5n/ {
proxy_pass http://127.0.0.1:8080/i5n/;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
# 錯(cuò)誤頁面 可以自定義自己都頁面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
6. 基于虛擬主機(jī)配置域名
#當(dāng)客戶端訪問www.yanxiaolong.cn,監(jiān)聽端口號(hào)為80,直接跳轉(zhuǎn)到data/www目錄下文件
server {
listen 80;
server_name www.yanxiaolong.cn;
location / {
root data/www;
index index.html index.htm;
}
}
#當(dāng)客戶端訪問blog.yanxiaolong.cn,監(jiān)聽端口號(hào)為80,直接跳轉(zhuǎn)到data/blow目錄下文件
server {
listen 80;
server_name blog.itmayiedu.com;
location / {
root data/blog;
index index.html index.htm;
}
}
7. 基于虛擬主機(jī)配置域名
#當(dāng)客戶端訪問www.yanxiaolong.cn,監(jiān)聽端口號(hào)為8080,直接跳轉(zhuǎn)到data/www目錄下文件
server {
listen 8080;
server_name www.yanxiaolong.cn;
location / {
root data/www;
index index.html index.htm;
}
}
#當(dāng)客戶端訪問blog.yanxiaolong.cn,監(jiān)聽端口號(hào)為8081,直接跳轉(zhuǎn)到data/blog目錄下文件
server {
listen 8081;
server_name blog.yanxiaolong.cn;
location / {
root data/blog;
index index.html index.htm;
}
}
8. Nginx配置反向代理
- 反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受internet上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)反向代理服務(wù)器。
- 反向代理的好處隱藏真實(shí)內(nèi)部ip地址,請(qǐng)求先訪問nginx代理服務(wù)器(外網(wǎng)可以訪問到),在使用nginx服務(wù)器轉(zhuǎn)發(fā)到真實(shí)服務(wù)器中。
配置:
#當(dāng)客戶端訪問api.yanxiaolong.cn,監(jiān)聽端口號(hào)為80直接跳轉(zhuǎn)到真實(shí)ip服務(wù)器地址 127.0.0.1:8080
server {
listen 80;
server_name api.yanxiaolong.cn;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
#當(dāng)客戶端訪問api2.yanxiaolong.cn,監(jiān)聽端口號(hào)為80直接跳轉(zhuǎn)到真實(shí)ip服務(wù)器地址 127.0.0.1:8081
server {
listen 80;
server_name api2.yanxiaolong.cn;
location / {
proxy_pass http://127.0.0.1:8081;
}
}
9. Nginx配置負(fù)載均衡
- Nginx負(fù)載均衡提供上游服務(wù)器(真實(shí)業(yè)務(wù)邏輯訪問的服務(wù)器),負(fù)載均衡、故障轉(zhuǎn)移、失敗重試、容錯(cuò)、健康檢查等。
- 當(dāng)上游服務(wù)器(真實(shí)業(yè)務(wù)邏輯訪問的服務(wù)器)發(fā)生故障時(shí),可以轉(zhuǎn)移到其他上游服務(wù)器(真實(shí)業(yè)務(wù)邏輯訪問的服務(wù)器)。
負(fù)載均衡算法
輪詢(默認(rèn))
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù),如果后端某臺(tái)服務(wù)器死機(jī),自動(dòng)剔除故障系統(tǒng),使用戶訪問不受影響。weight(輪詢權(quán)值)
weight的值越大分配到的訪問概率越高,主要用于后端每臺(tái)服務(wù)器性能不均衡的情況下。或者僅僅為在主從的情況下設(shè)置不同的權(quán)值,達(dá)到合理有效的地利用主機(jī)資源。ip_hash
每個(gè)請(qǐng)求按訪問IP的哈希結(jié)果分配,使來自同一個(gè)IP的訪客固定訪問一臺(tái)后端服務(wù)器,并且可以有效解決動(dòng)態(tài)網(wǎng)頁存在的session共享問題。俗稱IP綁定。fair(第三方) <font color ='red'>需要使用外部擴(kuò)展</font>
比 weight、ip_hash更加智能的負(fù)載均衡算法,fair算法可以根據(jù)頁面大小和加載時(shí)間長短智能地進(jìn)行負(fù)載均衡,也就是根據(jù)后端服務(wù)器的響應(yīng)時(shí)間 來分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。Nginx本身不支持fair,如果需要這種調(diào)度算法,則必須安裝upstream_fair模塊。url_hash(第三方) <font color ='red'>需要使用外部擴(kuò)展</font>
按訪問的URL的哈希結(jié)果來分配請(qǐng)求,使每個(gè)URL定向到一臺(tái)后端服務(wù)器,可以進(jìn)一步提高后端緩存服務(wù)器的效率。Nginx本身不支持url_hash,如果需要這種調(diào)度算法,則必須安裝Nginx的hash軟件包。
輪詢 :
upstream backServer{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name api.yanxiaolong.cn;
location / {
# 指定上游服務(wù)器負(fù)載均衡服務(wù)器
proxy_pass http://backServer;
}
}
加權(quán)輪詢 :
upstream backServer{
server 127.0.0.1:8080 wight = 1;
server 127.0.0.1:8081 wight = 2;
}
server {
listen 80;
server_name api.yanxiaolong.cn;
location / {
# 指定上游服務(wù)器負(fù)載均衡服務(wù)器
proxy_pass http://backServer;
}
}
IP綁定ip_hash
upstream backServer{
server 127.0.0.1:8080 ;
server 192.168.10.225:8081 max_fails=3 fail_timeout=15;
ip_hash;
}
server {
listen 80;
server_name api.yanxiaolong.cn;
location / {
# 指定上游服務(wù)器負(fù)載均衡服務(wù)器
proxy_pass http://backServer;
}
}
10. Nginx配置故障轉(zhuǎn)移
- 當(dāng)上游服務(wù)器(真實(shí)訪問服務(wù)器),一旦出現(xiàn)故障或者是沒有及時(shí)相應(yīng)的話,應(yīng)該直接輪訓(xùn)到下一臺(tái)服務(wù)器,保證服務(wù)器的高可用。
upstream backServer{
server 127.0.0.1:8080 wight = 1;
server 127.0.0.1:8081 wight = 2;
}
server {
listen 80;
server_name www.itmayiedu.com;
location / {
### 指定上游服務(wù)器負(fù)載均衡服務(wù)器
proxy_pass http://backServer;
#nginx與上游服務(wù)器(真實(shí)訪問的服務(wù)器)超時(shí)時(shí)間 后端服務(wù)器連接的超時(shí)時(shí)間_發(fā)起握手等候響應(yīng)超時(shí)時(shí)間
proxy_connect_timeout 20s;
#nginx發(fā)送給上游服務(wù)器(真實(shí)訪問的服務(wù)器)超時(shí)時(shí)間
proxy_send_timeout 20s;
### nginx接受上游服務(wù)器(真實(shí)訪問的服務(wù)器)超時(shí)時(shí)間
proxy_read_timeout 20s;
}
}
補(bǔ)充:nginx rewrite
Nginx提供的全局變量或自己設(shè)置的變量,結(jié)合正則表達(dá)式和標(biāo)志位實(shí)現(xiàn)url重寫以及重定向。rewrite只能放在server{},location{},if{}中,并且只能對(duì)域名后邊的除去傳遞的參數(shù)外的字符串起作用。
~
Rewrite主要的功能就是實(shí)現(xiàn)URL的重寫,Nginx的Rewrite規(guī)則采用Pcre,perl兼容正則表達(dá)式的語法規(guī)則匹配,如果需要Nginx的Rewrite功能,在編譯Nginx之前,需要編譯安裝PCRE庫。
通過Rewrite規(guī)則,可以實(shí)現(xiàn)規(guī)范的URL、根據(jù)變量來做URL轉(zhuǎn)向及選擇配置。
Rewrite全局變量:
| 變量 | 說明 | |
|---|---|---|
| $args | 存放了請(qǐng)求url中的請(qǐng)求指令。比如http://www.myweb.name/server/source?arg1=value1&arg2=value2中的arg1=value1&arg2=value2 | |
| $content_length | 存放請(qǐng)求頭中的Content-length字段 | |
| $content_type | 存放了請(qǐng)求頭中的Content-type字段 | |
| $document_root | 存放了針對(duì)當(dāng)前請(qǐng)求的根路徑 | |
| $document_uri | 請(qǐng)求中的uri,不包含請(qǐng)求指令 ,比如比如http://www.myweb.name/server/source?arg1=value1&arg2=value2中的/server/source$host | $1 |
| $host | 存放了請(qǐng)求url中的主機(jī)字段,比如比如http://www.myweb.name/server/source?arg1=value1&arg2=value2中的www.myweb.name。如果請(qǐng)求中的主機(jī)部分字段不可用或者為空,則存放nginx配置中該server塊中server_name指令的配置值 | |
| $http_cookie | cookie | |
| $limit_rate | nginx配置中l(wèi)imit_rate指令的配置值 | |
| $remote_addr | 客戶端的地址 | |
| $remote_port | 客戶端與服務(wù)器端建立連接的端口號(hào) | |
| $remote_user | 變量中存放了客戶端的用戶名 | |
| $request_body_file | 存放了發(fā)給后端服務(wù)器的本地文件資源的名稱 | |
| $request_method | 存放了客戶端的請(qǐng)求方式,如get,post等 | |
| $request_filename | 存放當(dāng)前請(qǐng)求的資源文件的路徑名 | |
| $query_string | $args含義相同 | |
| $scheme | 客戶端請(qǐng)求使用的協(xié)議,如http,https,ftp等 | |
| $server_protocol | 客戶端請(qǐng)求協(xié)議的版本,如”HTTP/1.0”,”HTTP/1.1” | |
| $server_addr | 服務(wù)器的地址 | |
| $server_name | 客戶端請(qǐng)求到達(dá)的服務(wù)器的名稱 |
判斷IP地址來源
server {
listen 80;
server_name www.yanxiaolong,cn;
location / {
# 如果不是白名單則 顯示403 禁止訪問
if ($remote_addr = 192.168.5.166) {
return 403;
}
}
限制瀏覽器訪問
server {
listen 80;
server_name www.yanxiaolong,cn;
location / {
## 不允許谷歌瀏覽器訪問 如果是谷歌瀏覽器返回500
if ($http_user_agent ~ Chrome) {
return 500;
}
}
<h4>Nginx1.9開始支持tcp層的轉(zhuǎn)發(fā),通過stream實(shí)現(xiàn)的</h4>
### 修改為TCP模塊
tcp {
### 定義多個(gè)上游服務(wù)器
upstream backServer{
### 定義TCP模塊上游服務(wù)器
server 192.168.5.165:80001;
server 192.168.5.165:80002;
}
server {
listen 9999;
server_name api.yanxiaolong.cn;
### 反向代理upstream
proxy_pass backServer;
}
}
個(gè)人博客地址:http://blog.yanxiaolong.cn/