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,歡迎大家加入。