1. 程式人生 > >企業 - nginx

企業 - nginx

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 內部做了些什麽事情,那麽,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 conf]# vim nginx.conf

技術分享圖片

[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

技術分享圖片

技術分享圖片




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

技術分享圖片

客戶端測試(做解析)

技術分享圖片


[root@server1 conf]# vim nginx.conf 再加入所維護的域
技術分享圖片

技術分享圖片

測試

技術分享圖片


[root@server1 conf]# vim nginx.conf

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

cara為之前定義的upstream !

技術分享圖片


[root@server1 conf]# nginx -s reload


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

[root@server1 nginx-1.10.1]# make && make install

開啟服務

技術分享圖片

技術分享圖片


但在瀏覽器訪問時,不會跳動(類似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漂移

技術分享圖片


客戶訪問不會出現問題

技術分享圖片



企業 - nginx