nginx 基礎筆記

一、Nginx 優點

  1. 高性能web,可以支持反向代理

  2. 比Apache性能優越,支持更多的并發連接,但資源占用很少,輕量級的web服務器??梢灾С指哌_50000個并發連接數的響應

  3. Nginx 在Linux 2.6+ 使用epoll模型,提供卓越性能

  4. 做為負載均衡服務器,可以在內部直接支持PHP和Rails,也可以支持作為HTTP代理服務器對外進行服務

  5. Nginx使用C編寫,不能是系統資源開銷還是CPU使用效率都比Perbal要好

  6. 支持郵件代理服務器,也是一款非常優秀的郵件代理服務器,Nginx早期其實是一個郵件代理服務器

  7. Nginx安裝簡單,配置文件簡潔,還支持perl語言,bug很少,穩定性很好,幾乎可以支持7&24小時不間斷運行,還可以在實現在不間斷提供服務情況實現平滑升級

  8. 在線幫助文檔很豐富


二、軟件獲得及幫助文檔

官方網址:http://nginx.org/

下載穩定版本:http://nginx.org/download/nginx-1.8.0.tar.gz

幫助文檔:http://nginx.org/en/docs/

編譯參數說明:http://nginx.org/en/docs/configure.html

三、軟件安裝

1、 ./configure –help 編譯參數中文說明,可能不是很準確,敬請指正。

  • –with-rtsig_module。在Linux 2.2.19 內核默認情況下,實時信號連接不超過1024.使用rtsig模塊可以突破這個限制。需要修改內核參數/proc/sys/kernel/rtsig-max,才能達到效果。centos 6.6沒有這個內核參數,應該是不支持這個參數了。網上說Linux 2.6.6-mm2開始不再支持這個參數。centos 6.7的內核:2.6.32-504。這個參數在Linux2.6內核基本上不用了

  • –with-select_module select模式的性能同poll模塊的性能相當。Linux內核2.6+的可以選擇epoll模塊

  • –with-threads 配置線程池。

  • –with-file-aio 開啟通過異步I/0(允許進程發起很多I/O操作,而不用阻塞或等待任何操作完成)的方式讀取文件

    • 異步I/O:針對網絡I/O 使用epoll模型,針對文件(設備)的I/O使用AI0

    • AIO的基本思想:允許進程發起很多I/O操作,而不用阻塞或等待任何操作完成,稍后或在接收到I/O操作完成通知時,進程可以檢索I/O操作結果。在異步非阻塞I/O中,我們可以同時發起多個傳輸操作,這需要每個傳輸操作都有唯一的上下文,這樣我們才能在他們完成時區分到底是哪個傳輸操作完成了,這個工作可以通過aiocb結構體進行區分

  • –with-http_spdy_module  spdy是Google開發的基于TCP的應用層協議,用以最小化網絡延遲,提升網絡速度,優化用戶的網絡使用體驗。SPDY并不是一種用于替代HTTP的協議,而是對HTTP協議的增強。新協議的功能包括數據流的多路復用、請求優先級以及HTTP報頭壓縮。谷歌表示,引入SPDY協議后,在實驗室測試中頁面加載速度比原先快64%。Linux的發行版提供的軟件源里一般情況是不帶這個功能,需要下載源碼編譯安裝

  • –with-http_ssl_module 支持ssl

  • –with-http_realip_module 此模塊支持顯示真實來源IP地址,主要用于NGINX做前端負載均衡服務器使用,或者反向代理

  • –with-http_addition_module 游戲服務器不必安裝,門戶網站可以安裝,有利于被搜索引擎收錄頁面信息。用于SEO:搜索引擎優化

  • –with-http_xslt_module 這個模塊是一個過濾器,它可以通過XSLT模板轉換XML應答。0.7.8后面版本才可以使用。

  • –with-http_image_filter_module 是nginx提供的集成圖片處理模塊,nginx-0.7.54以后的版本才可以使用。主要的功能:實時縮放圖片,旋轉圖片,驗證圖片有效性以及獲取圖片寬高以及圖片類型信息。適用于訪問不是太大,硬盤空間有限的情況下,高并發訪問量不適合開啟該模塊

  • –with-http_geoip_module  Linux的發行版提供的軟件源一般情況是不帶這個功能,需要下載源碼編譯安裝。獲取客戶端的IP地址,在IP地址數據庫中查詢該IP來自哪個國家/城市 不一定準,只能做參考,很多時候IP數據庫里的數據不準確。

  • –with-http_sub_module 能夠在nginx的應答響應報文中搜索并替換某些文本

  • –with-http_dav_module 為文件和目錄指定權限,限制不同類型的用戶對于頁面有不同的操作權限

  • –with-http_auth_request_module 認證模塊

  • –with-http_gzip_static_module:提供對靜態文件預壓縮。例如:提供一個index.html的文件,在nginx訪問之前對文件進行壓縮成index.html.gz 這樣nginx訪問的時候大大節約帶寬和時間(不需要壓縮),nginx訪問的是index.html.gz這個文件??梢赃x擇壓縮比高的算法,雖說占CPU資源,但是不是在nginx訪問的時候進行壓縮,這樣并沒有太大的問題

  • –with-http_gzip_module:通過Linux發行版的軟件倉庫的方式安裝是提供的。這個是對文件進行壓縮,壓縮比一般超過50%

  • –with-http_random_index_module 選擇一個隨機的主頁

  • –with-http_secure_link_module 這個模塊用于為所需的安全性“令牌”計算和檢查請求URL。在0.7.18版本以上的Nginx中提供了該模塊。默認安裝不包括此模塊。對于0.8.50之后的版,有添加了secure_link_md5指令和secure_link_expires變量,因此,secure_link_secret已經不贊成使用了

  • –with-http_degradation_module 允許在內存不足的情況下返回204或444碼。204:無內容。444:無響應

  • –with-http_stub_status_module Nginx健康狀態檢測模塊,做反向代理服務器的時候對后端服務器的存活狀態進行檢測

  • ngx_http_geo_module 可以創建一個變量,變量的值依賴于客戶端的IP地址。默認是開啟的。如果不使用–without-ngx_http_geo_module

  • –with-http_charset_module:向響應報文頭部“Content-Type”字段添加指定的字符,可用于不同字符集之間的轉換(不同的編碼之間進行轉換)不過有局限性。例如:從服務器到客戶端,僅僅單字節的字符集能被進行轉換或者單字節字符集能被轉到utf8格式或者從utf8格式轉到單字節字符集

  • –with-http_userid_module: 對登錄的UID設置適當的cookies信息。相當于Apache的mod uid模塊

  • –without-http_map_module: map指令依賴于此模塊。創建變量依賴于其他的變量。允許分類或者同時映射多個值到多個不同值并儲存到一個變量中,map指令用來創建變量,但是僅在變量被接受的時候執行視圖映射操作,對于處理沒有引用變量的請求時,這個模塊并沒有性能上的缺失。

  • –with-http_referer_module:基于RefererHTTP請求頭對請求進行過濾.referer是 http的headers,告訴服務器此請求是從哪個頁面過來的

  • –with-http_proxy_module:http代理模塊,一般是反向代理

  • –with-http_empty_gif_module:異步統計使用1×1的空白圖片傳遞統計參數,提高性能,空圖片運行在內存中,比使用靜態文件傳遞參數效率要高

  • –with-http_upstream_hash_module: nginx工作于負載均衡模型中由upstream將請求調度到上游服務器。hash模塊執行hash運算的。

    調度算法:

    • ip_hash(源地址hash,將來自同一IP的請求調度同一個Real Server??梢越鉀Qsession問題)、

    • 最小連接數,可以基于權重

    • 輪詢,可以基于權重

    • fair:第三方,按后端服務器的響應時間來分配請求,響應時間短的優先分配)

    • url_hash:第三方,按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,nginx為緩存服務器時比較有效

  • –with-http_upstream_keepalive_module:keepalive 常連接模塊

  • –with-http_perl_module:Perl模塊支持Perl腳本,比fast-cgi模型性能稍好

    • 解決依賴關系:yum -y install perl perl-devel perl-ExtUtils-Embed

    • –with-ld-opt="-Wl,-E"。加入perl模塊,需要加上這項,否則會報錯

  • –with-http_split_clients_module 該模塊用來基于某些條件劃分用戶。條件如:ip地址、報頭、cookies等,禁用–without-http_split_clients_module

  • –without-http_browser_module 禁用ngx_http_browser_module支持(該模塊用來創建依賴于請求報頭的值。如果瀏覽器為modern ,則$modern_browser等于modern_browser_value指令分配的值;如 果瀏覽器為old,則$ancient_browser等于 ancient_browser_value指令分配的值;如果瀏覽器為 MSIE中的任意版本,則 $msie等于1)

2、安裝之前解決依賴關系。yum -y install pcre openssl-devel pcre-devel zlib-devel gcc

3、需要手動創建nginx組和nginx用戶

    groupadd -r -g nginx

    useradd

4、安裝nginx

 ./configure –prefix=/usr/local/nginx –user=nginx –group=nginx –with-threads –with-http_ssl_module –with-http_spdy_module –with-http_realip_module –with-http_addition_module –with-http_dav_module –with-http_gunzip_module –with-http_auth_request_module –with-http_gzip_static_module –with-http_degradation_module –with-http_stub_status_module  –http-log-path=/var/log/nginx.log  –with-http_perl_module –with-ld-opt="-Wl,-E" –error-log-path=/var/log/nginx_errorlog.log

注釋:–with-ld-opt="-Wl,-E" 加入perl模塊后需要加入這項,防止安裝完成后啟動nginx時報錯。這項的作用優化C編譯器

make && make instal

5、下面做的一些操作完全是為了保持使用yum方式安裝的習慣:配置文件的路徑,程序啟動使用簡單的命令而非完整的路徑等

  • cp /usr/local/nginx/sbin/nginx
    /usr/sbin/nginx 這樣可以在任意路徑使用nginx命令,不需要使用完整的路徑:/usr/locla/ngins/sbin/nginx。當nginx重新編譯過后會產生新的nginx程序,這時候也要相應的將/usr/sbin/目錄里的nginx也更新了。也可以通過修改環境變量PATH的方式:    echo "PATH=/usr/local/nginx/sbin/:$PATH" >> /etc/profile

     source /etc/profile #使其立即生效

  • 復制配置文件 mkdir /etc/nginx/ && cp /usr/local/nginx/conf/{nginx.conf,mime.types} /etc/nginx/

  • 創建nginx的啟動腳本可以使用service方式啟動,重啟,查看狀態以及重載配置文件等。vim /etc/init.d/nginx

    

#!/bin/sh

#

# nginx – this script starts and stops the nginx daemon

#

# chkconfig:   – 85 15   85表示啟動順序號,第85個啟動,15代表關閉順序號,第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/sbin/nginx"

prog=$(basename $nginx)

 

NGINX_CONF_FILE="/etc/nginx/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:" | sed 's/[^*]*–user=\([^ ]*\).*/\1/g' -`

   #nginx -V 2>&1 | grep "configure arguments:" | cut -d '-' -f 5 | cut -d '=' -f 2 等同于上面的代碼的功能

   #[^*]* 表示把–user前面的內容去掉 \(表示轉義 [^ ]* 表示零個,一個或多個非空白字符 \([^ ]*\) 表示被引用的對象,

   #后面的\1 就是引用這里括起來的內容

   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

}

#make_dirs 函數的作用是先獲取nginx使用哪個用戶進行運行,然后將下面這些路徑的屬主改為該用戶。

#并且是遞歸的方式修改,也就是子文件夾及其里面所有文件的屬主都為此用戶。

# –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 \

 

start() {

    [ -x $nginx ] || exit 5 

    #-x 表示/usr/local/nginx 是否有執行的權限,有就執行下一條命令并返回0.如果沒有就返回5并退出整個腳本

    [ -f $NGINX_CONF_FILE ] || exit 6  

    #-f 表示/etc/nginx/nginx.conf是否存在。存在執行下一條命令返回0.沒有就返回6并退出整個腳本

    make_dirs

    echo -n $"Starting $prog: "

    daemon $nginx -c $NGINX_CONF_FILE #檢查nginx的配置文件

    retval=$?

    echo

    [ $retval -eq 0 ] && touch $lockfile

    return $retval

}

 

stop() {

    echo -n $"Stopping $prog: "

    killproc $prog -QUIT #運行killproc 需要先運行. /etc/rc.d/init.d/functions.

    #使用function腳本提供的PATH變量,umask,以及語言環境等。killproc也在此腳本中.

    #-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 #運行killproc 需要先運行. /etc/rc.d/init.d/functions 使用function腳本提供的PATH變量,

    RETVAL=$?    #umask,以及語言環境等。killproc也在此腳本中。-HUP 重載配置文件

    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 #如果在運行狀態,就返回0并且停止執行當前腳本,否則調用start函數

        $1  #調用start() 函數

        ;;

    stop)

        rh_status_q || exit 0 #如果在運行狀態,就調用stop函數,否則返回0并停止執行當前腳本

        $1 #調用stop() 函數

        ;;

    restart|configtest) #restart 或者configtest 這兩個參數

        $1 #調用restart() 函數 或者調用configtest函數

        ;;

    reload)

        rh_status_q || exit 7

        $1 #調用reload() 函數

        ;;

    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

  • 需要給此腳本添加執行的權限。chomd o+x /etc/init.d/nginx

  • 設置開機自動啟動 chkconfig -add nginx;chkconfig nginx on

  • 可以啟動nginx:service nginx start

  • ss -utnlp | grep 80   #nginx已經啟動,并且監聽在80套字節上

    tcp    LISTEN     0      128                    *:80                    *:*      users:(("nginx",39796,6),("nginx",39797,6))

  • 嘗試本機訪問nginx

[root@firewall nginx]# curl http://localhost

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

<style>

    body {

        width: 35em;

        margin: 0 auto;

        font-family: Tahoma, Verdana, Arial, sans-serif;

    }

</style>

</head>

<body>

<h1>Welcome to nginx!</h1>

<p>If you see this page, the nginx web server is successfully installed and

working. Further configuration is required.</p>

<p>For online documentation and support please refer to

<a href="http://nginx.org/">nginx.org</a>.<br/>

Commercial support is available at

<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>

</body>

</html>

至此nginx安裝完成

nginx基礎篇就寫在這里,下一篇寫nginx作為web服務器、web反向代理的具體實現。

原創文章,作者:jslijb,如若轉載,請注明出處:http://www.www58058.com/12850

(0)
jslijbjslijb
上一篇 2016-03-18
下一篇 2016-03-19

相關推薦

  • 高級文件系統的管理

    一、遷移分區 分區 /dev/sda6 注意同步問題  創建分區,把原先家目錄下的文件拷貝到新掛載的文件中 mkfs.ext4 /dev/sda6  mkdir /mnt/home mount /dev/sda6 /mnt/home cp -a /home/*  /mnt/home   init 1 切換單用戶模式,把…

    Linux干貨 2016-11-27
  • LAMP的編譯安裝

    一、編譯安裝amp: (1)系統環境:centos6,7 httpd依賴于apr和apr-util appache protable runtime (2)開發環境: Development Tools,Server Platform Development (3)各程序的版本: httpd:2.2,2.4 php:5.x mysql:5.1,5.5,5.6…

    Linux干貨 2016-10-17
  • N25-第一周博客

      第一周博客作業內容 1.描述計算機的組成及其功能 2.按系列羅列Linux的發行版,并描述不同發行版之間的聯系與區別 3.描述Linux哲學思想,并按照自己的理解對其進行解釋性描述。 4.說明Linux系統上命令的使用格式:詳細介紹,ifconfg,echo,tty,startx,export pwd,history,shutdown,powe…

    Linux干貨 2016-12-03
  • shell腳本之函數相關

       本節主要是作業和select 與case的相關 一、作業 1、斐波那契數列又稱黃金分割數列,因數學家列昂納多·斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……,斐波納契數列以如下被以遞歸的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-…

    Linux干貨 2016-08-22
  • shell腳本一鍵分區

    #!/bin/bash #實現硬盤自動分區助手 echo "當前所有分區:" echo `fdisk -l|grep "Disk /dev/[sh]d"|cut -d: -f1|awk '{print $2 &q…

    Linux干貨 2016-07-26
  • FHS文件系統各目錄及Linux文件類型和顏色標識整理

    一.FHS (Filesystem Hierarchy Standard文件系統層級標準)   使用文件系統層級標準可以使軟件和用戶可以預測已安裝文件和文件夾位置 文件系統各目錄:   /boot     系統引導啟動時要加載的靜態文件,內核和ramdisk及grub等    (系統啟動時…

    Linux干貨 2016-10-17

評論列表(2條)

  • stanley
    stanley 2016-03-19 22:24

    代碼缺少格式化,難看了點

    • jslijb
      jslijb 2016-03-22 22:40

      @stanley上次說我沒有格式化,我這次特定做了格式化,可是還是說沒有格式化,那您能告訴我格式化的標準碼?否則我不知道如何達到您的要求。

欧美性久久久久