Nginx和Tengine

Tengine

Nginx和Tengine

Nginx

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

•第一個公開版本0.1.0發佈於2004年10月4日。

其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名

官方測試nginx能夠支撐5萬併發鏈接,並且cpu、內存等資源消耗卻非常低,運行非常穩定

2011年6月1日,nginx 1.0.4發佈。

Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。由俄羅斯的程序設計師Igor Sysoev所開發,

其特點是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:新浪、網易、騰訊等。

[外鏈圖片轉存失敗(img-WUN8PnpL-1563871523878)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1562918361888.png)]

功能:

  • web服務器

  • web reverse proxy

  • smtp reverse proxy

Nginx和apache的優缺點

nginx相對於apache的優點:

  • 輕量級,同樣起web 服務,比apache 佔用更少的內存及資源
  • 抗併發,nginx 處理請求是異步非阻塞的,而apache 則是阻塞型的,在高併發下nginx 能保持低資源低消耗高性能
  • 高度模塊化的設計,編寫模塊相對簡單
  • 社區活躍,各種高性能模塊出品迅速

apache 相對於nginx 的優點:

  • rewrite ,比nginx 的rewrite 強大
  • 模塊超多,基本想到的都可以找到
  • 少bug ,nginx 的bug 相對較多

Nginx 配置簡潔, Apache 複雜

最核心的區別在於apache是同步多進程模型,一個連接對應一個進程;

nginx是異步的,多個連接(萬級別)可以對應一個進程

Nginx解決的問題

  • 高併發

  • 負載均衡

  • 高可用

  • 虛擬主機

  • 僞靜態

  • 動靜分離

安裝

準備工作

操作系統

最好使用linux操作系統,課上使用VirtualBox或VMware虛擬機搭建centos6.x做實驗。

系統依賴組件 gcc openssl-devel pcre-devel zlib-devel

安裝:yum install gcc openssl-devel pcre-devel zlib-devel

Tengine下載和文檔

http://tengine.taobao.org/

Nginx官網和文檔

http://nginx.org

上傳Nginx壓縮包到服務器,一般安裝在/usr/local目錄下

編譯安裝

./ configure --prefix=/安裝路徑

make && make install

啓動服務

腳本自啓動

拷貝附件提供的Nginx啓動腳本文件內容到/etc/init.d/nginx這個文件中

目錄下如果沒有這個文件的話需要手動創建

修改可執行權限

chmod 777 nginx

啓動服務

service Nginx start 啓動服務

service Nginx stop 停止

service Nginx status 狀態

service Nginx reload 動態重載配置文件

腳本內容:

#!/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/tengine/sbin/nginx"
prog=$(basename $nginx)
 
NGINX_CONF_FILE="/usr/local/tengine/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:" | 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

Nginx配置解析

定義Nginx運行的用戶和用戶組

user www www;

進程數

建議設置爲等於CPU總核心數。

worker_processes 8;

全局錯誤日誌

全局錯誤日誌定義類型,[ debug | info | notice | warn | error | crit ]

error_log /var/log/nginx/error.log info;

進程文件

pid /var/run/nginx.pid;

打開的最多文件描述符

一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(系統的值ulimit -n)與nginx進程數相除,但是nginx分配請求並不均勻,所以建議與ulimit -n的值保持一致。

worker_rlimit_nofile 65535;

event

單個進程最大連接數

併發總數是 worker_processes 和 worker_connections 的乘積

即 max_clients = worker_processes * worker_connections

在設置了反向代理的情況下,max_clients = worker_processes * worker_connections / 4 爲什麼
爲什麼上面反向代理要除以4,應該說是一個經驗值根據以上條件,正常情況下的Nginx Server可以應付的最大連接數爲:4 * 8000 = 32000worker_connections 值的設置跟物理內存大小有關

因爲併發受IO約束,max_clients的值須小於系統可以打開的最大文件數

工作模式與連接數上限
events
{
參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本內核中的高性能網絡I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
單個進程最大連接數(最大連接數=連接數*進程數)
worker_connections 65535;
}

可以打開的文件句柄數是多少

–$ cat /proc/sys/fs/file-max

輸出:97320

併發連接總數小於系統可以打開的文件句柄總數,這樣就在操作系統可以承受的範圍之內

所以,worker_connections 的值需根據 worker_processes 進程數目和系統可以打開的最大文件總數進行適當地進行設置,使得併發總數小於操作系統可以打開的最大文件數目

– # 其實質也就是根據主機的物理CPU和內存進行配置

當然,理論上的併發總數可能會和實際有所偏差,因爲主機還有其他的工作進程需要消耗系統資源。

查看系統限制 ulimit -a

打開文件句柄數量限制

是Linux操作系統對一個進程打開的文件句柄數量的限制(也包含打開的SOCKET數量,可影響MySQL的併發連接數目)

系統總限制: /proc/sys/fs/file-max 當前使用句柄數:/proc/sys/fs/file-nr

修改句柄數:ulimit -SHn 65535

http

include mime.types; #文件擴展名與文件類型映射表

default_type application/octet-stream; #默認文件類型

charset utf-8; #默認編碼

client_header_buffer_size 32k; #上傳文件大小限制

sendfile

sendfile on; #開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲 on,如果用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改成off。

sendfile()還能夠用來在兩個文件夾之間移動數據

tcp_nopush 在linux/Unix系統中優化tcp數據傳輸,僅在sendfile開啓時有效

autoindex on;#開啓目錄列表訪問,合適下載服務器,默認關閉。

keepalive_timeout 120;#長連接超時時間,單位是秒

gzip

gzip on; 開啓gzip壓縮輸出

gzip_min_length 1k; 設置允許壓縮的頁面最小字節數,頁面字節數從header頭得content-length中進行獲取。默認值是0,不管頁面多大都壓縮。建議設置成大於2k的字節數,小於2k可能會越壓越大。

gzip_buffers 4 16k; 設置系統獲取幾個單位的緩存用於存儲gzip的壓縮結果數據流。 例如 4 4k 代表以4k爲單位,按照原始數據大小以4k爲單位的4倍申請內存。 4 8k 代表以8k爲單位,按照原始數據大小以8k爲單位的4倍申請內存。 如果沒有設置,默認值是申請跟原始數據相同大小的內存空間去存儲gzip壓縮結果。

gzip_http_version 1.0;壓縮版本(默認1.1,前端如果是squid2.5請使用1.0)

gzip_comp_level 2; 壓縮級別,1-10,數字越大壓縮的越好,也越佔用CPU時間

gzip_types text/plain application/x-javascript text/css application/xml;
#壓縮類型,默認就已經包含text/html,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn。

默認值: gzip_types text/html (默認不對js/css文件進行壓縮)

壓縮類型,匹配MIME類型進行壓縮

設置哪壓縮種文本文件可參考 conf/mime.types

gzip_disable "MSIE [1-6]\.";E6及以下禁止壓縮

gzip_vary on;給CDN和代理服務器使用,針對相同url,可以根據頭信息返回壓縮和非壓縮副本

server

listen 80; 監聽端口
server_name www.mashibing.com mashibing.com; 域名可以有多個,用空格隔開

charset koi8-r; 編碼集

日誌相關
access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;

index index.html index.htm index.jsp; 默認頁
root /data/www/ha97; 主目錄

虛擬主機

虛擬主機是一種特殊的軟硬件技術,它可以將網絡上的每一臺計算機分成多個虛擬主機,每個虛擬主機可以獨立對外提供www服務,這樣就可以實現一臺主機對外提供多個web服務,每個虛擬主機之間是獨立的,互不影響的

[外鏈圖片轉存失敗(img-Nh7MQ5Hg-1563871523880)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1562927031929.png)]

通過nginx可以實現虛擬主機的配置,nginx支持三種類型的虛擬主機配置

  • 基於ip的虛擬主機, (一塊主機綁定多個ip地址)
  • 基於域名的虛擬主機(servername)
  • 基於端口的虛擬主機(listen如果不寫ip端口模式)
http{
	server{
		#表示一個虛擬主機
	}
}

location

映射/虛擬目錄

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

location [ = | ~ | ~* | ^~ ] uri { … }

location URI {} 對當前路徑及子路徑下的所有對象都生效;

location = URI {} 注意URL最好爲具體路徑。 精確匹配指定的路徑,不包括子路徑,因此,只對當前資源生效;

location ~ URI {} location ~* URI {} 模式匹配URI,此處的URI可使用正則表達式,區分字符大小寫,*不區分字符大小寫;

location ^~ URI {} 禁用正則表達式

優先級:= > ^~ > |* > /|/dir/

location配置規則

location 的執行邏輯跟 location 的編輯順序無關。
矯正:這句話不全對,“普通 location ”的匹配規則是“最大前綴”,因此“普通 location ”的確與 location 編輯順序無關;

但是“正則 location ”的匹配規則是“順序匹配,且只要匹配到第一個就停止後面的匹配”;

“普通location ”與“正則 location ”之間的匹配順序是?先匹配普通 location ,再“考慮”匹配正則 location 。

注意這裏的“考慮”是“可能”的意思,也就是說匹配完“普通 location ”後,有的時候需要繼續匹配“正則 location ”,有的時候則不需要繼續匹配“正則 location ”。兩種情況下,不需要繼續匹配正則 location :

  • ( 1 )當普通 location 前面指定了“ ^~ ”,特別告訴 Nginx 本條普通 location 一旦匹配上,則不需要繼續正則匹配;
  • ( 2 )當普通location 恰好嚴格匹配上,不是最大前綴匹配,則不再繼續匹配正則

IP訪問控制

location  {
	   deny  IP /IP段
	   deny  192.168.1.109;
	   allow 192.168.1.0/24;192.168.0.0/16;192.0.0.0/8
	}

用戶認證訪問

模塊ngx_http_auth_basic_module 允許使用“HTTP基本認證”協議驗證用戶名和密碼來限制對資源的訪問。

        location ~ (.*)\.avi$ {
                 auth_basic  "closed site";
                 auth_basic_user_file conf/users;
        }

httpd-tools

yum install httpd

htpasswd -c -d /usr/local/users zhangyang

nginx訪問狀態監控

location /basic_status {
    stub_status on;
}

反向代理

通常的代理服務器,只用於代理內部網絡對Internet的連接請求,客戶機必須指定代理服務器,並將本來要直接發送到Web服務器上的http請求發送到代理服務器中由代理服務器向Internet上的web服務器發起請求,最終達到客戶機上網的目的。

反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然後將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器

[外鏈圖片轉存失敗(img-KLMCQT7A-1563871523880)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1562928994400.png)]

經典的反向代理結構

[外鏈圖片轉存失敗(img-EOa3Swgl-1563871523881)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1562929023224.png)]

Proxy_pass http://192.168.43.152/

301重定向問題

upstream

反向代理配合upstream使用

  upstream httpds {
    server 192.168.43.152:80;
    server 192.168.43.153:80;
}

weight(權重)

指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況。

upstream httpds {
    server 127.0.0.1:8050       weight=10 down;
    server 127.0.0.1:8060       weight=1;
     server 127.0.0.1:8060      weight=1 backup;
}
  • down:表示當前的server暫時不參與負載
  • weight:默認爲1.weight越大,負載的權重就越大。
  • backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。
max_conns

可以根據服務的好壞來設置最大連接數,防止掛掉,比如1000,我們可以設置800

upstream httpds {
    server 127.0.0.1:8050    weight=5  max_conns=800;
    server 127.0.0.1:8060    weight=1;
}
max_fails、 fail_timeout

max_fails:失敗多少次 認爲主機已掛掉則,踢出,公司資源少的話一般設置2~3次,多的話設置1次

max_fails=3 fail_timeout=30s代表在30秒內請求某一應用失敗3次,認爲該應用宕機,後等待30秒,這期間內不會再把新請求發送到宕機應用,而是直接發到正常的那一臺,時間到後再有請求進來繼續嘗試連接宕機應用且僅嘗試1次,如果還是失敗,則繼續等待30秒…以此循環,直到恢復。

upstream httpds {
    server 127.0.0.1:8050    weight=1  max_fails=1  fail_timeout=20;
    server 127.0.0.1:8060    weight=1;
}
負載均衡算法

輪詢+weight ip_hash url_hash least_conn least_time

健康檢查模塊

配置一個status的location

location /status {
            check_status;
 
        }

在upstream配置如下

check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;

session共享

Memcached

安裝
  • 安裝libevent
  • 安裝memcached

可以用yum方式安裝 yum –y install memcached

啓動memcached
memcached -d -m 128 -u root -l 192.168.43.151 -p 11211 -c 256 -P /tmp/memcached.pid
memcached-tool 192.168.2.51:11211
參數解釋:
	-d:後臺啓動服務
	-m:緩存大小
	-p:端口
	-l:IP
	-P:服務器啓動後的系統進程ID,存儲的文件
	-u:服務器啓動是以哪個用戶名作爲管理用戶

Nginx配置

upstream tomcat{
        server 192.168.2.52:8080;
        server 192.168.2.53:8080;
      }

        location /tomcat {
        proxy_pass http://tomcat/;
      } 

Tomcat配置

到tomcat的lib下,jar包見附件

每個tomcat裏面的context.xml中加入

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
	memcachedNodes="n1:192.168.43.151:11211" 
    sticky="false" 
    lockingMode="auto"
    sessionBackupAsync="false"
	requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" 
/>

http_proxy 本地磁盤緩存

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
     set $upstream http://ip:port
          location / {
                   proxy_cache my_cache;
                   proxy_pass $upstream;
                }
}


	/path/to/cache  #本地路徑,用來設置Nginx緩存資源的存放地址
	levels          #默認所有緩存文件都放在同一個/path/to/cache下,但是會影響緩存的性能,因此通常會在/path/to/cache下面建立子目錄用來分別存放不同的文件。假設levels=1:2,Nginx爲將要緩存的資源生成的key爲f4cd0fbc769e94925ec5540b6a4136d0,那麼key的最後一位0,以及倒數第2-3位6d作爲兩級的子目錄,也就是該資源最終會被緩存到/path/to/cache/0/6d目錄中
	key_zone        #在共享內存中設置一塊存儲區域來存放緩存的key和metadata(類似使用次數),這樣nginx可以快速判斷一個request是否命中或者未命中緩存,1m可以存儲8000個key,10m可以存儲80000個key
	max_size        #最大cache空間,如果不指定,會使用掉所有disk space,當達到配額後,會刪除最少使用的cache文件
	inactive        #未被訪問文件在緩存中保留時間,本配置中如果60分鐘未被訪問則不論狀態是否爲expired,緩存控制程序會刪掉文件。inactive默認是10分鐘。需要注意的是,inactive和expired配置項的含義是不同的,expired只是緩存過期,但不會被刪除,inactive是刪除指定時間內未被訪問的緩存文件
	use_temp_path   #如果爲off,則nginx會將緩存文件直接寫入指定的cache文件中,而不是使用temp_path存儲,official建議爲off,避免文件在不同文件系統中不必要的拷貝
	proxy_cache     #啓用proxy cache,並指定key_zone。另外,如果proxy_cache off表示關閉掉緩存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章