nginx
Nginx (engine x) 是一個高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。
Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,并在一個BSD-like 協定下發行。其特點是占有記憶體少,并發能力強
Nginx 特點
Nginx 做為 HTTP 伺服器,有以下幾項基本特性:
- 處理靜态檔案,索引檔案以及自動索引;打開檔案描述符緩沖.
- 無緩存的反向代理加速,簡單的負載均衡和容錯.
- FastCGI,簡單的負載均衡和容錯.
-
子產品化的結構。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等
filter。如果由 FastCGI 或其它代理伺服器處理單頁中存在的多個 SSI,則這項處理可以并行運作,而不需要互相等待。
- 支援 SSL 和 TLSSNI.
Nginx 的工作方式
Nginx 是以多程序的方式來工作的,當然 Nginx 也是支援多線程的方式的,隻是我們主流的方式還是多程序的方式,也是 Nginx 的預設方式
Nginx 在啟動後,會有一個 master 程序和多個 worker 程序。master 程序主要用來管理 worker
程序,包含:接收來自外界的信号,向各 worker 程序發送信号,監控 worker 程序的運作狀态,當 worker
程序退出後(異常情況下),會自動重新啟動新的 worker 程序。而基本的網絡事件,則是放在 worker 程序中來處理了。多個 worker
程序之間是對等的,他們同等競争來自用戶端的請求,各程序互相之間是獨立的。一個請求,隻可能在一個 worker 程序中處理,一個 worker
程序,不可能處理其它程序的請求。worker 程序的個數是可以設定的,一般我們會設定與機器cpu核數一緻,這裡面的原因與 Nginx
的程序模型以及事件處理模型是分不開的。Nginx 的程序模型
當我們在操作 Nginx 的時候,Nginx 内部做了些什麼事情,那麼,worker 程序又是如何處理請求的呢?我們前面有提到,worker
程序之間是平等的,每個程序,處理請求的機會也是一樣的。當我們提供 80 端口的 http
服務時,一個連接配接請求過來,每個程序都有可能處理這個連接配接,怎麼做到的呢?首先,每個 worker 程序都是從 master 程序 fork
過來,在 master 程序裡面,先建立好需要 listen 的 socket(listenfd)之後,然後再 fork 出多個 worker
程序。所有 worker 程序的 listenfd 會在新連接配接到來時變得可讀,為保證隻有一個程序處理該連接配接,所有 worker 程序在注冊
listenfd 讀事件前搶 accept_mutex,搶到互斥鎖的那個程序注冊 listenfd 讀事件,在讀事件裡調用 accept
接受該連接配接。當一個 worker 程序在 accept
這個連接配接之後,就開始讀取請求,解析請求,處理請求,産生資料後,再傳回給用戶端,最後才斷開連接配接,這樣一個完整的請求就是這樣的了。我們可以看到,一個
請求,完全由 worker 程序來處理,而且隻在一個 worker 程序中處理。
為什麼 Nginx 采用異步非阻塞的方式來處理呢
首先,請求過來,要建立連接配接,然後再接收資料,接收資料後,再發送資料。具體到系統底層,就是讀寫事件,而當讀寫事件沒有準備好時,必然不可操作,如果不
用非阻塞的方式來調用,那就得阻塞調用了,事件沒有準備好,那就隻能等了,等事件準備好了,再繼續。阻塞調用會進入核心等待,cpu
就會讓出去給别人用了,對單線程的 worker 來說,顯然不合适,當網絡事件越多時,大家都在等待呢,cpu
空閑下來沒人用,cpu使用率自然上不去了,更别談高并發了。
非阻塞就是,事件沒有準備好,馬上傳回 EAGAIN,告訴你,事件還沒準備好呢,你過一會,再來檢查一下事件,直到事件準備好了為止,在這期間,你就可以先去做其它事情,然後再來看看事件好了沒。阻塞調用會進入核心等待,cpu 就會讓出去給别人用了,對單線程的 worker 來說,顯然不合适,當網絡事件越多時,大家都在等待呢,cpu 空閑下來沒人用,cpu使用率自然上不去了,更别談高并發了。
優點
Nginx 可以在大多數 UnixLinux OS 上編譯運作,并有 Windows 移植版。 Nginx 的1.4.0穩定版已經于2013年4月24日釋出,一般情況下,對于建立站點,建議使用最新穩定版作為生産版本,已有站點的更新急迫性不高
Nginx 是一個很強大的高性能Web和反向代理伺服器,它具有很多非常優越的特性:
在連接配接高并發的情況下,Nginx是Apache伺服器不錯的替代品:Nginx在美國是做虛拟主機生意的老闆們經常選擇的軟體平台之一。能夠支援高達 50,000 個并發連接配接數的響應,感謝Nginx為我們選擇了 epoll and kqueue作為開發模型。
實驗
實驗環境
server1 nginx主機
server2 http
server3 http
server4 nginx
server1
[root@server1 ~]# tar zxf nginx-1.10.1.tar.gz 解壓
[root@server1 core]# pwd
/root/nginx-1.10.1/src/core
[root@server1 core]# vim nginx.h 去掉後面内容如下
[root@server1 cc]# pwd
/root/nginx-1.10.1/auto/cc
[root@server1 cc]# vim gcc 将debug下,此内容注釋
編譯
[root@server1 nginx-1.10.1]# yum install -y pcre-devel openssl-devel zlib-devel gcc 安裝依賴性
[root@server1 nginx-1.10.1]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
[root@server1 nginx-1.10.1]# make && make install
編譯完成
開啟服務
服務已打開
檢視服務端口,如下80端口已開
浏覽器通路nginx主機
添加使用者
[root@server1 conf]# useradd -u 800 nginx
[root@server1 conf]# pwd
/usr/local/nginx/conf
[root@server1 conf]# vim nginx.conf
做軟連接配接,平滑加載
lscpu 可列出cpu相關資訊
也可更改worker數
[root@server1 conf]# vim nginx.conf
[root@server1 conf]# nginx -s reload 重新加載
[root@server1 conf]# ulimit -SHn
[root@server1 conf]# ulimit -a
[root@server1 security]# pwd
/etc/security
[root@server1 security]# vim limits.conf
[root@server1 conf]# vim nginx.conf 修改配置檔案
制作證書
[root@server1 certs]# make cert.pem
浏覽器通路
https://192.168.122.11
[root@server1 conf]# vim nginx.conf 修改配置檔案,加入子產品
[root@server1 conf]# nginx -s reload
加入http虛拟主機
建立目錄,編寫首頁,重新加載服務
用戶端測試(做解析)
[root@server1 conf]# vim nginx.conf 再加入所維護的域
測試
proxy_pass http://cara; #負載均衡
cara為之前定義的upstream !
server2,3安裝http服務
[root@server2 ~]# yum install -y httpd
[root@server2 ~]# /etc/init.d/httpd start 開啟服務
[root@server3 ~]# yum install -y httpd
[root@server3 ~]# /etc/init.d/httpd start
[root@server3 ~]# vim /etc/httpd/conf/httpd.conf 修改端口,因為nginx主機定義的是8080
[root@server3 ~]# /etc/init.d/httpd restart
server2,3的頁面如下,實際生活中應該是一緻的,為了檢視實驗效果,測試頁不同
用戶端測試
可通過加入不同的參數,實作不同的需求
eg1
eg2
eg3
eg4
會報錯
#重新編譯時,先關掉,否則和會覆寫之前的編譯
[root@server1 nginx-1.10.1]# ./configure --help
[root@server1 nginx-1.10.1]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --add-module=/root/nginx-sticky-module-ng
但在浏覽器通路時,不會跳動(類似ip_hash)
高可用
[root@server1 local]# scp -r nginx/ [email protected]:/usr/local
建立使用者,開啟服務
server1,4均安裝ricci服務,設定密碼,設定為開機啟動
[root@server4 local]# yum install -y ricci 安裝服務
[root@server1 local]# yum install -y ricci 安裝服務
[root@server1 local]# yum install -y luci 安裝服務
[root@server1 local]# chkconfig luci on 設定開機啟動
浏覽器通路,做好解析
https://server1:8084 進入叢集資料總管
[root@server1 ~]# clustat 檢視叢集
fence-控制斷電
root@foundation12 Desktop]# systemctl status libvirted 用實體機做fence,檢視狀态
[root@foundation12 Desktop]# cd /etc/cluster/
[root@foundation12 cluster]# ls
fence_xvm.key
[root@foundation12 cluster]# dd if=/dev/urandom of=/etc/cluster/fence_xvm.key bs=128 count=1 做鑰匙
[root@foundation12 cluster]# scp fence_xvm.key [email protected]:/etc/cluster
[email protected]'s password:
fence_xvm.key 100% 128 0.1KB/s 00:00
[root@foundation12 cluster]# scp fence_xvm.key [email protected]:/etc/cluster
[email protected]'s password:
fence_xvm.key 100% 128 0.1KB/s 00:00
對叢集所做的操作,我們可以在/etc/cluster目錄下檢視
[root@server1 cluster]# nginx -s stop 關掉nginx服務
寫腳本,改執行方法
[root@server1 init.d]# chmod +x nginx 加執行權限
[root@server1 init.d]# /etc/init.d/nginx start 開啟服務
server4同樣操作
測試,當關掉server1的nginx服務後
vip漂移
客戶通路不會出現問題