原創——Nginx基礎

Nginx基礎php

1、Nginx概述:

  Nginx ("engine x") 是一個高性能的HTTP和反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器。html

  Nginx 是由 Igor Sysoev 爲俄羅斯訪問量第二的Rambler.ru 站點開發的,它已經在該站點運行超過四年多了。Igor 將源代碼以類BSD許可證的形式發佈。自Nginx 發佈四年來,Nginx已經由於它的穩定性、豐富的功能集、 示例配置文件和低系統資源的消耗而聞名了。前端

   目前國內各大門戶網站已經部署了Nginx,如新浪、網易、騰訊等;國內幾個重要的視頻分享網站也部署了Nginx,如六房間、酷6等。 新近發現Nginx 技術在國內日趨火熱,愈來愈多的網站開始部署Nginx。nginx

2、相比主流的Apache,我爲何要選Nginx?

  Nginx才短短几年,就拿下了web服務器大筆江山,衆所周知,Nginx在處理大併發靜態請求方面,效率明顯高於httpd,甚至能輕鬆解決C10K問題c++

一、Nginx和Apache相比優勢:
  輕量級:一樣起web服務,比apache佔用更少的內存及資源;   抗併發:nginx 處理請求是異步非阻塞的,而apache 則是阻塞型的,在高併發下nginx 能保持低資源低消耗高性能;   高度模塊化的設計:編寫模塊相對簡單;   社區活躍:各類高性能模塊出品迅速。
2、Nginx做爲Web服務器:
  相比Apache,Nginx使用更少的資源,支持更多的併發鏈接,體現更高的效率。   Nginx做爲負載均衡服務器:
  Nginx既能夠在內部直接支持Rails和PHP程序對外進行服務, 也能夠支持做爲HTTP代理服務器對外進行服務. Nginx採用C進行編寫, 不管是系統資源開銷仍是CPU使用效率都不錯。   Nginx做爲郵件代理服務器:
  Nginx 同時也是一個很是優秀的郵件代理服務器(最先開發這個產品的目的之一也是做爲郵件代理服務器)。
Nginx 啓動特別容易, 而且幾乎能夠作到7
*24不間斷運行,即便運行數個月也不須要從新啓動. 你還可以不間斷服務的狀況下進行軟件版本的升級。
3、Nginx配置簡潔,Apache複雜:   Nginx靜態處理性能比Apache高3倍以上;   Apache對PHP支持比較簡單,Nginx須要配合其餘後端(php-fpm或者fastcgi);   Apache的組件比Nginx多。
4、Nginx與Apache最核心的區別:
  在於apache是同步多進程模型,一個鏈接對應一個進程;nginx是異步的,多個鏈接(萬級別)能夠對應一個進程。
五、nginx處理靜態文件好,耗費內存少:
  apache有先天不支持多核心處理負載雞肋的缺點,建議使用nginx作前端,後端用apache。大型網站建議用nginx自帶的集羣功能。
六、從使用狀況來看:
  nginx的負載能力比apache高不少。Nginx改完配置能-t測試一下配置有沒有問題,apache重啓的時候發現配置出錯了,會很崩潰,改的時候都會很是當心翼翼如今看有好多集羣站,前端nginx抗併發,後端apache集羣,配合的也不錯。
七、nginx處理動態請求是雞肋,通常動態請求要apache去作,nginx只適合靜態和反向。

八、Nginx優於apache的主要兩點:
  1.Nginx自己就是一個反向代理服務器;
  2.Nginx支持7層負載均衡,Nginx可能會比apache支持更高的併發。

十、你對web server的需求決定你的選擇。大部分狀況下Nginx都優於Apache,好比說靜態文件處理PHP-CGI的支持、反向代理功能、前端apache、維持鏈接等等。在Apache+PHP(prefork)模式下,若是PHP處理慢或者前端壓力很大的狀況下,很容易出現Apache進程數飆升,從而拒絕服務的現象。
十一、能夠看一下nginx lua模塊:https://github.com/chaoslaw...apache比nginx多的模塊,可直接用lua實現apache是最流行的,why?大多數人懶得更新到nginx或者學新事物。
十二、對於nginx,它配置文件寫的很簡潔,正則配置讓不少事情變得簡單運行效率高,佔用資源少,代理功能強大,很適合作前端響應服務器
1三、Apache在處理動態有優點,Nginx併發性比較好,CPU內存佔用低,若是rewrite頻繁,那仍是Apache較適合。

3、3種web服務器工做模型比較:

  Web服務器要爲用戶提供服務,必須以某種方式,工做在某個套接字上。通常Web服務器在處理用戶請求是,通常有以下三種方式可選擇:git

多進程方式:爲每一個請求啓動一個進程來處理。因爲在操做系統中,生成進程、銷燬進程、進程間切換都很消耗CPU和內存,當負載高是,性能會明顯下降。
優勢: 穩定性!因爲採用獨立進程處理獨立請求,而進程之間是獨立的,單個進程問題不會影響其餘進程,所以穩定性最好。
缺點: 資源佔用!當請求過大時,須要大量的進程處理請求,進程生成、切換開銷很大,並且進程間資源是獨立的,形成內存重複利用。

多線程方式:一個進程中用多個線程處理用戶請求。因爲線程開銷明顯小於進程,並且部分資源還能夠共享,所以效率較高。
優勢:開銷較小!線程間部分數據是共享的,且線程生成與線程間的切換所需資源開銷比進程間切換小得多。
缺點:穩定性!線程切換過快可能形成線程抖動,且線程過多會形成服務器不穩定。

異步方式:使用非阻塞方式處理請求,是三種方式中開銷最小的。但異步方式雖然效率高,但要求也高,由於多任務之間的調度若是出現問題,就可能出現總體故障,所以使用異步工做的,通常是一些功能相對簡單,但卻符合服務器任務調度、且代碼中沒有影響調度的錯誤代碼存在的程序。
優勢:性能最好!一個進程或線程處理多個請求,不須要額外開銷,性能最好,資源佔用最低。
缺點:穩定性!某個進程或線程出錯,可能致使大量請求沒法處理,甚至致使整個服務宕機。

4、編譯安裝Nginx

一、安裝Nginx

#編譯nginx環境前須要先把gcc等開發庫之類提早裝好;
[root@realserver1 ~]# yum -y install gcc gcc-c++ automake autoconf libtool make
#安裝pcre是爲了支持rewrite,
#zlib是爲了支持gzip壓縮
#openssl是爲了支持https;
[root@realserver1 ~]# yum install -y pcre-devel.x86_64 pcre-devel.x86_64  zlib.x86_64 zlib-devel.x86_64  openssl-devel.x86_64 openssl.x86_64
[root@realserver1 ~]# groupadd www 
[root@realserver1 ~]# useradd -r -g www www  -s /sbin/nologin   #運行nginx的用戶和用戶組
[root@realserver1 nginx-1.8.1]# mkdir -pv /opt/application/nginx
mkdir: created directory `/opt/application'
mkdir: created directory `/opt/application/nginx'
[root@realserver1 tools]# tar -xf nginx-1.8.1.tar.gz
[root@realserver1 tools]# cd nginx-1.8.1
[root@realserver1 nginx-1.8.1]# ./configure --prefix=/opt/application/nginx/ --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-http_spdy_module --with-http_gzip_static_module --with-http_realip_module --with-ipv6
# --with-http_stub_status_module 啓用nginx狀態監控
# --with-http_ssl_module 啓用HTTPS加密
# --with-http_spdy_module 啓用spdy支持,縮短爲網頁加載時間
# --with-http_gzip_static_module  啓用靜態壓縮
# --with-http_realip_module 作代理時獲取客戶端真實IP
# --with-ipv6 支持ipv6
[root@realserver1 nginx-1.8.1]# make ;make install

 二、建立nginx啓動腳本

[root@realserver1 ~]# vim /etc/rc.d/init.d/nginx
[root@realserver1 ~]# chmod 755 /etc/rc.d/init.d/nginx
[root@realserver1 ~]# service nginx start
Starting nginx:                                            [  OK  ]
[root@realserver1 ~]# chkconfig --add nginx
[root@realserver1 ~]# chkconfig nginx on
[root@realserver1 ~]# chkconfig --list nginx
nginx              0:off      1:off  2:on  3:on    4:on     5:on     6:off

三、測試成功

[root@realserver1 nginx-1.8.1]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.8.1
Date: Thu, 03 Nov 2016 08:30:16 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Thu, 03 Nov 2016 08:28:24 GMT
Connection: keep-alive
ETag: "581af528-264"
Accept-Ranges: bytes

四、Nginx腳本內容

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemin
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /usr/local/nginx/conf/nginx.conf
# pidfile:     /usr/local/nginx/logs/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="/opt/application/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/opt/application/nginx/conf/nginx.conf"
lockfile=/var/lock/subsys/nginx
start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    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
    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

 5、Nginx配置文件講解github

一、Nginx安裝文件組成

主配置文件nginx.confconf.d/*.confweb

[root@realserver1 nginx]# tree -f .
.
├── ./client_body_temp
├── ./conf
│   ├── ./conf/fastcgi.conf
│   ├── ./conf/fastcgi.conf.default
│   ├── ./conf/fastcgi_params
│   ├── ./conf/fastcgi_params.default
│   ├── ./conf/koi-utf
│   ├── ./conf/koi-win
│   ├── ./conf/mime.types
│   ├── ./conf/mime.types.default
│   ├── ./conf/nginx.conf
│   ├── ./conf/nginx.conf.default
│   ├── ./conf/scgi_params
│   ├── ./conf/scgi_params.default
│   ├── ./conf/uwsgi_params
│   ├── ./conf/uwsgi_params.default
│   └── ./conf/win-utf
├── ./fastcgi_temp
├── ./html
│   ├── ./html/50x.html
│   └── ./html/index.html
├── ./logs
│   ├── ./logs/access.log
│   ├── ./logs/error.log
│   └── ./logs/nginx.pid
├── ./proxy_temp
├── ./sbin
│   └── ./sbin/nginx
├── ./scgi_temp
└── ./uwsgi_temp

9 directories, 21 files

 二、說說主配置./conf/nginx.conf文件

Mainapache

相關文章
相關標籤/搜索