天天看點

企業 - nginx

                                       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 的時候,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   解壓

企業 - nginx

[root@server1 core]# pwd

/root/nginx-1.10.1/src/core

[root@server1 core]# vim nginx.h   去掉後面内容如下

企業 - nginx

[root@server1 cc]# pwd

/root/nginx-1.10.1/auto/cc

[root@server1 cc]# vim gcc   将debug下,此内容注釋

企業 - nginx

編譯

[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

編譯完成

企業 - nginx

開啟服務

企業 - nginx

服務已打開

企業 - nginx

檢視服務端口,如下80端口已開

企業 - nginx

浏覽器通路nginx主機

企業 - nginx

添加使用者

[root@server1 conf]# useradd -u 800 nginx

企業 - nginx

[root@server1 conf]# pwd

/usr/local/nginx/conf

[root@server1 conf]# vim nginx.conf

企業 - nginx

做軟連接配接,平滑加載

企業 - nginx

lscpu 可列出cpu相關資訊

也可更改worker數

[root@server1 conf]# vim nginx.conf  

企業 - nginx

[root@server1 conf]# nginx -s reload   重新加載

企業 - nginx

[root@server1 conf]# ulimit -SHn

[root@server1 conf]# ulimit -a

企業 - nginx
企業 - nginx
企業 - nginx

[root@server1 security]# pwd

/etc/security

[root@server1 security]# vim limits.conf

企業 - nginx
企業 - nginx

[root@server1 conf]# vim nginx.conf   修改配置檔案

企業 - nginx
企業 - nginx

制作證書

[root@server1 certs]# make cert.pem

企業 - nginx
企業 - nginx
企業 - nginx

浏覽器通路

https://192.168.122.11

企業 - nginx

[root@server1 conf]# vim nginx.conf    修改配置檔案,加入子產品

企業 - nginx

[root@server1 conf]# nginx -s reload

企業 - nginx

加入http虛拟主機

企業 - nginx
企業 - nginx

建立目錄,編寫首頁,重新加載服務

企業 - nginx

用戶端測試(做解析)

企業 - nginx

[root@server1 conf]# vim nginx.conf  再加入所維護的域

企業 - nginx
企業 - nginx

測試

企業 - nginx

proxy_pass http://cara;   #負載均衡

cara為之前定義的upstream !

企業 - nginx

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

企業 - nginx

[root@server3 ~]# /etc/init.d/httpd restart

server2,3的頁面如下,實際生活中應該是一緻的,為了檢視實驗效果,測試頁不同

企業 - nginx
企業 - nginx

用戶端測試

企業 - nginx

可通過加入不同的參數,實作不同的需求

eg1

企業 - nginx
企業 - nginx

eg2

企業 - nginx
企業 - nginx

eg3

企業 - nginx
企業 - nginx

eg4

企業 - nginx

會報錯

企業 - nginx

#重新編譯時,先關掉,否則和會覆寫之前的編譯

企業 - nginx

[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

企業 - nginx
企業 - nginx

但在浏覽器通路時,不會跳動(類似ip_hash)

企業 - nginx

高可用

[root@server1 local]# scp -r nginx/ [email protected]:/usr/local  

企業 - nginx

建立使用者,開啟服務

企業 - nginx

server1,4均安裝ricci服務,設定密碼,設定為開機啟動

[root@server4 local]# yum install -y ricci   安裝服務

[root@server1 local]# yum install -y ricci   安裝服務

企業 - nginx
企業 - nginx

[root@server1 local]# yum install -y luci  安裝服務

企業 - nginx

[root@server1 local]# chkconfig luci on  設定開機啟動

浏覽器通路,做好解析

https://server1:8084      進入叢集資料總管

企業 - nginx
企業 - nginx

[root@server1 ~]# clustat   檢視叢集

企業 - nginx

fence-控制斷電

root@foundation12 Desktop]# systemctl status libvirted  用實體機做fence,檢視狀态

企業 - nginx
企業 - nginx
企業 - nginx
企業 - nginx

[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  做鑰匙

企業 - nginx

[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   

企業 - nginx
企業 - nginx

對叢集所做的操作,我們可以在/etc/cluster目錄下檢視

企業 - nginx
企業 - nginx

[root@server1 cluster]# nginx -s stop    關掉nginx服務

寫腳本,改執行方法

[root@server1 init.d]# chmod +x nginx    加執行權限

[root@server1 init.d]# /etc/init.d/nginx start   開啟服務

server4同樣操作

企業 - nginx
企業 - nginx

測試,當關掉server1的nginx服務後

企業 - nginx

vip漂移

企業 - nginx

客戶通路不會出現問題

繼續閱讀