Nginx
1. nginx可以做什么?
-
可針對靜態資源高速高并發訪問及緩存。
-
可使用反向代理加速,并且可進行數據緩存。
-
具有簡單負載均衡、節點健康檢查和容錯功能。
-
支持遠程FastCGI服務的緩存加速。
-
支持FastCGI、Uwsgi、SCGI、Memcached Servers的加速和緩存。
-
支持SSL、TLS、SNI。
-
具有模塊化的架構:過濾器包括gzip壓縮、ranges支持、chunked響應、XSLT、SSI及圖像縮放等功能。在SSI過濾器中,一個包含多個SSI的頁面,如果經由FastCGI或反向代理處理,可被并行處理。
###1.1 作為WEB服務的話支持
-
支持基于名字、端口及IP的多虛擬主機站點。
-
支持Keep-alive和pipelined連接。
-
可進行簡單、方便、靈活的配置和管理。
-
支持修改Nginx配置,并且在代碼上線時,可平滑重啟,不中斷業務訪問。
-
可自定義訪問日志格式,臨時緩沖寫日志操作,快速日志輪詢及通過rsyslog處理日志。
-
可利用信號控制Nginx進程。
-
支持3xx-5xx HTTP狀態碼重定向。
-
支持rewrite模塊,支持URI重寫及正則表達式匹配。
-
支持基于客戶端IP地址和HTTP基本認證的訪問控制。
-
支持PUT、DELETE、MKCOL、COPY及MOVE等較特殊的HTTP請求方法。
-
支持FLV流和MP4流技術產品應用。
-
支持HTTP響應速率限制。
-
支持同一IP地址的并發連接或請求數限制。
-
支持郵件服務代理。
###1.2 應用場景
(1)作為Web服務軟件
(2)反向代理或負載均衡服務
(3)前端業務數據緩存服務
? ? ? location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${expires ? ? 30d;} ?location ~ .*\.(js|css)?${expires ? ? 12h;}
###1.3 優點
-
支持高并發:能支持幾萬并發連接(特別是靜態小文件業務環境)。
-
資源消耗少:在3萬并發連接下,開啟10個Nginx線程消耗的內存不到200MB。
-
可以做HTTP反向代理及加速緩存,即負載均衡功能,內置對RS節點服務器健康檢查功能,這相當于專業的Haproxy軟件或LVS的功能。
-
具備Squid等專業緩存軟件等的緩存功能。
-
支持異步網絡I/O事件模型epoll(Linux 2.6+)。
?
2. apache的特點
-
Apache 2.2版本非常穩定強大,據官方說,Apache 2.4版本性能更強。
-
Prefork模式取消了進程創建開銷,性能很高。
-
處理動態業務數據時,因關聯到后端的引擎和數據庫,瓶頸不在Apache上。
-
高并發時消耗系統資源相對多一些。
-
基于傳統的select模型,高并發能力有限。select 模型 也就是 同步 epoll 異步
-
支持擴展庫,可通過DSO、apxs方法編譯安裝額外的插件功能,不需要重新編譯Apache。
-
功能多,更穩定,更安全,插件也多。
-
市場份額在逐年遞減。
2.1. 網絡模式
同步網絡模式 select
每個請求的狀態始終在維護著 (消耗好多資源)
異步網絡模式 epoll 處理服務器端的并發 請求人數越多 服務器肯定吃緊 系統資源也會緊張 I/O效率也會很慢
不定期將你的請求 篩選出來 直接告訴你 不用挨個select
epoll
每個請求 我不再維護你的狀態 如果有請求 就找我 找到了 給你服務 找不到拉倒
?
3. lighttpd的特點
-
基于異步網絡I/O模型,性能、并發都與Nginx相近。
-
擴展庫是SO模式,比Nginx靈活。
-
目前國內的使用率比較低,安全性沒有Apache和Nginx好。
-
通過插件(mod_secdownload)可實現文件URL地址加密(優點)。
-
社區不活躍,市場份額較低。
圖說三個服務器的性能對比
?
4. 為什么nginx處理并發能力更強?
?
?
5. 如何選擇web服務器?
-
靜態業務:若是高并發場景,盡量采用Nginx或Lighttpd,二者首選Nginx。
-
動態業務:理論上采用Nginx和Apache均可,建議選擇Nginx,為了避免相同業務的服務軟件多樣化,增加額外維護成本。動態業務可以由Nginx兼做前端代理,再根據頁面元素的類型或目錄,轉發到后端相應的服務器進行處理。
-
既有靜態業務又有動態業務:采用Nginx。
此外,如果并發不是很大,又對Apache很熟悉,采用Apache也是可以的,Apache 2.4版本也很強大,并發連接數也有所增加。總的來說,在滿足需求的前提下,首先選擇自己最擅長的軟件,若發現了更好的軟件,可在掌握新軟件之后逐步替換。雖然動態和靜態業務都傾向于選擇Nginx,但是大前提是自己要熟練掌握Nginx。切記,在工作中不要盲目選擇軟件,這可能最終會導致自己無法控制局面,從而給企業帶來災難性的損失。
?
?
6. Ubuntu下nginx安裝和虛擬站點配置方式
如果在Ubuntu16.04下使用apt安裝nginx,安裝完畢后其工作目錄設置如下:
-
nginx站點配置目錄:/etc/nginx/
-
其中主配置為nginx.conf
-
sites-available子目錄存放站點配置文件,其中有一個default文件為虛擬站點的配置模板,自己的虛擬站點可以以此為模板進行配置。
-
sites-enabled子目錄存放一個對應站點配置文件的軟連接。必須在sites-availabel生成站點的配置文件,然后到sites-enabled添加對應的軟連接。
-
-
默認站點根目錄 : /var/www/html/
-
日志文件目錄:/var/log/nginx/
-
error.log記錄站點的錯誤,如果要查看詳細的錯誤信息,可以打開該文件查看
-
以www.blog.com站點為例說明多個虛擬站點配置的方法:
#安裝nginx sudo service apache2 stop #停止apache sudo apt-get install nginx-full -y ? #虛擬站點配置 #1.首先切換目錄到sites-available目錄 cd /etc/nginx/sites-available ? #2.復制虛擬站點配置模板,生成自己虛擬站點的配置文件 sudo cp default www.blog.com.conf ? ? #3 編輯模板 #---------------------以下為配置內容------------------- server {listen 80; #監聽端口 ?#站點的根目錄root /var/www/html/www.blog.com; ?# Add index.php to the list if you are using PHP#網站默認首頁打開順序index index.html index.htm; #站點名稱,可以有多個名稱,中間用空格隔開server_name www.blog.com blog.com; } ? #------------------到此結束------------------------------ #這個模板比較簡單,如果有復雜的要求,請以此為基礎進行改進 ? #4 保存退出 :wq ? #5 切換到sites-enabled目錄下,創建軟連接 cd ../sites-enabled sudo ln -s /etc/nginx/sites-available/www.blog.com.con ? www.blog.com.conf ? #6 重啟nginx服務 sudo service nginx restart (start/stop) 或者 sudo /etc/init.d/nginx restart ? #7 切換到站點根目錄(根據你自己的設定進行),我假定站點根目錄是/var/www/html cd /var/www/html sudo chmod -R 755 www.blog.com #編輯index.html ? <html> <head> <meta charset='utf-8'> <title>瘋狂程序員的博客</title> </head> <body> ? <h1>瘋狂的程序員</h1> ? </body> </html> #保存退出 :wq ? #8 切換到windows系統下,編輯C:\Windows\System32\drivers\etc\hosts文件,在末尾增加: #ip為你虛擬機的ip地址 192.168.48.3 www.blog.com ? ? #9 在windows系統下瀏覽器里輸入 : www.blog.com 看看是否是你的頁面
7.centos下nginx安裝和配置
-
添加源:
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
-
安裝Nginx
sudo yum install -y nginx
-
啟動Nginx并設置開機自動運行
sudo systemctl start nginx.service sudo systemctl enable nginx.service
-
測試,在瀏覽器中輸入localhost,看缺省網站
##8. 負載均衡
當一臺服務器的單位時間內的訪問量越大時,服務器壓力就越大,大到超過自身承受能力時,服務器就會崩潰。為了避免服務器崩潰,讓用戶有更好的體驗,我們通過負載均衡的方式來分擔服務器壓力。
角色 | ip | 作用 |
---|---|---|
lvs負載均衡 | 10.11.59.220 | 請求分擔 |
web01 | 10.11.59.155 | 輪詢的web服務器 |
web02 | 10.11.59.154 | 輪詢的web服務器 |
-
這三臺機子要求都安裝了nginx環境,web01和web02結構應該是一樣的
8.1 負載均衡服務的配置
? #連接池upstream www_server_pools { #www_server_pools自定義的連接池名稱server 10.11.59.154; ? #連接的服務器,可以ip或者是域名server 10.11.59.155;} ? ?server {listen ? ? ? 80;server_name www.caoliu.com; ?location / {# root ? /data/www;# index index.php index.html index.htm;proxy_pass http://www_server_pools;#http://連接池名稱proxy_set_header ? Host $host; ? #把主機的header頭發給輪詢的服務器proxy_set_header ? X-Forward-For $Remote_addr; #獲取真實的ip地址} ?}
8.2 upstream模塊
是nginx支持負載均衡的模塊,nginx_http_upstream_moudle,它所支持的代理方式:
-
proxy_pass
-
fast_cgi
-
memcache_pass
8.3 常用的輪詢算法
-
rr輪詢算法:靜態調度算法,按照請求的時間順序逐一分配到不同的服務器,如果服務器down掉,就不再向其轉發請求
-
wrr 權重算法,靜態調度算法
? upstream www_server_pools {server 10.11.59.154 weight=1; ?server 10.11.59.155 weight=3;#這個服務器得到的轉發是上面的3倍}
-
ip_hash 根據客戶端ip哈希的結果確定訪問那個服務器。
upstream www_server_pools {server 10.11.59.154;server 10.11.59.155;ip_hash;}
-
第三方的算法
-
fair 按照服務器忙閑,優先將請求給工作量小的服務器
-
url_hash 按照url哈希的結果訪問不同服務器
-