Nginx原理與優化參數配置

Nginx的工作機制

  • Nginx 可以處理多少個請求由 work 來決定, work 越多處理的請求就越多, 它底層是通過一個爭搶機制, 默認會啓動兩個進程, 分別是 Master & worker
  • master 就是Nginx 的主進程, 用戶發送的所有請求會先進入到 Master 主進程裏, 進入到 Master 主進程之後, master 會將通知 worker , 然後每個worker 都會去爭搶這個請求, 誰搶到誰就連接客戶端去處理
    在這裏插入圖片描述
  • 客戶端發送請求進來, 就像是一塊肉 , Master 就會 通知 worker , 然後worker 分別就去搶, 誰搶到誰就有肉喫 , 如果請求進來的是靜態請求 , worker自己去處理, 如果是動態請求交給 Tomcat 去處理, 實現動靜分離 .
    在這裏插入圖片描述
Master - workers的機制的好處
  1. 首先,對於每個worker進程來說,獨立的進程,不需要加鎖,所以省掉了鎖帶來的開銷,同時在編程以及問題查找時,也會方便很多。
  2. 其次,採用獨立的進程,可以讓互相之間不會影響,一個進程退出後,其它進程還在工作,服務不會中斷,master進程則很快啓動新的worker進程。
  3. 當然,worker進程的異常退出,肯定是程序有bug了,異常退出,會導致當前worker上的所有請求失敗,不過不會影響到所有請求,所以降低了風險。

需要設置多少個worker

  1. Nginx 同 redis 類似都採用了 io多路複用機制,每個worker都是一個獨立的進程,但每個進程裏只有一個主線程,通過異步非阻塞的方式來處理請求, 即使是千上萬個請求也不在話下。每個 worker 的線程可以把一個cpu的性能發揮到極致。
  2. 所以 worker 數和服務器的 cpu 數相等是最爲適宜的。設少了會浪費 cpu,設多了會造成 cpu 頻繁切換上下文帶來的損耗。

設置worker數量

  1. worker 的數量最好和 CPU 的核心數保持一致, 可以讓服務器的性能發揮到極致
  2. 在Nginx配置文件中配置, 命令 : vim /usr/local/nginx/conf/nginx.conf
    在這裏插入圖片描述

worker 綁定 CPU

  1. worker 綁定 CPU (4 worker 綁定 4個 CPU )。

worker_cpu_affinity 0001 0010 0100 1000

  1. 如圖
    在這裏插入圖片描述
  2. 綁定完, 保存後重新加載 Nginx 的配置文件 : nginx -s reload
  3. 重新查看啓動的 nginx 進程 時發現已經有 4 個 worker 了
  4. 如圖
    在這裏插入圖片描述
  5. worke 綁定 CPU (4 worker綁定 8個 CPU 中的4個) 。[ 通過二進制的方式綁定 ]

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000

連接數

  1. 這個值是表示每個worker進程最大可以建立的連接數 [ 1024 ]
  2. 如圖
    在這裏插入圖片描述
  3. 計算一個 Nginx能建立的最大連接數[ 最大併發數量]

orker_connections * worker_processes

  1. 如果是支持HTTP1.1 的瀏覽器每次訪問要佔兩個連接, 所以普通的靜態訪問最大併發數是

worker_connections * worker_processes /2

  1. 而如果是HTTP作爲反向代理來說,最大併發數量應該是

worker_connections * worker_processes / 4

  1. 因爲作爲反向代理服務器,每個併發會建立與客戶端的連接和與後端服務的連接,會佔用兩個連接。

每個連接指的是對系統中的文件進行讀或寫操作,進程最大連接數指的是進程最大可打開文件數,受限於操作系統,可以通過 ulimit -n 命令查詢(默認1024),也可以通過 ulimit -SHn 65535修改進程最大可打開文件數(數字不是越大越好,nginx佔用內存越小處理性能越高)

設置開機自啓

  1. 創建一個開機啓動的腳本:vim /etc/init.d/nginx
  2. 添加以下內容:
#!/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/local/bin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/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:.*--user=" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   if [ -n "$user" ]; then
      if [ -z "`grep $user /etc/passwd`" ]; then
         useradd -M -s /bin/nologin $user
      fi
      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
    fi
}
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

  1. 修改文件權限,並加入服務列表
  2. 修改權限:chmod 777 /etc/init.d/nginx
  3. 添加到服務列表:chkconfig --add /etc/init.d/nginx
  4. 設置開機啓動:chkconfig nginx on

感謝閱讀, 以上就是對 Nginx快速安裝的過程了, 如有什麼更好的建議或方法 ,可以留言或進羣交流:1101584918,歡迎大家加入。

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