Nginx的工作机制
- Nginx 可以处理多少个请求由 work 来决定, work 越多处理的请求就越多, 它底层是通过一个争抢机制, 默认会启动两个进程, 分别是 Master & worker
- master 就是Nginx 的主进程, 用户发送的所有请求会先进入到 Master 主进程里, 进入到 Master 主进程之后, master 会将通知 worker , 然后每个worker 都会去争抢这个请求, 谁抢到谁就连接客户端去处理
- 客户端发送请求进来, 就像是一块肉 , Master 就会 通知 worker , 然后worker 分别就去抢, 谁抢到谁就有肉吃 , 如果请求进来的是静态请求 , worker自己去处理, 如果是动态请求交给 Tomcat 去处理, 实现动静分离 .
Master - workers的机制的好处
- 首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
- 其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。
- 当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
需要设置多少个worker
- Nginx 同 redis 类似都采用了 io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个cpu的性能发挥到极致。
- 所以 worker 数和服务器的 cpu 数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
设置worker数量
- worker 的数量最好和 CPU 的核心数保持一致, 可以让服务器的性能发挥到极致
- 在Nginx配置文件中配置, 命令 :
vim /usr/local/nginx/conf/nginx.conf
worker 绑定 CPU
- worker 绑定 CPU (4 worker 绑定 4个 CPU )。
worker_cpu_affinity 0001 0010 0100 1000
- 如图
- 绑定完, 保存后重新加载 Nginx 的配置文件 :
nginx -s reload
- 重新查看启动的 nginx 进程 时发现已经有 4 个 worker 了
- 如图
- worke 绑定 CPU (4 worker绑定 8个 CPU 中的4个) 。[ 通过二进制的方式绑定 ]
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
连接数
- 这个值是表示每个worker进程最大可以建立的连接数 [
1024
] - 如图
- 计算一个 Nginx能建立的最大连接数[
最大并发数量
]
orker_connections * worker_processes
- 如果是支持HTTP1.1 的浏览器每次访问要占两个连接, 所以普通的静态访问最大并发数是
worker_connections * worker_processes /2
- 而如果是HTTP作为反向代理来说,最大并发数量应该是
worker_connections * worker_processes / 4
- 因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
每个连接指的是对系统中的文件进行读或写操作,进程最大连接数指的是进程最大可打开文件数,受限于操作系统,可以通过 ulimit -n 命令查询(默认1024),也可以通过 ulimit -SHn 65535修改进程最大可打开文件数(数字不是越大越好,nginx占用内存越小处理性能越高)
设置开机自启
- 创建一个开机启动的脚本:
vim /etc/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/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
- 修改文件权限,并加入服务列表
- 修改权限:
chmod 777 /etc/init.d/nginx
- 添加到服务列表:
chkconfig --add /etc/init.d/nginx
- 设置开机启动:
chkconfig nginx on
感谢阅读, 以上就是对 Nginx快速安装的过程了, 如有什么更好的建议或方法 ,可以留言或进群交流:1101584918,欢迎大家加入。