1. 程式人生 > >Nginx技術詳解(1)

Nginx技術詳解(1)

web服務器 nginx


Nginx Web服務應用:

Nginx(engine x)是一個開源的,支持高並發的www服務和代理服務軟件。

Nginx是俄羅斯人Igor Sysoev開發的,最初被應用到俄羅斯的大型網站(www.rambler.ru)上。後來作者將源代碼以類BSD許可證的形式開源出來供全球使用。

在功能應用方面,Nginx不僅是一個優秀的Web服務軟件,還具有反向代理負載均衡和緩存的功能。

在反向代理負載均衡方面類似於LVS負載均衡及HAProxy等你專業代理軟件。

Nginx部署起來更加方便簡單,在緩存服務功能方面,有類似於Squid等專業的緩存服務軟件。

Nginx可以運行在UNIX、Linux、MS Windows Server、Mac OS X Server、Solaris等操作系統中。


Nginx的重要特性:

--可以針對靜態資源高速節點並發訪問及緩存。

--可以使用反向代理加速,並且可以進行數據緩存。

--具有簡單負載均衡,節點健康檢查和容錯功能。

--支持遠程Fast CGI服務的緩存加速。

--支持Fast CGI、Uwsgi、SCGI、Memcached Server的加速和緩存。

--支持SSL、TLS、SNI。

--具有模塊化的架構:

--過濾器包括gzip壓縮、ranges支持、chunked響應、XSLT、SSL和圖像縮放等功能。

--在SSL過濾器中,包含多個SSL頁面,如果經由Fast CGI或反向代理處理,可以並行處理。


Nginx所具備的www服務特性:

--支持基於域名、端口和IP的虛擬主機配置。

--支持KeepAlived和piplined連接。

--可進行簡單、方便、靈活的配置和管理。

--支持修改Nginx配置,並且在代碼上線時,可平滑重啟,不中斷業務訪問。

--可自定義訪問日誌格式,臨時緩沖寫日誌操作,快速日誌輪詢及通過rsyslog處理日誌。

--可利用信號控制Nginx進程。

--支持3xx-5xxHTTP狀態碼重定向。

--支持rewrite模塊,支持URI重寫及正則表達式匹配。

--支持基於客戶端IP地址和HTTP基本認證的訪問控制。

--支持PUT、DELETE、MKCOL、COPY、MOVE等特殊的HTTP請求方法。

--支持FLV流和MP4流技術產品應用。

--支持HTTP響應速率限制。

--支持同一IP地址的並發連接或請求限制。

--支持郵件服務代理。


面試必備:

--支持高並發,可以支持幾百萬並發連接。

--資源消耗少,在3萬並發連接下,可以開啟10個nginx的線程消耗的內存不到200MB。

--可以做HTTP反向代理及加速緩存,及負載均衡功能,內置對RS節點服務器健康檢查功能,折現但能夠與專業的HAProxy或LVS的功能。

--具備Squid等專業緩存軟件等的緩存功能。

--支持異步網絡I/O事件模型epoll(Linux2.6+)。


Nginx軟件主要企業應用:

--作為Web服務軟件

--使用Nginx運行HTML、JS、CSS、小圖片等靜態數據(類似於Lighttpd)

--結合Fast CGI運行PHP等動態程序(例如使用fastcgi_pass方式)

--Nginx結合Tomcat/Resin等支持Java動態程序(常用proxy_pass)

--反向代理或負載均衡服務(Nginx從1.9.0開始就開始支持TCP的代理了)

--前端業務數據緩存服務


Web服務應用產品性能對比:

--靜態數據的訪問上:

--處理小文件(小於1MB)時,Nginx和Lighttpd比Apache更有優勢,Nginx處理小文件的優勢明顯,Lighttpd綜合最強。

--動態數據的訪問上:

--三者差距不大,Apache更有優勢,因為處理動態數據的能力在於PHP(Java)和後端數據庫的服務能力,也就是說瓶頸不在Web服務器上。

--一般情況下普通PHP引擎支持的並發連接參考值300~1000。

--Java引擎和數據庫的並發連接參考值300~1500。


為什麽Nginx比Apache的性能高:

Nginx使用最新版的eepoll(Linux 2.6內核)和kqueue(FreeBSD)異步網絡I/O模型,而Apache使用的是傳統的select模型。

目前Linux下能夠承受高並發訪問的Squid、Memcached軟件采用都是epoll模型。

處理大量的連接的讀寫時,Apache所采用的select網絡I/O模型比較低。


如何正確采用Web服務器:

--靜態業務:如果是高並發場景,盡量采用Nginx或Lighttpd,二者首選Nginx。

--動態業務:理論上采用Nginx和Apache均可,建議使用Nginx,為了避免相同業務服務的軟件多樣化,增加維護成本,動態業務可以使用Nginx兼做前端代理,再根據頁面的元素或目錄轉發到其他的服務器進行處理。

--既有動態業務又有靜態業務,就用Nginx。


編譯安裝Nginx:

(1)安裝Nginx需要的pcre(Perl兼容正則表達式)庫,允許Nginx使用rewrite模塊提供URL重寫功能。

yum install pcre pcre-devel -y

(2)安裝openssl-devel,允許Nginx提供HTTPS服務。

yum install openssl-devel -y


mkdir -p /home/root/tools #創建工具目錄

cd /home/root/tools #進入工具目錄

tar -zxvf ./nginx-1.13.4.tar.gz #解壓Nginx代碼文件

cd ./nginx-1.13.4 #進入源代碼目錄

useradd nginx -s /sbin/nologin -M

#Do not create the user‘s home directory, even if the system wide setting from /etc/login.defs (CREATE_HOME)is set to yes.

#-M參數指定不要創建home目錄,即使系統範圍設置/etc/login.defs指定了yes。

#-s參數指定創建用戶時設置用戶的登錄shell,這裏指定為不可登錄,作為服務進程賬號使用。

./configure --user=nginx --group=nginx --prefix=/application/nginx-1.13.4/ --with-http_stub_status_module --with-http_ssl_module

make && make install

ln -s /application/nginx-1.13.4/ /application/nginx #創建軟連接

#當Nginx軟件升級編譯安裝或帶新版本後,刪除原來的軟連接,再重新建立新的軟連接就好,如果程序中引用nginx路徑的地方不需要做任何更改。

#--with-http_stub_status_module 激活狀態信息

#--with-http_ssl_module 開啟SSL加密支持

#Nginx的大部分模塊都會默認編譯到軟件中,不需要單獨指定編譯參數。

(3)啟動Nginx

/application/nginx/sbin/nginx -t #啟動的時候檢查語法錯誤

nginx: the configuration file /application/nginx-1.13.4//conf/nginx.conf syntax is ok

nginx: configuration file /application/nginx-1.13.4//conf/nginx.conf test is successful

/application/nginx/sbin/nginx #啟動Nginx

lsof -i :80 #查看Nginx服務端口是否成功啟動

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

nginx 37232 root 6u IPv4 92444 0t0 TCP *:http (LISTEN)

nginx 37233 nginx 6u IPv4 92444 0t0 TCP *:http (LISTEN)

#也可以通過netstat命令查看:

netstat -tunlap | grep :80

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 37232/nginx

使用瀏覽器訪問http://192.168.10.3,或者使用curl命令:

curl http://192.168.10.3

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

<style>

body {

width: 35em;

margin: 0 auto;

font-family: Tahoma, Verdana, Arial, sans-serif;

}

</style>

</head>

<body>

<h1>Welcome to nginx!</h1>

<p>If you see this page, the nginx web server is successfully installed and

working. Further configuration is required.</p>


<p>For online documentation and support please refer to

<a href="http://nginx.org/">nginx.org</a>.<br/>

Commercial support is available at

<a href="http://nginx.com/">nginx.com</a>.</p>


<p><em>Thank you for using nginx.</em></p>

</body>

</html>


Nginx故障集錦:

(1)編譯安裝的時候遇到的錯誤:

./configure:error:SSL modules require the OpenSSL library.

You can either do not enable the modules,or install the OpenSSL library into the system,or build the OpenSSL library statically from the source with nginx by using --with-openssl=<path> option.

(2)Nginx啟動疑難雜癥:

--報錯“nginx:[emerg]getpwnam("nginx")failed”:

因為沒有對應的Nginx服務用戶,執行useradd nginx -s /sbin/nologin -M 創建用戶即可。

(3)編譯安裝PCRE軟件的時候,gcc不全導致報錯:

make all-am

make[1]:Entering directory `/home/root/tools/pcre-8.30`

CXX pcrecpp.lo

libtool:compile:unrecognized option `-DHAVE_CONFIG_H`

libtool:compile:Try`libtool --help‘ for more infomation`

make[1]:***[pcrecpp.lo] error 1

make[1]:Leaving directory `/home/root/tools/pcre-8.30`

make:***[all] error 2

使用yum install gcc-c++ gcc -y安裝

(4)查看Nginx的編譯參數:

/application/nginx/sbin/nginx -V

nginx version: nginx/1.13.4

built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)

built with OpenSSL 1.0.1e-fips 11 Feb 2013

TLS SNI support enabled

configure arguments: --user=nginx --group=nginx --prefix=/application/nginx-1.13.4/ --with-http_stub_status_module --with-http_ssl_module

(5)瀏覽器訪問不了Nginx網頁

需要在服務器端和客戶端進行排查:

服務器端:

--首先關閉SELinux:

setforce 0 #臨時設置來臨時生效

vim /etc/selinux/config #更改SELinux的配置文件,下次開機時生效

SELINUX=disabled #更改參數

:wq

--然後檢查防火墻:

/etc/init/iptables stop #設置防火墻是關閉狀態

chkconfig iptables off #取消開機自啟

--再查看Nginx的端口是否開啟:

netstat -tunlap | grep :80

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 37232/nginx

--查看Nginx進程是否存在:

ps -aux | grep nginx

root 37232 0.0 0.1 44764 1080 ? Ss 04:13 0:00 nginx: master process /application/nginx/sbin/nginx

nginx 37233 0.0 0.1 45196 1984 ? S 04:13 0:00 nginx: worker process

root 38013 0.0 0.0 103308 848 pts/0 S+ 07:06 0:00 grep nginx

--可以查看Nginx的日誌:

cat /application/nginx/logs/error.log

客戶端:

--在客戶端上ping服務器端IP地址:

ping -c3 192.168.10.3 #使用-c參數指定ping發送數據包的次數

PING 192.168.10.3 (192.168.10.3) 56(84) bytes of data.

64 bytes from 192.168.10.3: icmp_seq=1 ttl=64 time=0.036 ms

64 bytes from 192.168.10.3: icmp_seq=2 ttl=64 time=0.029 ms

64 bytes from 192.168.10.3: icmp_seq=3 ttl=64 time=0.025 ms


--- 192.168.10.3 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2001ms

rtt min/avg/max/mdev = 0.025/0.030/0.036/0.004 ms

檢查客戶端的telnet服務器端的IP地址,端口是否開啟:

telnet 192.168.10.3

使用瀏覽器檢查,訪問測試。


本文出自 “帥帥的小哥哥” 博客,請務必保留此出處http://xvjunjie.blog.51cto.com/12360960/1955103

Nginx技術詳解(1)