Nginx的工作机制

  • Nginx 可以处理多少个请求由 work 来决定, work 越多处理的请求就越多, 它底层是通过一个争抢机制, 默认会启动两个进程, 分别是 Master & worker
  • master 就是Nginx 的主进程, 用户发送的所有请求会先进入到 Master 主进程里, 进入到 Master 主进程之后, master 会将通知 worker , 然后每个worker 都会去争抢这个请求, 谁抢到谁就连接客户端去处理

Nginx原理与优化参数配置_nginx

  • 客户端发送请求进来, 就像是一块肉 , Master 就会 通知 worker , 然后worker 分别就去抢, 谁抢到谁就有肉吃 , 如果请求进来的是静态请求 , worker自己去处理, 如果是动态请求交给 Tomcat 去处理, 实现动静分离 .

Nginx原理与优化参数配置_HTTP_02

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
  3. Nginx原理与优化参数配置_nginx_03


worker 绑定 CPU
  1. worker 绑定 CPU (4 worker 绑定 4个 CPU )。

worker_cpu_affinity 0001 0010 0100 1000

  1. 如图

Nginx原理与优化参数配置_linux_04

  1. 绑定完, 保存后重新加载 Nginx 的配置文件 : nginx -s reload
  2. 重新查看启动的 nginx 进程 时发现已经有 4 个 worker 了
  3. 如图
  4. 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,欢迎大家加入。