Nginx通關攻略

Nginx是什麼

沒有聽過Nginx?沒關係,必定聽過它的「同行」Apache吧!Nginx同Apache同樣都是一種WEB服務器。基於REST架構風格,以統一資源描述符(Uniform Resources Identifier)URI或者統一資源定位符(Uniform Resources Locator)URL做爲溝通依據,經過HTTP協議提供各類網絡服務。
然而,這些服務器在設計之初受到當時環境的侷限,例如當時的用戶規模,網絡帶寬,產品特色等侷限而且各自的定位和發展都不盡相同。這也使得各個WEB服務器有着各自鮮明的特色。
Apache的發展時期很長,並且是毫無爭議的世界第一大服務器。它有着不少有點:穩定、開源、跨平臺等等。可是因爲它出現的時間太長了。它興起的年代,互聯網產業遠比不上如今。因此它被設計爲一個重量級的。不支持高併發的服務器。在Apache上運行數以萬計的併發訪問,會致使服務器消耗大量內存。操做系統對其進行進程或線程間的切換也消耗了大量的CPU資源,致使HTTP請求的平均響應速度下降。
這些都決定了Apache不可能成爲高性能WEB服務器,輕量級高併發服務器Nginx和Lighttpd就應運而生了。php

Nginx產生

俄羅斯的工程師Igor Sysoev,他在爲Rambler Media工做期間,使用C語言開發了Nginx。Nginx做爲WEB服務器一直爲Rambler Media提供出色而又穩定的服務。
而後呢,Igor Sysoev將Nginx代碼開源,而且賦予自由軟件許可證。
因爲:html

Nginx使用基於事件驅動架構,使得其能夠支持數以百萬級別的TCP鏈接
高度的模塊化和自由軟件許可證是的第三方模塊層出不窮(這是個多麼美好的開源時代啊)
Nginx是一個跨平臺服務器,能夠運行在Linux, FreeBSD, Solaris, AIX, Mac OS, Windows等操做系統上nginx

這些優秀的設計帶來的極大的穩定性。
因而,duang的一下。Nginx火了。web

三大WEB服務器對比

lighttpd

Lighttpd是一個具備很是低的內存開銷,cpu佔用率低,效能好,以及豐富的模塊等特色。lighttpd是衆多OpenSource輕量級的web server中較爲優秀的一個。支持FastCGI, CGI, Auth, 輸出壓縮(output compress), URL重寫, Alias等重要功能。
Lighttpd使用fastcgi方式運行PHP,它會使用不多的PHP進程響應很大的併發量。
Fastcgi的優勢在於:算法

從穩定性上看, fastcgi是以獨立的進程池運行來cgi,單獨一個進程死掉,系統能夠很輕易的丟棄,而後從新分配新的進程來運行邏輯.
從安全性上看, fastcgi和宿主的server徹底獨立, fastcgi怎麼down也不會把server搞垮
從性能上看, fastcgi把動態邏輯的處理從server中分離出來, 大負荷的IO處理仍是留給宿主server, 這樣宿主server能夠一心一意做IO,對於一個普通的動態網頁來講, 邏輯處理可能只有一小部分, 大量的圖片等靜態IO處理徹底不須要邏輯程序的參與
從擴展性上講, fastcgi是一箇中立的技術標準, 徹底能夠支持任何語言寫的處理程序php,Java,Pythonapache

Apache

apache是世界排名第一的web服務器, 根據netcraft所做的調查,世界上百分之五十以上的web服務器在使用apache.
1995年4月, 最先的apache(0.6.2版)由apache group公佈發行. apache group 是一個徹底經過internet進行運做的非盈利機構, 由它來決定apache web服務器的標準發行版中應該包含哪些內容. 准許任何人修改隱錯, 提供新的特徵和將它移植到新的平臺上, 以及其它的工做. 當新的代碼被提交給apache group時, 該團體審覈它的具體內容, 進行測試 若是認爲滿意, 該代碼就會被集成到apache的主要發行版中。
apache 的特性:ubuntu

幾乎能夠運行在全部的計算機平臺上
支持最新的http/1.1協議
簡單並且強有力的基於文件的配置(httpd.conf)
支持通用網關接口(cgi)
支持虛擬主機
支持http認證
集成perl
集成的代理服務器
能夠經過web瀏覽器監視服務器的狀態, 能夠自定義日誌
支持服務器端包含命令(ssi)
支持安全socket層(ssl)
具備用戶會話過程的跟蹤能力
支持fastcgi
支持Java後端

Nginx

Nginx是俄羅斯人編寫的十分輕量級的HTTP服務器,Nginx,它的發音爲「engine X」, 是一個高性能的HTTP和反向代理服務器,同時也是一個IMAP/POP3/SMTP 代理服務器.Nginx是由俄羅斯人 Igor Sysoev爲俄羅斯訪問量第二的 Rambler.ru站點開發.
Nginx以事件驅動的方式編寫,因此有很是好的性能,同時也是一個很是高效的反向代理、負載平衡。其擁有匹配 Lighttpd的性能,同時尚未Lighttpd的內存泄漏問題,並且Lighttpd的mod_proxy也有一些問題而且好久沒有更新。可是Nginx並不支持cgi方式運行,緣由是能夠減小所以帶來的一些程序上的漏洞。因此必須使用FastCGI方式來執行PHP程序。
nginx作爲HTTP服務器,有如下幾項基本特性:瀏覽器

處理靜態文件,索引文件以及自動索引;打開文件描述符緩衝
無緩存的反向代理加速,簡單的負載均衡和容錯
FastCGI,簡單的負載均衡和容錯
模塊化的結構。包括gzipping, byte ranges, chunked responses,以及 SSI-filter等filter。若是由 FastCGI或其它代理服務器處理單頁中存在的多個SSI,則這項處理能夠並行運行,而不須要相互等待。緩存

Nginx專爲性能優化而開發,性能是其最重要的考量,實現上很是注重效率。它支持內核Poll模型,能經受高負載的考驗,有報告代表能支持高達 50,000個併發鏈接數。

Nginx具備很高的穩定性。其它HTTP服務器,當遇到訪問的峯值,或者有人惡意發起慢速鏈接時,也極可能會致使服務器物理內存耗盡頻繁交換,失去響應,只能重啓服務器。例如當前apache一旦上到200個以上進程,web響應速度就明顯很是緩慢了。而Nginx採起了分階段資源分配技術,使得它的CPU與內存佔用率很是低。nginx官方表示保持10,000個沒有活動的鏈接,它只佔2.5M內存,因此相似DOS這樣的攻擊對nginx來講基本上是毫無用處的。就穩定性而言,nginx比lighthttpd更勝一籌。

Nginx支持熱部署。它的啓動特別容易, 而且幾乎能夠作到7*24不間斷運行,即便運行數個月也不須要從新啓動。你還可以在不間斷服務的狀況下,對軟件版本進行進行升級。

三大服務器比較

server Apache Nginx Lighttpd
Proxy代理 很是好 很是好 通常
Rewriter 很是好 通常
Fcgi 很差 很是好
熱部署 不支持 支持 不支持
系統壓力比較 很大 很小 比較小
穩定性 很是好 很差
安全性 通常 通常
靜態文件處理 通常 很是好
反向代理 通常 很是好 通常

Nginx的安裝

模塊依賴性Nginx須要依賴下面3個包
1,gzip 模塊須要 zlib 庫 點擊下載
2,rewrite 模塊須要 pcre 庫 點擊下載
3,ssl 功能須要 openssl 庫 點擊下載
Nginx包下載: http://nginx.org/en/download.html
依賴包安裝順序依次爲:openssl、zlib、pcre, 最後安裝Nginx包。

安裝openssl-fips-2.0.2.tar.gz

[root@localhost mrms]# tar -zxvf openssl-fips-2.0.2.tar.gz
[root@localhost mrms]# cd openssl-fips-2.0.2
[root@localhost openssl-fips-2.0.2]# ./config
[root@localhost openssl-fips-2.0.2]# make
[root@localhost openssl-fips-2.0.2]# make install

安裝zlib-1.2.7.tar.gz

[root@localhost mrms]# tar -zxvf zlib-1.2.7.tar.gz
[root@localhost mrms]# cd zlib-1.2.7
[root@localhost zlib-1.2.7]# ./configure
[root@localhost zlib-1.2.7]# make
[root@localhost zlib-1.2.7]# make install

安裝pcre-8.21.tar.gz

[root@localhost mrms]# tar -zxvf pcre-8.21.tar.gz
[root@localhost mrms]# cd pcre-8.21
[root@localhost pcre-8.21]# ./configure
[root@localhost pcre-8.21]# make
[root@localhost pcre-8.21]# make install

安裝 nginx-1.2.6.tar.gz

[root@localhost mrms]# tar -zxvf nginx-1.2.6.tar.gz
[root@localhost mrms]# cd nginx-1.2.6
[root@localhost nginx-1.2.6]# ./configure --with-pcre=../pcre-8.21 --with-zlib=../zlib-1.2.7 --with-openssl=../openssl-fips-2.0.2
[root@localhost nginx-1.2.6]# make
[root@localhost nginx-1.2.6]# make install

檢測是否安裝成功

[root@localhost nginx-1.2.6]# cd /usr/local/nginx/sbin
[root@localhost sbin]# ./nginx -t

若是是以下的結果的話,就代表安裝成功啦
安裝成功

啓動nginx

[root@localhost sbin]# ./nginx

查看端口

[root@localhost sbin]# netstat -ntlp
端口使用

靜態HTTP服務器

首先,Nginx是一個HTTP服務器,能夠將服務器上的靜態文件(如HTML、圖片)經過HTTP協議展示給客戶端。
配置:
靜態資源服務

反向代理服務器

什麼是反向代理?
客戶端原本能夠直接經過HTTP協議訪問某網站應用服務器,若是網站管理員在中間加上一個Nginx,客戶端請求Nginx,Nginx請求應用服務器,而後將結果返回給客戶端,此時Nginx就是反向代理服務器。
反向代理
反向代理配置:
反向代理
既然服務器能夠直接HTTP訪問,爲何要在中間加上一個反向代理,不是畫蛇添足嗎?反向代理有什麼做用?繼續往下看,下面的負載均衡、虛擬主機,都基於反向代理實現,固然反向代理的功能也不只僅是這些。

負載均衡

當網站訪問量很是大,也攤上事兒了。由於網站愈來愈慢,一臺服務器已經不夠用了。因而將相同的應用部署在多臺服務器上,將大量用戶的請求分配給多臺機器處理。同時帶來的好處是,其中一臺服務器萬一掛了,只要還有其餘服務器正常運行,就不會影響用戶使用。
Nginx能夠經過反向代理來實現負載均衡
負載均衡
負載均衡配置:
負載均衡配置

虛擬主機

有的網站訪問量大,須要負載均衡。然而並非全部網站都如此出色,有的網站,因爲訪問量過小,須要節省成本,將多個網站部署在同一臺服務器上。
例如將www.aaa.comwww.bbb.com兩個網站部署在同一臺服務器上,兩個域名解析到同一個IP地址,可是用戶經過兩個域名卻能夠打開兩個徹底不一樣的網站,互相不影響,就像訪問兩個服務器同樣,因此叫兩個虛擬主機。
配置:
虛擬主機
在服務器8080和8081分別開了一個應用,客戶端經過不一樣的域名訪問,根據server_name能夠反向代理到對應的應用服務器。
虛擬主機的原理是經過HTTP請求頭中的Host是否匹配server_name來實現的,有興趣的同窗能夠研究一下HTTP協議。
另外,server_name配置還能夠過濾有人惡意將某些域名指向你的主機服務器。

FastCGI

Nginx自己不支持PHP等語言,可是它能夠經過FastCGI來將請求扔給某些語言或框架處理(例如PHP、Python、Perl)。
FastCGI
配置中將.php結尾的請求經過FashCGI交給PHP-FPM處理,PHP-FPM是PHP的一個FastCGI管理器。有關FashCGI能夠查閱其餘資料,本篇再也不介紹。
fastcgi_pass和proxy_pass有什麼區別?
下面一張圖帶你看明白:
FastCGI

Nginx經常使用命令

1, 啓動 Nginx

poechant@ubuntu:sudo ./sbin/nginx

2,中止 Nginx

poechant@ubuntu:sudo ./sbin/nginx -s stoppoechant@ubuntu:sudo ./sbin/nginx -s quit
-s都是採用向 Nginx 發送信號的方式。

3,Nginx 重載配置

poechant@ubuntu:sudo ./sbin/nginx -s reload
或者使用:
poechant@ubuntu:service nginx reload

4,指定配置文件

poechant@ubuntu:sudo ./sbin/nginx -c /usr/local/nginx/conf/nginx.conf
-c表示configuration,指定配置文件。

5,查看 Nginx 版本

poechant@ubuntu:/usr/local/nginx$ ./sbin/nginx -v
或者使用:
poechant@ubuntu:/usr/local/nginx$ ./sbin/nginx -V

6,檢查配置文件是否正確

poechant@ubuntu:/usr/local/nginx$ ./sbin/nginx -t

7, 顯示幫助信息

poechant@ubuntu:/user/local/nginx$ ./sbin/nginx -h
或者使用:
poechant@ubuntu:/user/local/nginx$ ./sbin/nginx -?

負載均衡實戰

upstream test.miaohr.com {
server 192.168.232.132:80;
server 192.168.232.133:80;
}
server {
listen 80;
server_name test.miaohr.com;
charset utf-8;
location / {
root html;
index index.html index.htm;
proxy_pass http://test.miaohr.com;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 100m;
}
location ~ ^/(WEB-INF)/ {
deny all;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/html/;
}
}

  1. 輪詢(默認)
    每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。
  2. weight
    指定輪詢概率,weight和訪問比率成正比,用於後端服務器性能不均的狀況。

    upstream bakend {
    server 192.168.159.10 weight=10;
    server 192.168.159.11 weight=10;
    }

  3. ip_hash
    每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。

    upstream resinserver{
    ip_hash;
    server 192.168.159.10:8080;
    server 192.168.159.11:8080;
    }

  4. air(第三方)
    按後端服務器的響應時間來分配請求,響應時間短的優先分配。

    upstream resinserver{
    server server1;
    server server2;
    fair;
    }

  5. url_hash(第三方)
    按訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。
    例:在upstream中加入hash語句,server語句中不能寫入weight等其餘的參數,hash_method是使用的hash算法

    upstream resinserver{
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
    }

  • down 表示單前的server暫時不參與負載
  • weight 默認爲1.weight越大,負載的權重就越大。
  • max_fails :容許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤
  • fail_timeout:max_fails次失敗後,暫停的時間。
  • backup: 其它全部的非backup機器down或者忙的時候,請求backup機器。因此這臺機器壓力會最輕。
    nginx支持同時設置多組的負載均衡,用來給不用的server來使用。
  • client_body_in_file_only 設置爲On 能夠講client post過來的數據記錄到文件中用來作debug
  • client_body_temp_path 設置記錄文件的目錄 能夠設置最多3層目錄
  • location 對URL進行匹配.能夠進行重定向或者進行新的代理 負載均衡

總結

關於nginx的前因後果就這麼多,其實只須要知道怎麼安裝使用和負載均衡的使用就夠啦,基本上全部的要點都已經在上面講啦

相關文章
相關標籤/搜索