傳統(tǒng)上基于進程或線程模型架構的web服務通過每進程或每線程處理并發(fā)請求,這勢必會在網(wǎng)絡和I/O操作時產(chǎn)生阻塞,其另一個必然結果則是對內(nèi)存或CPU的利用率低下。生成一個新的進程/線程需要事先備好其運行時環(huán)境,這包括為其分配堆內(nèi)存和棧內(nèi)存,以及為其創(chuàng)建新的執(zhí)行上下文等。這些操作都需要占用CPU,而且過多的進程/線程還會帶來線程抖動或頻繁的上下文切換,系統(tǒng)性能也會由此進一步下降。
十載專注成都網(wǎng)站制作,企業(yè)網(wǎng)站制作,個人網(wǎng)站制作服務,為大家分享網(wǎng)站制作知識、方案,網(wǎng)站設計流程、步驟,成功服務上千家企業(yè)。為您提供網(wǎng)站建設,網(wǎng)站制作,網(wǎng)頁設計及定制高端網(wǎng)站建設服務,專注于企業(yè)網(wǎng)站制作,高端網(wǎng)頁制作,對成都食品包裝袋等多個方面,擁有豐富的網(wǎng)站營銷經(jīng)驗。在設計的最初階段,nginx的主要著眼點就是其高性能以及對物理計算資源的高密度利用,因此其采用了不同的架構模型。受啟發(fā)與多種操作系統(tǒng)設計中基于“事件”的高級處理機制,nginx采用了模塊化、事件驅(qū)動、異步、單線程及非阻塞的架構,并大量采用了多路復用及事件通知機制。在nginx中,連接請求由為數(shù)不多的幾個僅包含一個線程的進程worker以高效的回環(huán)機制進行處理,而每個worker可以并行處理數(shù)千個的并發(fā)連接請求。
如果負載以cpu密集型應用為主,如ssl或壓縮應用,則worker數(shù)應與cpu數(shù)相同;如果負載以IO密集型為主,如響應大量內(nèi)容給客戶端,則worker數(shù)應該為cpu個數(shù)的1.5或2倍。
Nginx會按需同時運行多個進程:一個主進程(master)和幾個工作進程(worker),配置了緩存時還會有緩存加載器進程(cache loader)和緩存管理器進程(cache manager)等。所有進程均是僅含有一個線程,并主要通過“共享內(nèi)存”的機制實現(xiàn)進程間通信。主進程以root用戶身份運行,erworker、cache loader和cache manager均應以非特權用戶身份運行。
主進程主要完成如下工作:
1. 讀取并驗證配置信息;
2. 創(chuàng)建、綁定及關閉套接字;
3. 啟動、終止及維護worker進程的個數(shù);
4. 無須中止服務而重新配置工作特性;
5. 控制非中斷式程序升級,啟用新的二進制程序并在需要時回滾至老版本;
6. 重新打開日志文件,實現(xiàn)日志滾動;
7. 編譯嵌入式perl腳本;
Worker進程主要完成的任務包括:
1. 接收、傳入并處理來自客戶端的連接;
2. 提供反向代理及過濾功能;
3. Nginx任何能完成的其他任務;
Cache loader進程主要完成的任務包括:
1. 檢查緩存存儲中的緩存對象;
2. 使用緩存元數(shù)據(jù)建立內(nèi)存數(shù)據(jù)庫;
Cache manager進程的主要任務:
1. 緩存的失效及過期檢驗;
Nginx的配置有著幾個不同的上下文:main、http、server、upstream和location(還有實現(xiàn)郵件服務反向代理的mail)。配置語法的格式和定義方式遵循所謂的c風格,因此支持嵌套,還有著邏輯清晰并易于創(chuàng)建、閱讀和維護等優(yōu)勢。
Nginx的代碼是由一個核心和一系列的模塊組成,核心主要用于提供web server的基本功能,以及web和mail反向代理的功能:還用于啟用網(wǎng)絡協(xié)議,創(chuàng)建不要的運行時環(huán)境以及確保不同的模塊之間平滑地進行交互。不過,大多跟協(xié)議相關的功能和某應用特有的功能都是由nginx的模塊實現(xiàn)的。這些功能模塊大致可以分為事件模塊、階段性處理器、輸出國濾器、變量處理器、協(xié)議、upstream和負載均衡幾個級別,這些共同組成了nginx的http功能。事件模塊主要用于提供OS獨立的(不同操作系統(tǒng)的時間機制有所不同)事件通知機制如kqueue或epoll等。協(xié)議模塊則負責實現(xiàn)nginx通過http、tls/ssl、smtp、pop3以及imap與對應的客戶端建立會話。
在nginx內(nèi)部,進程間的通信是通過模塊的pipeline或chain實現(xiàn)的:換句話說,每一個功能或操作都由一個模塊來實現(xiàn)。例如,壓縮、通過fastcgi或uwcgi協(xié)議與upstream服務器通信,以及與mencached建立會話等。
以下手動編譯安裝部署LNMP環(huán)境:
一、 安裝nginx;
1. 解決依賴關系
編譯安裝nginx需要實現(xiàn)安裝開發(fā)包組“Development Tools”和“Server Platform Development”。同時還需安裝pcre-devel,zlib-devel,openssl-devel依賴包,不過一般只需安裝pcre-devel包,其它兩個包已經(jīng)安裝;
實現(xiàn)安裝/var/tmp/nginx此目錄,不然啟動nginx會出錯;
2. 安裝;
1) 添加用戶和組,實現(xiàn)以之運行nginx進程;
# groupadd -r nginx
# useradd -r -g nginx nginx
2) 解壓縮源碼包,并進入目錄;
3) 用命令./configure --help可以查看安裝選項;
4) 編譯安裝;
# ./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/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
# make && make install
Note:如果想使用nginx的perl模塊,可以編譯時添加—with-http_perl_module選項來實現(xiàn);
5) 提供Sysv init腳本;
新建文件/etc/rc.d/init.d/nginx,內(nèi)容如下:
#!/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/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/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/nginx.lock
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
6) 為此腳本添加執(zhí)行權限;
7) 添加服務管理列表,并讓其開啟自動啟動;
8) 啟動服務并測試
二、 安裝mariadb-5.5.46(通過二進制方式)
1. 準備數(shù)據(jù)存放目錄;
2. 創(chuàng)建用戶和組,實現(xiàn)運行進程;
3. 編譯安裝;
1) 解壓縮源碼包到指定目錄/usr/local下,創(chuàng)建軟連接mysql并進入mysql目錄;
2) 修改目錄內(nèi)文件屬主屬組;
3) 運行腳本,生成元數(shù)據(jù)庫;指明用戶和數(shù)據(jù)路存放位置;
4. 為mysql提供主配置文件;
1) 復制文件;
2) 編輯配置文件/etc/my.cnf,添加或修改一下內(nèi)容;
5. 為mysql提供Sysv init服務腳本,以下包括添加執(zhí)行權限和添加服務列表并測試使用;
為了使用mysql的安裝符合系統(tǒng)使用規(guī)范,并將其開發(fā)組件導出給系統(tǒng)使用,這里還需要執(zhí)行如下步驟;
6. 輸出mysql的man手冊至man命令查找路徑;
編輯/etc/man.config,添加如下行;
7. 輸出mysql頭文件至系統(tǒng)頭文件路徑下/usr/include;可以通過簡單的創(chuàng)建鏈接實現(xiàn);
8. 輸出mysql的庫文件給系統(tǒng)查找路徑;
9. 修改PATH環(huán)境變量,讓系統(tǒng)可以直接使用mysql相關命令。
測試:
至此,mariadb全部安裝完成;
三、 安裝php-5.4.26(以fpm方式)
1. 解決依賴關系
首先配置號yum源(系統(tǒng)安裝及epel源)后執(zhí)行如下命令
# yum -y groupinstall "Desktop Platform Development"
# yum -y install bzip2-devel libmcrypt-devel libxml2-devel
2. 編譯安裝php-5.4.26
1) 解壓源碼壓縮文件,并進入解壓后的目錄;
2) 編譯安裝;
# ./configure --prefix=/usr/local/php-fpm --with-mysql=/usr/local/mysql --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --with-curl
# make && make install
3. 為php提供配置文件
4. 配置php-fpm
1) 為php-fpm提供Sysv init服務腳本,并添加至服務列表;
2) 為php-fpm提供配置文件;
3) 編輯此配置文件;
配置fpm的相關選項的值,并啟用pid文件;
啟用pid文件,去除分號即可啟用:
4) 啟動服務并測試;
四、 整合nginx和php-fpm
1. 編輯/etc/nginx/nginx.conf,啟用如下選項;
Note:有的需要將/scripts替換為root絕對路徑;這里可將/scripts替換為/usr/local/nginx/html
2. 在所支持的主頁面格式中添加php格式的主頁;
3. 新建index.php測試頁面,測試php能否正常工作;
4. 測試;
五、 安裝xcache,為php加速;
具體步驟可參看本人博客編譯安裝lamp;
六、 補充說明;
如果要在SSL中使用php,需要在php的location中添加此項:
fastcgi_param HTTPS on;
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。