Nginx學(xué)習(xí)筆記

  • Nginx ("engine x")是一個高性能的HTTP反向代理web服務(wù)器,特點是占有內(nèi)存少辉哥,并發(fā)能力強恼布。
  • 正向代理:在客戶端(瀏覽器)配置代理服務(wù)器,通過代理服務(wù)器進行互聯(lián)網(wǎng)訪問秕岛。
  • 反向代理:將請求發(fā)送到反向代理服務(wù)器碌燕,由反向代理服務(wù)器去選擇目標(biāo)服務(wù)器獲取數(shù)據(jù)后再返回給客戶端误证,暴露的是代理服務(wù)器地址,隱藏了真實服務(wù)器的IP地址修壕。
  • 負載均衡:將原先請求集中到單個服務(wù)器上的流量改為分發(fā)到多個服務(wù)器上愈捅。
  • 動靜分離:把動態(tài)頁面和靜態(tài)頁面分別由不同的服務(wù)器來解析,以加快網(wǎng)站的解析速度慈鸠,降低原來單個服務(wù)器的壓力蓝谨。
  • 查看Nginx版本號:./nginx -v
  • 查看Nginx安裝路徑:whereis nginx/usr/local/nginx
  • 啟動Nginx./nginx
  • 停止Nginx./nginx -s stop
  • 重新加載Nginx./nginx -s reload
  • 查看Nginx進程狀態(tài):ps -ef | grep nginx
  • docker 拉取 Nginx 鏡像并運行一個容器實例:

docker search nginx
docker pull nginx
docker images nginx
docker run -d --name mynginx -p 80:80 nginx
docker ps
docker exec -it mynginx /bin/bash

  • 配置文件:nginx.conf/usr/local/nginx/conf/nginx.conf,其內(nèi)容包含3部分:

全局塊:從首行到events塊之間的內(nèi)容青团,主要設(shè)置一些影響 nginx 服務(wù)器整體運行的配置指令譬巫,包括配置運行 Nginx 服務(wù)器的用戶(組)、允許生成的 worker process 數(shù)壶冒,進程 PID 存放路徑缕题、日志存放路徑和類型以及配置文件的引入等。
events塊:主要影響 Nginx 服務(wù)器與用戶的網(wǎng)絡(luò)連接胖腾。常用的設(shè)置包括是否開啟對多 work process下的網(wǎng)絡(luò)連接進行序列化烟零,是否允許同時接收多個網(wǎng)絡(luò)連接,選取哪種事件驅(qū)動模型來處理連接請求咸作,每個 word process 可以同時支持的最大連接數(shù)等锨阿。
http塊:包括http全局塊server塊。每個http 塊可以包括多個server 塊记罚,而每個server 塊就相當(dāng)于一個虛擬主機墅诡。
(3.1)、http全局塊配置的指令包括文件引入桐智、MIME-TYPE 定義末早、日志自定義、連接超時時間说庭、單鏈接請求數(shù)上限等然磷。
(3.2)、server塊:這塊和虛擬主機有密切關(guān)系刊驴,從用戶的角度看姿搜,虛擬主機相當(dāng)于一臺獨立的硬件主機,該技術(shù)的產(chǎn)生是為了節(jié)省互聯(lián)網(wǎng)服務(wù)器硬件成本捆憎。每個server塊分為全局server塊和多個location塊舅柜。
(3.2.1)、全局server塊:最常見的配置是本虛擬機主機的監(jiān)聽配置和本虛擬主機的名稱或 IP 配置躲惰。
(3.2.2)致份、location塊:一個server塊可以配置多個location塊〈〔Γ基于 Nginx 服務(wù)器接收到的請求字符串(例如 server_name/uri-string)知举,對虛擬主機名稱(也可以是 IP 別名)之外的字符串(例如 前面的 /uri-string)進行匹配瞬沦,對特定的請求進行處理。地址定向雇锡、數(shù)據(jù)緩存和應(yīng)答控制等功能逛钻,還有許多第三方模塊的配置也在這里進行。

  • 修改Nginx 配置文件:nginx.conf
# ================ 1锰提、全局塊開始 ==================
#user  nobody;
# worker_processes 值越大曙痘,可以支持的并發(fā)處理量也就越多,但會受到硬件立肘、軟件等設(shè)備的制約
worker_processes  1; 

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

# ================ 1边坤、全局塊結(jié)束 ==================

# ================ 2、events 塊開始 ===============

events {
    # 每個 work process 支持的最大連接數(shù)為 1024
    worker_connections 1024;
}

# ================ 2谅年、events 塊結(jié)束 ===============

# ================ 3茧痒、http 塊開始 =================

http {
    # ================ 3.1、http 全局塊開始 =================
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    # ================ 3.1融蹂、http 全局塊結(jié)束 =================

    # ================ 3.2旺订、server 塊開始 ===================

    # 負載均衡服務(wù)列表配置,服務(wù)名為 myserver超燃,weight 為權(quán)重
    upstream myserver {
        server 192.168.211.143:8080;
        server 192.168.211.143:8081;
    }
    
    server {
        # ================ 3.2.1区拳、server 全局塊開始 ===================
        listen       80;
        server_name  192.168.211.143;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;

        # ================ 3.2.2、server 全局塊結(jié)束 ===================

        # ================ 3.2.3意乓、location 塊開始 =====================

        location / {
            proxy_pass  http://myserver;
            root   html;
            index  index.html index.htm;
        }

        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}

        # ================ 3.2.3樱调、location 塊結(jié)束 =====================
    }

    # another virtual host using mix of IP-, name-, and port-based configuration
    # 配置虛擬主機訪問映射規(guī)則
    server {
        listen       9001;
        server_name  192.168.211.143;

        location ~ /edu/ {
            proxy_pass http://127.0.0.1:8080;
        }
        location ~ /vod/ { 
            proxy_pass http://127.0.0.1:8081;
        }
    }

    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    # ================ 3.2、server 塊結(jié)束 ===================
}
# ================ 3届良、http 塊結(jié)束 =================
  • location指令說明:用于匹配URL笆凌。
location [ = | ~ | ~* | ^~] uri {

}

1、=:用于不含正則表達式的URI前士葫,要求請求字符串與URI嚴格匹配乞而,若匹配成功,則停止繼續(xù)向下搜索并立即處理該請求为障。
2晦闰、~:用于表示URI包含正則表達式放祟,且區(qū)分大小寫鳍怨。
3、~*:用于表示URI包含正則表達式跪妥,且不區(qū)分大小寫鞋喇。
4、^~:用于不含正則表達式的URI前眉撵,要求Nginx服務(wù)器找到標(biāo)識URI和請求字符串匹配度最高的location后侦香,立即使用此location處理請求落塑,而不再使用location塊中的正則uri和請求字符串做匹配。

  • 注意: 若uri包含正則表達式罐韩,則必須要有~或者~*標(biāo)識憾赁。
  • Nginx分配服務(wù)器策略:

1、輪詢(默認):每個請求按時間順序逐一分配到不同的后端服務(wù)器散吵,若后端服務(wù)器宕機龙考,則會自動剔除。
2矾睦、權(quán)重weight):代表權(quán)重默認為1晦款,權(quán)重越高被分配的客戶端越多。

# 負載均衡服務(wù)列表配置枚冗,服務(wù)名為 myserver缓溅,weight 為權(quán)重
upstream myserver {
    server 192.168.211.143:8080 weight=5;
    server 192.168.211.143:8081 weight=10;
}

3、ip_hash:每個請求按訪問 ip 的 hash 結(jié)果分配赁温,這樣每個訪客固定訪問一個后端服務(wù)器坛怪,可以解決session問題。

upstream myserver {
    ip_hash;
    server 192.168.211.143:8080;
    server 192.168.211.143:8081;
}
  • 動靜分離:把動態(tài)跟靜態(tài)請求分開束世,可以理解成使用 Nginx處理靜態(tài)頁面酝陈,Tomcat 處理動態(tài)頁面。動靜分離從目前實現(xiàn)角度來講大致分為兩種:一種是純粹把靜態(tài)文件放在獨立的服務(wù)器上毁涉,也是目前主流推崇的方案沉帮;另外一種就是動態(tài)跟靜態(tài)文件混合在一起發(fā)布,通過 nginx 來分開贫堰。具體實現(xiàn):通過 location 指定不同的后綴名實現(xiàn)不同的請求轉(zhuǎn)發(fā):

通過expires參數(shù)設(shè)置穆壕,可以使瀏覽器緩存過期時間,減少與服務(wù)器之前的請求和流量其屏。具體expires定義:給一個資源設(shè)定一個過期時間喇勋,無需去服務(wù)端驗證,直接通過瀏覽器自身確認是否過期即可偎行,所以不會產(chǎn)生額外的流量川背。此種方法非常適合不經(jīng)常變動的資源。若是經(jīng)常更新的文件蛤袒,則不建議使用expires來緩存熄云。假設(shè)設(shè)置某個url的expires值為3d,表示在這 3 天之內(nèi)訪問這個 URL妙真,發(fā)送一個請求缴允,比對服務(wù)器該文件最后更新時間沒有變化,就不會從服務(wù)器抓取珍德,返回狀態(tài)碼304练般;若有修改矗漾,則直接從服務(wù)器重新下載,返回狀態(tài)碼200薄料。(304狀態(tài)碼:當(dāng)你發(fā)出一個GET請求時服務(wù)器會從緩存中調(diào)用你要訪問的內(nèi)容敞贡,這個時候服務(wù)器就可以判斷這個頁面是不是更新過了,如果未更新過那么它會給你返回一個304狀態(tài)碼摄职。)

# 訪問 url:ip/www/index.html
location /www/ {
    root /data/;
    index  index.html index.htm;
}
# 訪問 url:ip/image/01.jpg
location /image/ {
    root /data/;
    # 列出當(dāng)前文件夾下的所有文件及文件夾
    autoindex on;
}
動靜分離1
動靜分離2.1
動靜分離2.2
  • Nginx高可用:兩臺業(yè)務(wù)系統(tǒng)啟動著相同的服務(wù)嫡锌,若有一臺出現(xiàn)故障,則另一臺自動接管琳钉。通過keekpalived軟件來實現(xiàn)势木。作用是檢測服務(wù)器的狀態(tài),如果有一臺web服務(wù)器宕機歌懒,或工作出現(xiàn)故障啦桌,Keepalived將檢測到,并將有故障的服務(wù)器從系統(tǒng)中剔除及皂,同時使用其他服務(wù)器代替該服務(wù)器的工作甫男。當(dāng)服務(wù)器工作正常后Keepalived自動將服務(wù)器加入到服務(wù)器群中,這些工作全部自動完成验烧,不需要人工干涉板驳,需要人工做的只是修復(fù)故障的服務(wù)器。
Nginx高可用配置
  • 安裝命令:yum install keepalived碍拆。查看是否安裝成功:rpm -q -a keepalived若治。
  • keepalived軟件主要是通過VRRP協(xié)議實現(xiàn)高可用的功能。VRRPVirtual Router RedundancyProtocol(虛擬路由器冗余協(xié)議)的縮寫感混,其目的為了解決靜態(tài)路由出現(xiàn)的單點故障問題端幼,能夠保證當(dāng)個別節(jié)點宕機時,整個網(wǎng)絡(luò)可以不間斷地運行弧满。
keepalived安裝成功
keepalived安裝成功后生成目錄及其配置文件
  • 修改keepalived的配置文件:keepalived.conf
# 全局定義
global_defs { 
    # 設(shè)置報警郵件地址婆跑,可以設(shè)置多個,每行一個庭呜,需要開啟 sendmail服務(wù)
    notification_email {
      acassen@firewall.loc
      failover@firewall.loc
      sysadmin@firewall.loc
    }
    # 設(shè)置郵件的發(fā)送地址
    notification_email_from Alexandre.Cassen@firewall.loc
    # 設(shè)置 SMTP Server 地址
    smtp_ server 192.168.17.129
    # 設(shè)置 SMTP Server 超時時間
    smtp_connect_timeout 30
    # 表示運行 keeplived 服務(wù)器的一個標(biāo)識滑进,發(fā)郵件時顯示大郵件主題中的信息
    # LVS_DEVEL這字段在/etc/hosts文件中設(shè)置募谎;通過它訪問到主機:127.0.0.1 LVS_DEVEL
    router_id LVS_DEVEL 
}

vrrp_script chk_http_ port {
    script "/usr/local/src/nginx_check.sh"
    interval 2   # 檢測腳本執(zhí)行的間隔:2s
    weight 2  # 權(quán)重:若這個腳本檢測為真,則服務(wù)器權(quán)重+2
}

vrrp_instance VI_1 {
    state BACKUP   # 備份服務(wù)器上將 MASTER 改為 BACKUP
    interface ens32 # 網(wǎng)卡名稱近哟,通過 ifconfig 命令查看
    virtual_router_id 51 # 主鲫寄、備機的 virtual_router_id 必須相同
    priority 100   # 主吉执、備機取不同的優(yōu)先級,主機值較大戳玫,備份機值較小
    advert_int 1    # 每隔1s發(fā)送一次心跳
    authentication {    # 校驗方式:類型是密碼,密碼1111
        auth type PASS
        auth pass 1111
    }
    virtual_ipaddress { # 虛擬ip
        192.168.211.50 # VRRP H虛擬ip地址
    }
}
  • 在路徑/usr/local/src/下新建檢測腳本nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];
    then /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];
        then killall keepalived
    fi
fi
  • 給腳本nginx_check.sh加個執(zhí)行權(quán)限:chmod u+x nginx_check.sh
  • 啟動keepalived:systemctl start keepalived.service
  • 停止keepalived:systemctl stop keepalived.service
  • 查看keepalived進程狀態(tài):ps -ef | grep keepalived
訪問虛擬ip:192.168.211.50
查看虛擬ip相關(guān)信息

查看nginx進程狀態(tài)
master與worker的關(guān)系
worker搶占式工作原理
  • 1個 master 和多個 woker 的好處:①可以使用nginx –s reload 進行熱部署操作;②每個 woker 都是獨立的進程府阀,若其中1個 woker 出現(xiàn)問題缆镣,則其他 woker 不受影響,繼續(xù)進行爭搶试浙,實現(xiàn)請求過程董瞻,不會造成服務(wù)中斷。
  • 設(shè)置多少個 woker 合適:Nginx同redis類似都采用了IO多路復(fù)用機制田巴,每個worker都是1個獨立的進程钠糊, 但每個進程里只有1個主線程,通過異步非阻塞的方式來處理請求壹哺。即使是千上萬個請求也不在話下抄伍。每個worker的線程可以把1個cpu的性能發(fā)揮到極致。因此管宵,worker數(shù)和服務(wù)器的cpu數(shù)相等是最為適宜的選擇截珍。設(shè)置少了會浪費cpu,多了會造成cpu頻繁切換上下文帶來的損耗箩朴。
# 設(shè)置worker數(shù)量
worker.processes 4 

# work綁定cpu(4work綁定4cpu)
worker_cpu_affinity 0001 0010 0100 1000

# work綁定cpu (4work綁定8cpu中的4個)
worker_cpu_affinity 0000001 00000010 00000100 00001000
  • 連接數(shù)worker_connection:①發(fā)送請求笛臣,占用了woker 2個或4個連接數(shù)。②nginx 有一個 master隧饼,有四個 woker沈堡,每個 woker 支持最大的連接數(shù) 1024,支持的最大并發(fā)數(shù)是多少燕雁?

a诞丽、普通的靜態(tài)訪問最大并發(fā)數(shù)是: worker_connections * worker_processes /2;
b拐格、若是HTTP 作為反向代理僧免,則最大并發(fā)數(shù)量為worker_connections * worker_processes/4。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捏浊,一起剝皮案震驚了整個濱河市懂衩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖浊洞,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牵敷,死亡現(xiàn)場離奇詭異,居然都是意外死亡法希,警方通過查閱死者的電腦和手機枷餐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苫亦,“玉大人毛肋,你說我怎么就攤上這事∥萁#” “怎么了润匙?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵趁桃,是天一觀的道長肄鸽。 經(jīng)常有香客問我,道長蟀苛,這世上最難降的妖魔是什么帜平? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任裆甩,我火速辦了婚禮齐唆,結(jié)果婚禮上箍邮,老公的妹妹穿的比我還像新娘。我一直安慰自己堪澎,他們只是感情好味滞,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著爽醋,像睡著了一般土匀。 火紅的嫁衣襯著肌膚如雪就轧。 梳的紋絲不亂的頭發(fā)上妒御,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天乎莉,我揣著相機與錄音奸笤,去河邊找鬼。 笑死边灭,一個胖子當(dāng)著我的面吹牛绒瘦,可吹牛的內(nèi)容都是我干的扣癣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼该酗,長吁一口氣:“原來是場噩夢啊……” “哼垂涯!你這毒婦竟也來了耕赘?” 一聲冷哼從身側(cè)響起膳殷,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎册招,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虑鼎,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡炫彩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年狠半,在試婚紗的時候發(fā)現(xiàn)自己被綠了齿拂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片飒责。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡席里,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奖磁,到底是詐尸還是另有隱情,我是刑警寧澤寥裂,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布封恰,位于F島的核電站诺舔,受9級特大地震影響备畦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜褥赊,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一拌喉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尿背,春花似錦、人聲如沸荔烧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽市袖。三九已至,卻和暖如春酒觅,著一層夾襖步出監(jiān)牢的瞬間舷丹,已是汗流浹背蜓肆。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工仗扬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彼城。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓募壕,卻偏偏與公主長得像语盈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子习柠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354