日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

1. Nginx簡介

1.1 Nginx 概述

  • NGINX是一個免費、開源、高性能、輕量級的HTTP和反向代理服務器,也是一個電子郵件(IMAP/POP3)代理服務器,其特點是占有內存少,并發能力強。 Nginx 因為它的穩定性、豐富的模塊庫、靈活的配置和較低的資源消耗而聞名 。目前應該是幾乎所有項目建設必備。
  • Nginx由內核和一系列模塊組成,內核提供web服務的基本功能,如啟用網絡協議,創建運行環境,接收和分配客戶端請求,處理模塊之間的交互。Nginx的各種功能和操作都由模塊來實現。Nginx的模塊從結構上分為核心模塊、基礎模塊和第三方模塊。核心模塊: HTTP模塊、EVENT模塊和MAIL模塊基礎模塊: HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊第三方模塊: HTTP Upstream Request Hash模塊、Notice模塊和HTTP Access Key模塊及用戶自己開發的模塊這樣的設計使Nginx方便開發和擴展,也正因此才使得Nginx功能如此強大。Nginx的模塊默認編譯進nginx中,如果需要增加或刪除模塊,需要重新編譯Nginx,這一點不如Apache的動態加載模塊方便。如果有需要動態加載模塊,可以使用由淘寶網發起的web服務器Tengine,在nginx的基礎上增加了很多高級特性,完全兼容Nginx,已被國內很多網站采用。
  • Nginx有很多擴展版本
    • 開源版 nginx.org
    • 商業版 NGINX Plus
    • 淘寶網發起的Web服務器 Tengine
    • 基于Nginx和Lua的Web平臺 OpenResty

1.2 Nginx 作為 web 服務器

Web服務器也稱為WWW(WORLD WIDE WEB)服務器,主要功能是提供網上信息瀏覽服務,常常以B/S(Browser/Server)方式提供服務。

  • 應用層使用HTTP協議。
  • html文檔格式。
  • 瀏覽器統一資源定位器(URL)。

Nginx 可以作為靜態頁面的 web 服務器,同時還支持 CGI 協議的動態語言,比如 perl、php 等,但是不支持 JAVA。Java 程序一般都通過與 Tomcat 配合完成。

作為一名Java猿帥,肯定要理解下Nginx和Tomcat的區別了:

Nginx、Apache和Tomcat

  • Nginx—— 由俄羅斯程序員Igor Sysoev所開發的輕量級、高并發HTTP服務器;
  • Apache HTTP Server Project,一個Apache基金會下的HTTP服務項目,和Nginx功能類似;
  • Apache Tomcat ,則是Apache基金會下的另外一個項目,是一個Application Server,更準確的說是一個servlet應用容器,與Apache HTTP Server和Nginx相比,Tomcat能夠動態的生成資源并返回到客戶端;

Apache HTTP Server和Nginx本身不支持生成動態頁面,但它們可以通過其他模塊來支持(例如通過Shell、PHP、Python腳本程序來動態生成內容);

一個 HTTP Server 關心的是 HTTP 協議層面的傳輸和訪問控制,所以在 Apache/Nginx 上你可以看到代理、負載均衡等功能。客戶端通過 HTTP Server 訪問服務器上存儲的資源(HTML 文件、圖片文件等等)。通過 CGI 技術,也可以將處理過的內容通過 HTTP Server 分發,但是一個 HTTP Server 始終只是把服務器上的文件如實的通過 HTTP 協議傳輸給客戶端。

而應用服務器,則是一個應用執行的容器。它首先需要支持開發語言的運行(對于 Tomcat 來說,就是 Java),保證應用能夠在應用服務器上正常運行。其次,需要支持應用相關的規范,例如類庫、安全方面的特性。對于 Tomcat 來說,就是需要提供 JSP/Sevlet 運行需要的標準類庫、Interface 等。為了方便,應用服務器往往也會集成 HTTP Server 的功能,但是不如專業的 HTTP Server 那么強大,所以應用服務器往往是運行在 HTTP Server 的背后,執行應用,將動態的內容轉化為靜態的內容之后,通過 HTTP Server 分發到客戶端。

1.3 正向代理

正向代理:如果把局域網外的 Internet 想象成一個巨大的資源庫,則局域網中的客戶端要訪 問 Internet,則需要通過代理服務器來訪問,這種代理服務就稱為正向代理。

正向代理“代理”的是客戶端

比如在家辦公期間,需要連公司的 VPN 辦公,這個就是所謂的”正向代理“。還有我們訪問 google也是。

Nginx通關攻略

 

1.4 反向代理 與 負載均衡

反向代理正好與正向代理相反,反向代理是指以代理服務器來接收Internet上的連接請求,然后將請求轉發到內部網絡上的服務器,并將服務器上得到的結果返回給客戶端,此時代理服務器對外表現就是一個服務器,客戶端對代理是無感知的。

反向代理“代理”的是服務端

再比如,你想本本分分的在“優酷”上看個“愛情片”,youku.com會把你的請求分發到存放片片的那臺機器上,這個就是所謂的”反向代理“。

Nginx通關攻略

 

為什么使用反向代理

  • 保護和隱藏原始資源服務器
  • 加密和SSL加速
  • 通過緩存靜態資源,加速Web請求
  • 實現負載均衡

負載均衡

地址重定向

Nginx 的Rewrite主要的功能就是實現URL重寫

比如輸入360.com 跳轉到了360.cn,baidu.cn跳轉到了baidu.com

1.5 動靜分離

為了加快網站的解析速度,可以把動態頁面和靜態頁面由不同的服務器來解析,加快解析速度,降低原來單個服務器的壓力。 這里指的就是讓動態程序(Java、PHP)去訪問應用服務器,讓緩存、圖片、JS、css等去訪問Nginx。


2. Nginx 安裝

  1. 下載Nginxwget http://nginx.org/download/nginx-1.16.1.tar.gz
  2. 安裝需要編譯的插件yum install gcc c++ yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel
  • 用于編譯c、c++代碼的GCC;
  • 用C語言編寫的正則表達式函數庫Pcre(使用rewrite模塊);
  • 用于數據壓縮的函式庫的Zlib;
  • 安全套接字層密碼庫OpenSSL(啟用SSL支持)
  • 解壓、配置(Nginx支持各種配置選項,文末一一列出 Nginx配置選項 )、編譯、安裝nginxtar -zxvf nginx-1.15.tar.gz cd nginx-1.16.1 cd nginx-1.16.1 ./configure make && sudo make install
  • 啟動、重啟、關閉cd /usr/local/nginx/ cd sbin ./nginx #關閉命令 ./nginx -s stop #重啟,熱部署 ./nginx -s reload #修改配置文件后也別嘚瑟,反正我會動不動就寫錯,檢查修改的nginx.conf配置是否正確 ./nginx -t
  • 驗證(瀏覽器輸入ip)

3. 配置文件

nginx.conf 配置文件主要分為三部分:全局塊、events塊、https塊。

Nginx配置語法:

  • 配置文件由指令和指令塊構成
  • 每條指令以分號(;)結尾,指令和參數間以空格符分隔
  • 指令塊以大括號{}將多條指令組織在一起
  • include語句允許組合多個配置文件以提高可維護性
  • 使用 # 添加注釋
  • 使用 $ 定義變量
  • 部分指令的參數支持正則表達式

3.1 全局塊

全局配置部分用來配置對整個server都有效的參數。主要會設置一些影響 nginx 服務器整體運行的配置指令,主要包括配置運行 Nginx 服務器的用戶(組)、允許生成的 worker process 數,進程 PID 存放路徑、日志存放路徑和類型以 及配置文件的引入等。 示例:

user nobody;
worker_processes  4;
error_log  /data/nginx/logs/error.log  notice; 

3.2 events 塊

events 塊涉及的指令主要影響 Nginx 服務器與用戶的網絡連接,常用的設置包括是否開啟對多 work process 下的網絡連接進行序列化,是否允許同時接收多個網絡連接,選取哪種事件驅動模型來處理連接請求,每個 word process 可以同時支持的最大連接數等。

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

3.3 http 塊

這算是 Nginx 服務器配置中最頻繁的部分,代理、緩存和日志定義等絕大多數功能和第三方模塊的配置都在這里。 需要注意的是:http 塊也可以包括 http 全局塊、server 塊。

3.3.1 http 全局塊

http 全局塊配置的指令包括文件引入、MIME-TYPE 定義、日志自定義、連接超時時間、單鏈接請求數上限等。

http {
    include       mime.types;
    default_type  application/octet-stream;
	sendfile        on;
	keepalive_timeout  65;

3.3.2 server 塊

這塊和虛擬主機有密切關系,虛擬主機從用戶角度看,和一臺獨立的硬件主機是完全一樣的,該技術的產生是為了 節省互聯網服務器硬件成本。

每個 http 塊可以包括多個 server 塊,而每個 server 塊就相當于一個虛擬主機。

而每個 server 塊也分為全局 server 塊,以及可以同時包含多個 locaton 塊。

  • 全局 server 塊也被叫做“虛擬服務器”部分,它描述的是一組根據不同server_name指令邏輯分割的資源,這些虛擬服務器響應HTTP請求,因此都包含在http部分。最常見的配置是本虛擬機主機的監聽配置和本虛擬主機的名稱或 IP 配置。server { listen 80; #server_name也支持通配符,*.example.com、www.example.*、.example.com server_name localhost; #charset koi8-r; #access_log logs/host.access.log main;
  • location 塊一個 server 塊可以配置多個 location 塊。這塊的主要作用是基于 Nginx 服務器接收到的請求字符串(例如 server_name/uri-string),對虛擬主機名稱 (也可以是 IP 別名)之外的字符串(例如 前面的 /uri-string)進行匹配,對特定的請求進行處理。地址定向、數據緩存和應答控制等功能,還有許多第三方模塊的配置也在這里進行。location 指令說明該指令用于匹配 URL。語法如下:location [ = | ~ | ~* | ^~] uri{}?> Tip 注意:如果 uri 包含正則表達式,則必須要有 ~ 或者 ~* 標識。當一個請求進入時,URI將會被檢測匹配一個最佳的location。 location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location / { #try_files指令將會按照給定的參數順序進行匹配嘗試 try_files $uri $uri/ /index.html; }
    • 沒有正則表達式的location被作為最佳的匹配,獨立于含有正則表達式的location順序;
    • 在配置文件中按照查找順序進行正則表達式匹配。在查找到第一個正則表達式匹配之后結束查找。由這個最佳的location提供請求處理。
    • = :該修飾符使用精確匹配并且終止搜索。
    • ~:該修飾符使用區分大小寫的正則表達式匹配。
    • ~*:該修飾符使用不區分大小寫的正則表達式匹配。
    • ^~:用于不含正則表達式的 uri 前,要求 Nginx 服務器找到標識 uri 和請求字 符串匹配度最高的 location 后,立即使用此 location 處理請求,而不再使用 location 塊中的正則 uri 和請求字符串做匹配。

nginx.conf 詳細配置

#定義Nginx運行的用戶和用戶組
user www www; 
#nginx進程數,通常設置成和cpu的數量相等
worker_processes 4; 
#全局錯誤日志定義類型,[debug | info | notice | warn | error | crit]
#error_log  /data/nginx/logs/error.log;
#error_log  /data/nginx/logs/error.log  notice;
#日志文件存放路徑 access_log path [format [buffer=size | off]]
access_log /data/nginx/logs/lazyegg.com/web/access.log combinedio;
#進程pid文件
#pid        logs/nginx.pid;
#指定進程可以打開的最大描述符:數目
#工作模式與連接數上限
##這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與nginx進程數相除,但是nginx分配請求并不是那么均勻,所以最好與ulimit -n 的值保持一致。
#這是因為nginx調度時分配請求到進程并不是那么的均衡,所以假如填寫10240,總并發量達到3-4萬時就有進程可能超過10240了,這時會返回502錯誤。
worker_rlimit_nofile 65535;
#################################  events  ###############################
events {
    #參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
    use epoll
    #單個進程最大連接數(最大連接數=連接數+進程數)
    worker_connections  1024;
    
    #keepalive 超時時間
    keepalive_timeout 60;
    
    #客戶端請求頭部的緩沖區大小。
    client_header_buffer_size 4k;
    
    #這個將為打開文件指定緩存,默認是沒有啟用的,max指定緩存數量,建議和打開文件數一致,inactive是指經過多長時間文件沒被請求后刪除緩存。
    open_file_cache max=65535 inactive=60s;
    #這個是指多長時間檢查一次緩存的有效信息。
    open_file_cache_valid 80s;
        #open_file_cache指令中的inactive參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive時間內一次沒被使用,它將被移除。
    open_file_cache_min_uses 1;
    
    #語法:open_file_cache_errors on | off 默認值:open_file_cache_errors off 使用字段:http, server, location 這個指令指定是否在搜索一個文件是記錄cache錯誤.
    open_file_cache_errors on;
}
##############################   http    ##################################
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http{
    #文件擴展名與文件類型映射表
    include mime.types;
    
    #默認文件類型
    default_type application/octet-stream;
    
    #默認編碼
    charset utf-8;
    
    #服務器名字的hash表大小
    server_names_hash_bucket_size 128;
    
    #客戶端請求頭部的緩沖區大小。
    client_header_buffer_size 32k;
    
    #客戶請求頭緩沖大小。
    large_client_header_buffers 4 64k;
    
    #允許客戶端請求的最大單個文件字節數
    client_max_body_size 8m;
    
    #開啟高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對于普通應用設為 on,如果用來進行下載等應用磁盤IO重負載應用,可設置為off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改成off。
    sendfile on;
    
    #開啟目錄列表訪問,適合下載服務器,默認關閉。
    autoindex on;
    
    #此選項允許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用
    tcp_nopush on;
     
    tcp_nodelay on;
    
    #長連接超時時間,單位是秒
    keepalive_timeout 120;
    
    #FastCGI相關參數是為了改善網站的性能:減少資源占用,提高訪問速度。下面參數看字面意思都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    
    #gzip模塊設置
    gzip on; #開啟gzip壓縮輸出
    gzip_min_length 1k;    #最小壓縮文件大小
    gzip_buffers 4 16k;    #壓縮緩沖區
    gzip_http_version 1.0; #壓縮版本(默認1.1,前端如果是squid2.5請使用1.0)
    gzip_comp_level 2;     #壓縮等級
    gzip_types text/plain application/x-JavaScript text/css application/xml;    #壓縮類型,默認就已經包含textml,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn。
    gzip_vary on;
    #開啟限制IP連接數的時候需要使用
    #limit_zone crawler $binary_remote_addr 10m;
    
        #負載均衡配置
    upstream lazyegg.net {
  
        #upstream的負載均衡,weight是權重,可以根據機器配置定義權重。weigth參數表示權值,權值越高被分配到的幾率越大。
        server 192.168.80.121:80 weight=3;
        server 192.168.80.122:80 weight=2;
        server 192.168.80.123:80 weight=3;
        #nginx的upstream目前支持4種方式的分配
        #1、輪詢(默認)
        #每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。
        #2、weight
        #指定輪詢幾率,weight和訪問比率成正比,用于后端服務器性能不均的情況。
        #例如:
        #upstream bakend {
        #    server 192.168.0.14 weight=10;
        #    server 192.168.0.15 weight=10;
        #}
        #2、ip_hash
        #每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。
        #例如:
        #upstream bakend {
        #    ip_hash;
        #    server 192.168.0.14:88;
        #    server 192.168.0.15:80;
        #}
        #3、fair(第三方)
        #按后端服務器的響應時間來分配請求,響應時間短的優先分配。
        #upstream backend {
        #    server server1;
        #    server server2;
        #    fair;
        #}
        #4、url_hash(第三方)
        #按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為緩存時比較有效。
        #例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法
        #upstream backend {
        #    server squid1:3128;
        #    server squid2:3128;
        #    hash $request_uri;
        #    hash_method crc32;
        #}
        #tips:
        #upstream bakend{#定義負載均衡設備的Ip及設備狀態}{
        #    ip_hash;
        #    server 127.0.0.1:9090 down;
        #    server 127.0.0.1:8080 weight=2;
        #    server 127.0.0.1:6060;
        #    server 127.0.0.1:7070 backup;
        #}
        #在需要使用負載均衡的server中增加 proxy_pass http://bakend/;
        #每個設備的狀態設置為:
        #1.down表示單前的server暫時不參與負載
        #2.weight為weight越大,負載的權重就越大。
        #3.max_fails:允許請求失敗的次數默認為1.當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤
        #4.fail_timeout:max_fails次失敗后,暫停的時間。
        #5.backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。
        #nginx支持同時設置多組的負載均衡,用來給不用的server來使用。
        #client_body_in_file_only設置為On 可以講client post過來的數據記錄到文件中用來做debug
        #client_body_temp_path設置記錄文件的目錄 可以設置最多3層目錄
        #location對URL進行匹配.可以進行重定向或者進行新的代理 負載均衡
    }
    
       #虛擬主機的配置
    server {
        #監聽端口
        listen 80;
        #域名可以有多個,用空格隔開
        server_name lazyegg.net;
        #默認入口文件名稱
        index index.html index.htm index.php;
        root /data/www/lazyegg;
        #對******進行負載均衡
        location ~ .*.(php|php5)?$
        {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
         
        #圖片緩存時間設置
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires 10d;
        }
         
        #JS和CSS緩存時間設置
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
         
        #日志格式設定
        #$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;
        #$remote_user:用來記錄客戶端用戶名稱;
        #$time_local: 用來記錄訪問時間與時區;
        #$request: 用來記錄請求的url與http協議;
        #$status: 用來記錄請求狀態;成功是200,
        #$body_bytes_sent :記錄發送給客戶端文件主體內容大小;
        #$http_referer:用來記錄從那個頁面鏈接訪問過來的;
        #$http_user_agent:記錄客戶瀏覽器的相關信息;
        #通常web服務器放在反向代理的后面,這樣就不能獲取到客戶的IP地址了,通過$remote_add拿到的IP地址是反向代理服務器的iP地址。反向代理服務器在轉發請求的http頭信息中,可以增加x_forwarded_for信息,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址。
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for';
         
        #定義本虛擬主機的訪問日志
        access_log  /usr/local/nginx/logs/host.access.log  main;
        access_log  /usr/local/nginx/logs/host.access.404.log  log404;
         
        #對 "/connect-controller" 啟用反向代理
        location /connect-controller {
            proxy_pass http://127.0.0.1:88; #請注意此處端口號不能與虛擬主機監聽的端口號一樣(也就是server監聽的端口)
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
             
            #后端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             
            #以下是一些反向代理的配置,可選。
            proxy_set_header Host $host;
            #允許客戶端請求的最大單文件字節數
            client_max_body_size 10m;
            #緩沖區代理緩沖用戶端請求的最大字節數,
            #如果把它設置為比較大的數值,例如256k,那么,無論使用firefox還是IE瀏覽器,來提交任意小于256k的圖片,都很正常。如果注釋該指令,使用默認的client_body_buffer_size設置,也就是操作系統頁面大小的兩倍,8k或者16k,問題就出現了。
            #無論使用firefox4.0還是IE8.0,提交一個比較大,200k左右的圖片,都返回500 Internal Server Error錯誤
            client_body_buffer_size 128k;
            #表示使nginx阻止HTTP應答代碼為400或者更高的應答。
            proxy_intercept_errors on;
            #后端服務器連接的超時時間_發起握手等候響應超時時間
            #nginx跟后端服務器連接超時時間(代理連接超時)
            proxy_connect_timeout 90;
            #后端服務器數據回傳時間(代理發送超時)
            #后端服務器數據回傳時間_就是在規定時間之內后端服務器必須傳完所有的數據
            proxy_send_timeout 90;
            #連接成功后,后端服務器響應時間(代理接收超時)
            #連接成功后_等候后端服務器響應時間_其實已經進入后端的排隊之中等候處理(也可以說是后端服務器處理請求的時間)
            proxy_read_timeout 90;
            #設置代理服務器(nginx)保存用戶頭信息的緩沖區大小
            #設置從被代理服務器讀取的第一部分應答的緩沖區大小,通常情況下這部分應答中包含一個小的應答頭,默認情況下這個值的大小為指令proxy_buffers中指定的一個緩沖區的大小,不過可以將其設置為更小
            proxy_buffer_size 4k;
            #proxy_buffers緩沖區,網頁平均在32k以下的設置
            #設置用于讀取應答(來自被代理服務器)的緩沖區數目和大小,默認情況也為分頁大小,根據操作系統的不同可能是4k或者8k
            proxy_buffers 4 32k;
            #高負荷下緩沖大小(proxy_buffers*2)
            proxy_busy_buffers_size 64k;
            #設置在寫入proxy_temp_path時數據的大小,預防一個工作進程在傳遞文件時阻塞太長
            #設定緩存文件夾大小,大于這個值,將從upstream服務器傳
            proxy_temp_file_write_size 64k;
        }
        
        #本地動靜分離反向代理配置
        #所有jsp的頁面均交由tomcat或resin處理
        location ~ .(jsp|jspx|do)?$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8080;
        }
    }
}

4. Nginx 配置實例

4.1 反向代理demo1

實現效果:使用 nginx 反向代理,訪問 test.com 直接跳轉到自己的機器 127.0.0.1:8080

  1. 啟動一個 tomcat,瀏覽器地址欄輸入 127.0.0.1:8080,出現如下界面
Nginx通關攻略

 

  1. 通過修改本地 host 文件(C:windowsSystem32driversetc),添加127.0.0.1 www.12345.com將 www.12345.com 映射到自己的機器ip上
  2. 配置完成之后,我們便可以通過 www.test.com:8080 訪問到第一步出現的 Tomcat 初始界面。那么如何只需要輸入 www.12345.com 便可以跳轉到 Tomcat 初始界面呢?便用到 nginx 的反向代理。
  3. 修改nginx.conf 配置文件,增加如下配置 proxy_pass
    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
               proxy_pass http://127.0.0.1:8080;
        }
  1. 如上配置,我們監聽 80 端口,訪問域名為 www.12345.com,不加端口號時默認為 80 端口,故訪問該域名時會跳轉到 127.0.0.1:8080 路徑上。在瀏覽器端輸入 www.12345.com 結果如下:
Nginx通關攻略

 

4.2 反向代理demo2

實現效果:使用 nginx 反向代理,根據訪問的路徑跳轉到不同端口的服務中

訪問 http://127.0.0.1/java/ 直接跳轉到 127.0.0.1:8080

訪問 http://127.0.0.1/egg/ 直接跳轉到 127.0.0.1:8081

  1. 在服務器上起兩個tomcat,修改其中一個端口號為8081; 在tomcat/webapps/目錄下的各加兩個文件夾,并隨便寫個html頁面),我建的是java/index.html和egg/index.html
  2. 修改nginx.conf,在http塊中添加serve{}server { listen 80; server_name localhost; location ~ /java/ { proxy_pass http://127.0.0.1:8080; } location /egg/ { proxy_pass http://127.0.0.1:8081; } }
  3. 重啟nginx,驗證效果

4.3 Nginx 配置-負載均衡

隨著互聯網信息的爆炸性增長,負載均衡(load balance)已經不再是一個很陌生的話題, 顧名思義,負載均衡即是將負載分攤到不同的服務單元,既保證服務的可用性,又保證響應足夠快,給用戶很好的體驗。快速增長的訪問量和數據流量催生了各式各樣的負載均衡產品, 很多專業的負載均衡硬件提供了很好的功能,但卻價格不菲,這使得負載均衡軟件大受歡迎, nginx 就是其中的一個,在 linux 下有 Nginx、LVS、Haproxy 等等服務可以提供負載均衡服務。

Nginx的負載均衡是proxy模塊和upstream模塊搭配實現的。upstream模塊將會啟用一個新的配置區段,在該區段定義了一組上游服務器。

實現效果:配置負載均衡

  1. 同時啟動兩個Tomcat(為了方便驗證效果,修改tomcat端口號的同時,順便將Tomcat默認歡迎頁面apache-tomcat-9.0.29/webapps/ROOR目錄下的index.jsp修改下,看下8081歡迎頁的“蛋蛋”沒)
  2. 修改nginx.confhttp { upstream myserver { server localhost:8080; server localhost:8081; } server { listen 80; location / { proxy_pass http://myserver; } } }
  3. 重啟nginx,驗證效果(默認輪詢的方式,每次打開新窗口,8080和8081會交替出現,同一個窗口的話需要關閉瀏覽器緩存)

Nginx 分配策略:

  1. 輪詢(默認) 每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器 down 掉,能自動剔除
  2. weight weight 代表權,重默認為 1,權重越高被分配的客戶端越多 指定輪詢幾率,weight 和訪問比率成正比,用于后端服務器性能不均的情況。 例如: upstream server_pool{ server 192.168.5.21 weight=10; server 192.168.5.22 weight=10; }
  3. ip_hash 每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決 session 的問題。 例如:upstream server_pool{ ip_hash; server 192.168.5.21:80; server 192.168.5.22:80; }
  4. fair(第三方) 按后端服務器的響應時間來分配請求,響應時間短的優先分配。upstream server_pool{ server 192.168.5.21:80; server 192.168.5.22:80; fair; }

4.4 Nginx 配置-動靜分離

Nginx 動靜分離簡單來說就是把動態跟靜態請求分開,不能理解成只是單純的把動態頁面和靜態頁面物理分離。嚴格意義上說應該是動態請求跟靜態請求分開,可以理解成使用 Nginx 處理靜態頁面,Tomcat 處理動態頁面。動靜分離從目前實現角度來講大致分為兩種, 一種是純粹把靜態文件獨立成單獨的域名,放在獨立的服務器上,也是目前主流推崇的方案; 另外一種方法就是動態跟靜態文件混合在一起發布,通過 nginx 來分開。 通過 location 指定不同的后綴名實現不同的請求轉發。通過 expires 參數設置,可以使瀏覽器緩存過期時間,減少與服務器之前的請求和流量。具體 Expires 定義:是給一個資 源設定一個過期時間,也就是說無需去服務端驗證,直接通過瀏覽器自身確認是否過期即可, 所以不會產生額外的流量。此種方法非常適合不經常變動的資源。(如果經常更新的文件, 不建議使用 Expires 來緩存),我這里設置 3d,表示在這 3 天之內訪問這個 URL,發送 一個請求,比對服務器該文件最后更新時間沒有變化,則不會從服務器抓取,返回狀態碼 304,如果有修改,則直接從服務器重新下載,返回狀態碼 200。

Nginx通關攻略

 

  1. 服務器找個目錄存放自己的靜態文件
  2. 修改nginx.conf server { listen 80; server_name localhost; location /static/ { root /usr/data/www; } location /image/ { root /usr/data/; autoindex on; }
  3. ./nginx -s reload,驗證效果

添加監聽端口、訪問名字 重點是添加 location, 最后檢查 Nginx 配置是否正確即可,然后測試動靜分離是否成功,之需要刪除后端 tomcat 服務器上的某個靜態文件,查看是否能訪問,如果可以訪問說明靜態資源 nginx 直接返回 了,不走后端 tomcat 服務器

4.5 Nginx的Rewrite

Rewrite是Nginx服務器提供的一個重要的功能,它可以實現URL重寫和重定向功能。

場景:

  • URL訪問跳轉,支持開發設計。 頁面跳轉、兼容性支持(新舊版本更迭)、展示效果(網址精簡)等
  • seo優化(Nginx偽靜態的支持)
  • 后臺維護、流量轉發等
  • 安全(動態界面進行偽裝)

該指令是通過正則表達式的使用來改變URI。可以同時存在一個或多個指令。需要按照順序依次對URL進行匹配和處理。

該指令可以在server塊或location塊中配置,其基本語法結構如下:

rewrite regex replacement [flag];
  1. 采用反向代理demo2中的例子,修改nginx.conf(只多加了一行rewrite)server { listen 80; server_name localhost; location /java/ { proxy_pass http://127.0.0.1:8080; rewrite ^/java /egg/ redirect; } location /egg/ { proxy_pass http://127.0.0.1:8081; } }
  2. ./nginx -s reload,驗證效果(輸入ip/java/被重定向到了egg)

rewrite指令可以在server塊或location塊中配置,其基本語法結構如下:

rewrite regex replacement [flag];
  • rewrite的含義:該指令是實現URL重寫的指令。
  • regex的含義:用于匹配URI的正則表達式。
  • replacement:將regex正則匹配到的內容替換成 replacement。
  • flag: flag標記,flag有如下值:
    • last: 本條規則匹配完成后,繼續向下匹配新的location URI 規則。(不常用)
    • break: 本條規則匹配完成即終止,不再匹配后面的任何規則(不常用)。
    • redirect: 返回302臨時重定向,瀏覽器地址會顯示跳轉新的URL地址。
    • permanent: 返回301永久重定向。瀏覽器地址會顯示跳轉新的URL地址。
rewrite ^/(.*) http://www.360.cn/$1 permanent;

4.6 Nginx 高可用

如果將Web服務器集群當做一個城池,那么負載均衡服務器就相當于城門。如果“城門”關閉了,與外界的通道就斷了。如果只有一臺Nginx負載服務器,當故障宕機的時候,就會導致整個網站無妨訪問。所以我們需要兩臺以上Nginx來實現故障轉移和高可用。

Nginx通關攻略

 

配置高可用

雙機熱備方案

這種方案是國內企業中最為普遍的一種高可用方案,雙機熱備其實就是指一臺服務器在提供服務,另一臺為某服務的備用狀態,當一臺服務器不可用另外一臺就會頂替上去。

keepalived是什么?

Keepalived軟件起初是專為LVS負載均衡軟件設計的,用來管理并監控LVS集群系統中各個服務節點的狀態,后來又加入了可以實現高可用的VRRP (Virtual Router Redundancy Protocol ,虛擬路由器冗余協議)功能。因此,Keepalived除了能夠管理LVS軟件外,還可以作為其他服務(例如:Nginx、Haproxy、MySQL等)的高可用解決方案軟件

故障轉移機制

Keepalived高可用服務之間的故障切換轉移,是通過VRRP 來實現的。 在 Keepalived服務正常工作時,主 Master節點會不斷地向備節點發送(多播的方式)心跳消息,用以告訴備Backup節點自己還活著,當主 Master節點發生故障時,就無法發送心跳消息,備節點也就因此無法繼續檢測到來自主 Master節點的心跳了,于是調用自身的接管程序,接管主Master節點的 IP資源及服務。而當主 Master節點恢復時,備Backup節點又會釋放主節點故障時自身接管的IP資源及服務,恢復到原來的備用角色。

實現

  1. 準備兩臺安裝Nginx和keepaliver(yum install keepalived -y)的服務器
  2. 修改兩臺服務器上的/etc/keepalived/keepalived.conf

#主機

#檢測腳本

vrrp_script chk_http_port {

script "/usr/local/src/check_nginx.sh" #心跳執行的腳本,檢測nginx是否啟動

interval 2 #(檢測腳本執行的間隔,單位是秒)

weight 2 #權重

}

#vrrp 實例定義部分

vrrp_instance VI_1 {

state MASTER # 指定keepalived的角色,MASTER為主,BACKUP為備

interface ens33 # 當前進行vrrp通訊的網絡接口卡(當前centos的網卡) 用ifconfig查看你具體的網卡

virtual_router_id 66 # 虛擬路由編號,主從要一直

priority 100 # 優先級,數值越大,獲取處理請求的優先級越高

advert_int 1 # 檢查間隔,默認為1s(vrrp組播周期秒數)

#授權訪問

authentication {

auth_type PASS #設置驗證類型和密碼,MASTER和BACKUP必須使用相同的密碼才能正常通信

auth_pass 1111

}

track_script {

chk_http_port #(調用檢測腳本)

}

virtual_ipaddress {

192.168.16.150 # 定義虛擬ip(VIP),可多設,每行一個

}

}

# 備機

#檢測腳本

vrrp_script chk_http_port {

script "/usr/local/src/check_nginx.sh" #心跳執行的腳本,檢測nginx是否啟動

interval 2 #(檢測腳本執行的間隔)

weight 2 #權重

}

#vrrp 實例定義部分

vrrp_instance VI_1 {

state BACKUP # 指定keepalived的角色,MASTER為主,BACKUP為備

interface ens33 # 當前進行vrrp通訊的網絡接口卡(當前centos的網卡) 用ifconfig查看你具體的網卡

virtual_router_id 66 # 虛擬路由編號,主從要一直

priority 99 # 優先級,數值越大,獲取處理請求的優先級越高

advert_int 1 # 檢查間隔,默認為1s(vrrp組播周期秒數)

#授權訪問

authentication {

auth_type PASS #設置驗證類型和密碼,MASTER和BACKUP必須使用相同的密碼才能正常通信

auth_pass 1111

}

track_script {

chk_http_port #(調用檢測腳本)

}

virtual_ipaddress {

192.168.16.150 # 定義虛擬ip(VIP),可多設,每行一個

}

}

3.新建檢測腳本(chmod 775 check_nginx.sh)

#!/bin/bash

#檢測nginx是否啟動了

A=`ps -C nginx --no-header |wc -l`

if [ $A -eq 0 ];then #如果nginx沒有啟動就啟動nginx

systemctl start nginx #重啟nginx

if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重啟失敗,則停掉keepalived服務,進行VIP轉移

killall keepalived

fi

fi

  1. 啟動Nginx和keepalived(systemctl start keepalived.service)
  2. 模擬Nginx故障(關閉主服務器Nginx),驗證,仍可以通過配置的虛擬ip訪問,ok

5. Nginx 原理與優化參數配置

Nginx默認采用多進程工作方式,Nginx啟動后,會運行一個master進程和多個worker進程。其中master充當整個進程組與用戶的交互接口,同時對進程進行監護,管理worker進程來實現重啟服務、平滑升級、更換日志文件、配置文件實時生效等功能。worker用來處理基本的網絡事件,worker之間是平等的,他們共同競爭來處理來自客戶端的請求

Nginx通關攻略

 

master-workers 的機制的好處

  1. 可以使用nginx-s reload 熱部署
  2. 每個worker是獨立的進程,不需要加鎖,省掉了鎖帶來的開銷。采用獨立的進程,可以讓互相之間不會影響,一個進程退出后,其它進程還在工作,服務不會中斷,master 進程則很快啟動新的 worker 進程。

需要設置多少個 worker

Nginx 同 redis 類似都采用了 io 多路復用機制,每個 worker 都是一個獨立的進程,但每個進程里只有一個主線程,通過異步非阻塞的方式來處理請求,即使是千上萬個請求也不在話下。每個 worker 的線程可以把一個 cpu 的性能發揮到極致。所以 worker 數和服務器的 cpu 數相等是最為適宜的。設少了會浪費 cpu,設多了會造成 cpu 頻繁切換上下文帶來的損耗。

#設置 worker 數量。
 worker_processes 4 
#work 綁定 cpu(4 work 綁定 4cpu)。 
 worker_cpu_affinity 0001 0010 0100 1000 
#work 綁定 cpu (4 work 綁定 8cpu 中的 4 個) 。 
 worker_cpu_affinity 0000001 00000010 00000100 00001000

連接數 worker_connection

這個值是表示每個 worker 進程所能建立連接的最大值,所以,一個 nginx 能建立的最大連接數,應該是 worker_connections * worker_processes。當然,這里說的是最大連接數,對于 HTTP 請 求 本 地 資 源 來 說 , 能 夠 支 持 的 最 大 并 發 數 量 是 worker_connections * worker_processes,如果是支持 http1.1 的瀏覽器每次訪問要占兩個連接,所以普通的靜態訪 問最大并發數是: worker_connections * worker_processes /2,而如果是 HTTP 作 為反向代理來說,最大并發數量應該是 worker_connections * worker_processes/4。因為作為反向代理服務器,每個并發會建立與客戶端的連接和與后端服 務的連接,會占用兩個連接。

Nginx請求處理流程

Nginx通關攻略

 


6. Nginx模塊開發

由于Nginx的模塊化特性,所以可以支持模塊配置,也可以自定義模塊,Nginx的模塊開發,程序員目前還不需要太深入

Nginx模塊分類

Nginx通關攻略

 

Nginx配置選項

解壓nginx后的配置操作示例

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-pcre  --with-http_ssl_module

選項解釋--prefix=<path>Nginx安裝的根目錄,所有其他安裝路徑都要依賴于該選項--sbin- path=<path>指定Nginx二進制文件的路徑--conf-path=<path>指定nginx.conf配置文件的路徑--error-log- path=<path>指定錯誤文件的路徑--user=nameworker進程運行的用戶--group=<group>worker進程運行的組--with-http_ssl_module使用https協議模塊。默認情況下該模塊沒有被構建。前提是openssl與openssl-devel已安裝--with-http_image_filter_module該模塊被用作圖像過濾器使用,將圖像投遞給客戶前先進行過濾(需要libgd庫)--with-http_stub_status_module啟用這個模塊會收集Nginx自身狀態信息,常用來做監控--with-mail啟用mail模塊,默認沒有被激活--without-http_autoindex_module禁用:如果一個目錄沒有index文件,該模塊能收集文件并列出--add-module=<path>添加第三方外部模塊,每次添加新的模塊都要重新編譯

參考:

《Nginx核心知識100講》 《精通Nginx》 https://juejin.im/post/5c1616186fb9a049a42ef21d 《尚硅谷Nginx》

分享到:
標簽:Nginx
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定