Nginx原理及基礎搭建應用

一、Nginx原理

        nginx的主要着眼點就是其高性能以及對物理計算資源的高密度利用,因此其採用了不同的架構模型。受啓發於多種操作系統設計中基於“事件”的高級處理機制,nginx採用了模塊化、事件驅動、異步、單線程及非阻塞的架構,並大量採用了多路複用及事件通知機制。在nginx中,連接請求由爲數不多的幾個僅包含一個線程的進程worker以高效的迴環(run-loop)機制進行處理,而每個worker可以並行處理數千個的併發連接及請求。

        Nginx的代碼是由一個核心和一系列的模塊組成, 核心主要用於提供Web Server的基本功能,以及Web和Mail反向代理的功能;還用於啓用網絡協議,創建必要的運行時環境以及確保不同的模塊之間平滑地進行交互。不過,大多跟協議相關的功能和某應用特有的功能都是由nginx的模塊實現的。這些功能模塊大致可以分爲事件模塊、階段性處理器、輸出過濾器、變量處理器、協議、upstream和負載均衡幾個類別,這些共同組成了nginx的http功能。事件模塊主要用於提供OS獨立的(不同操作系統的事件機制有所不同)事件通知機制如kqueue或epoll等。協議模塊則負責實現nginx通過http、tls/ssl、smtp、pop3以及imap與對應的客戶端建立會話。

        Nginx的核心模塊爲Main和Events,此外還包括標準HTTP模塊、可選HTTP模塊和郵件模塊,其還可以支持諸多第三方模塊。Main用於配置錯誤日誌、進程及權限等相關的參數,Events用於配置IO模型,如epoll、kqueue、select或poll等,它們是必備模塊。

Nginx的主配置文件由幾個段組成,這個段通常也被稱爲nginx的上下文,每個段的定義格式如下所示。需要注意的是,其每一個指令都必須使用分號(;)結束,否則爲語法錯誤。

        如果負載以CPU密集型應用爲主,如SSL或壓縮應用,則worker數應與CPU數相同;如果負載以IO密集型爲主,如響應大量內容給客戶端,則worker數應該爲CPU個數的1.5或2倍。

        Nginx會按需同時運行多個進程:一個主進程(master)和幾個工作進程(worker),配置了緩存時還會有緩存加載器進程(cache loader)和緩存管理器進程(cache manager)等。所有進程均是僅含有一個線程,並主要通過“共享內存”的機制實現進程間通信。主進程以root用戶身份運行,而worker、cache loader和cache manager均應以非特權用戶身份運行。

主進程主要完成如下工作:

1. 讀取並驗正配置信息;

2. 創建、綁定及關閉套接字;

3. 啓動、終止及維護worker進程的個數;

4. 無須中止服務而重新配置工作特性;

5. 控制非中斷式程序升級,啓用新的二進制程序並在需要時回滾至老版本;

6. 重新打開日誌文件,實現日誌滾動;

7. 編譯嵌入式perl腳本;

worker進程主要完成的任務包括:

1. cache loader進程主要完成的任務包括:

1. 檢查緩存存儲中的緩存對象;

2. 使用緩存元數據建立內存數據庫;

接收、傳入並處理來自客戶端的連接;

2. 提供反向代理及過濾功能;

3. nginx任何能完成的其它任務;


cache manager進程的主要任務:

1. 緩存的失效及過期檢驗;

        Nginx的配置有着幾個不同的上下文:main、http、server、upstream和location(還有實現郵件服務反向代理的mail)。配置語法的格式和定義方式遵循所謂的C風格,因此支持嵌套,還有着邏輯清晰並易於創建、閱讀和維護等優勢。

Nginx的代碼是由一個核心和一系列的模塊組成, 核心主要用於提供Web Server的基本功能,以及Web和Mail反向代理的功能;還用於啓用網絡協議,創建必要的運行時環境以及確保不同的模塊之間平滑地進行交互。不過,大多跟協議相關的功能和某應用特有的功能都是由nginx的模塊實現的。這些功能模塊大致可以分爲事件模塊、階段性處理器、輸出過濾器、變量處理器、協議、upstream和負載均衡幾個類別,這些共同組成了nginx的http功能。事件模塊主要用於提供OS獨立的(不同操作系統的事件機制有所不同)事件通知機制如kqueue或epoll等。協議模塊則負責實現nginx通過http、tls/ssl、smtp、pop3以及imap與對應的客戶端建立會話。

在nginx內部,進程間的通信是通過模塊的pipeline或chain實現的;換句話說,每一個功能或操作都由一個模塊來實現。例如,壓縮、通過FastCGI或uwsgi協議與upstream服務器通信,以及與memcached建立會話等。


二、環境搭建

1、安裝依賴環境  

[root@90src src]#yum groupinstall "Development Tools" "Server Platform Deveopment" -y

[root@90src src]#yum install openssl-devel pcre-devel -y


2、首先添加用戶nginx,實現以之運行nginx服務進程:

[root@90src src]# groupadd -r nginx

[root@90src src]# useradd -r -g nginx nginx

3、編譯安裝

 [root@90src src] tar xf nginx-1.7.5.tar.gz   

 [root@90src nginx-1.7.5]# cd nginx-1.7.5

 [root@90src nginx-1.7.5]#  ./configure   --prefix=/usr   --sbin-path=/usr/sbin/nginx   --conf-path=/etc/nginx/nginx.conf   --error-log-path=/var/log/nginx/error.log   --http-log-path=/var/log/nginx/access.log   --pid-path=/var/run/nginx/nginx.pid    --lock- path=/var/lock/nginx.lock   --user=nginx   --group=nginx   --with-http_ssl_module   --with-http_flv_module   --with-http_stub_status_module   --with-http_gzip_static_module   --http-client-body-temp-path=/var/tmp/nginx/client/   --http-proxy-temp-path=/var/tmp/nginx/proxy/   --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/   --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi   --http-scgi-temp-path=/var/tmp/nginx/scgi   --with-pcre | tee /tmp/nginx.txt

[root@90src nginx-1.7.5]# make && make install

4、爲nginx提供SysV init腳本

[root@90src nginx-1.7.5]# vim /etc/rc.d/init.d/nginx

#!/bin/sh 

# nginx - this script starts and stops the nginx daemon 

# chkconfig:   - 85 15 

# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \ 

#               proxy and IMAP/POP3 proxy server 

# processname: nginx 

# config:      /etc/nginx/nginx.conf 

# config:      /etc/sysconfig/nginx 

# pidfile:     /var/run/nginx.pid 

# Source function library. 

. /etc/rc.d/init.d/functions

# Source networking configuration. 

. /etc/sysconfig/network

# Check that networking is up. 

[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/sbin/nginx"

prog=$(basename $nginx)

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

make_dirs() {

   # make required directories 

   user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`

   options=`$nginx -V 2>&1 | grep 'configure arguments:'`

   for opt in $options; do

       if [ `echo $opt | grep '.*-temp-path'` ]; then

           value=`echo $opt | cut -d "=" -f 2`

           if [ ! -d "$value" ]; then

               # echo "creating" $value 

               mkdir -p $value && chown -R $user $value

           fi

       fi

   done

}

start() {

    [ -x $nginx ] || exit 5

    [ -f $NGINX_CONF_FILE ] || exit 6

    make_dirs

    echo -n $"Starting $prog: " 

    daemon $nginx -c $NGINX_CONF_FILE

    retval=$?

    echo 

    [ $retval -eq 0 ] && touch $lockfile

    return $retval

}

stop() {

    echo -n $"Stopping $prog: " 

    killproc $prog -QUIT

    retval=$?

    echo 

    [ $retval -eq 0 ] && rm -f $lockfile

    return $retval

}

restart() {

    configtest || return $?

    stop

    sleep 1

    start

}

reload() {

    configtest || return $?

    echo -n $"Reloading $prog: " 

    killproc $nginx -HUP

    RETVAL=$?

    echo 

}

force_reload() {

    restart

}

configtest() {

  $nginx -t -c $NGINX_CONF_FILE

}

rh_status() {

    status $prog

}

rh_status_q() {

    rh_status >/dev/null 2>&1

}

case "$1" in

    start)

        rh_status_q && exit 0

        $1

        ;;

    stop)

        rh_status_q || exit 0

        $1

        ;;

    restart|configtest)

        $1

        ;;

    reload)

        rh_status_q || exit 7

        $1

        ;;

    force-reload)

        force_reload

        ;;

    status)

        rh_status

        ;;

    condrestart|try-restart)

        rh_status_q || exit 0

            ;;

    *)

        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" 

        exit 2

esac

         

5、爲腳本賦權並加入開機啓動

[root@90src nginx-1.7.5]# vim /etc/rc.d/init.d/nginx

[root@90src nginx-1.7.5]# chmod +x /etc/rc.d/init.d/nginx

[root@90src nginx-1.7.5]# chkconfig --add nginx

[root@90src nginx-1.7.5]# chkconfig nginx on

6、啓動併產看端口

[root@90sec nginx-1.7.5]# service nginx start


Starting nginx:                                            [  OK  ]

[root@90sec nginx-1.7.5]# ss -anlpt | grep nginx

LISTEN     0      128      *:80      *:*      users:(("nginx",6846,6),("nginx",6847,6))

7、測試

wKioL1Qgy3_CJmG4AAG3UbbAiqI623.jpg

三、nginx限速設置

   nginx的限速功能通過limit_zone、limit_conn和limit_rate指令進行配置。首先需要在http上下文配置一個limit_zone,然後在需要的地方使用limit_conn和limit_rate 進行限速設置。

limit_zone:語法格式“limit_req_zone $variable zone=name:size rate=rate;”,實現針對每個IP定義一個存儲session狀態的容器。這個示例中定義了一個名叫first的10m大小的容器,這個名字會在後面的limit_conn中使用。

limit_conn first 1; 限制在first中記錄狀態的每個IP只能發起一個併發連接。

limit_rate 50k; 對每個連接限速50k. 注意,這裏是對連接限速,而不是對IP限速。如果一個IP允許三個併發連接,那麼這個IP就是限速爲limit_rate×3,在設置的時候要根據自己的需要做設置調整,要不然會達不到自己希望的目的。

 
















後面繼續更新。。。。。。。。。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章