天天看點

nginx-1.14.0 使用nginx

為了簡單就在windows 上介紹一下了

nginx

steam 子產品 轉發tcp 對socket做負載均衡

配置如下:

worker_processes  1;
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
stream{
    log_format proxy '$remote_addr [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time "$upstream_addr" '
                 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
    open_log_file_cache off;    
    access_log logs/tcp-access.log proxy ;
    upstream test{
        server xxx.xxx.xxx.xxx:443  weight=1 max_fails=1 fail_timeout=30s;
        server xxx.xxx.xxx.xxx:443 weight=1 max_fails=1 fail_timeout=30s;
    }
    server{
        listen 4438;
        proxy_pass test;
        proxy_connect_timeout 8s;
        proxy_timeout 7d;
    }
}           

upstream 子產品 轉發web socket做負載均衡

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    access_log  logs/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    upstream wsbackend {
        server 127.0.0.1:9123;
    }
    upstream  service {      
      server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=30s; 
    } 
    server {
        listen       443 ssl;
        server_name  localhost;

        ssl_certificate      ../ssl/icetech.com.cn.pem;
        ssl_certificate_key  ../ssl/icetech.com.cn.key;

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

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        location /service { 
              proxy_pass http://service;# 反向代理         
              proxy_set_header  X-Real-IP $remote_addr;
              proxy_next_upstream http_502 http_504 error timeout invalid_header;
        } 
        location / {
               proxy_pass http://wsbackend;
               proxy_http_version 1.1;
               proxy_set_header Upgrade $http_upgrade;
               proxy_set_header Connection "upgrade";       
        }
    }
}           

常用的配置

#user  nobody;       #使用者
worker_processes  1; #工作程序,根據硬體調整,大于等于CPU核數

#error_log  logs/error.log;  #錯誤日志配置
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid; #pid放置位置

events {
    #use epoll;  

    #使用epoll的I/O 模型

    # 補充說明:

    #與apache相類,nginx針對不同的作業系統,有不同的事件模型

    #A)标準事件模型

    #Select、poll屬于标準事件模型,如果目前系統不存在更有效的方法,nginx會選擇select或poll

    #B)高效事件模型

    #Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用雙處理器的MacOS #X系統使用kqueue可能會造成核心崩潰。

    #Epoll:使用于Linux核心2.6版本及以後的系統。

    #/dev/poll:使用于Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。

    #Eventport:使用于Solaris 10. 為了防止出現核心崩潰的問題, 有必要安裝安全更新檔  

    worker_connections  1024;

    #工作程序的最大連接配接數量,根據硬體調整,和前面工作程序配合起來用,盡量大,但是别把cpu跑到100%就行

    #每個程序允許的最多連接配接數, 理論上每台nginx伺服器的最大連接配接數為worker_processes*worker_connections

    keepalive_timeout 60; 
}

#設定http伺服器,利用它的反向代理功能提供負載均衡支援
http {
    include       mime.types;
    default_type  application/octet-stream;  

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    #配置兩台Tomcat真實伺服器
    upstream  B2C_WEB {      
      #ip_hash;     #目的保證用戶端的ip位址不變,請求就隻送到固定的一個Tomcat處理

      server 192.168.126.1:8080 weight=1 max_fails=3 fail_timeout=30s;       
      server 192.168.126.15:8080 weight=1 max_fails=3 fail_timeout=30s;

      #weight=1表示
      #這表示,如果伺服器192.168.126.1 | 15在30秒内出現了3次錯誤,
      #那麼就認為這個伺服器工作不正常,進而在接下來的30秒内nginx不再去通路這個伺服器。
    }  

    server {
        listen       80; #監聽端口
        server_name  localhost;
        charset UTF-8;      
        index index.html index.htm index.jsp index.do;
        root E:\\JavaEE\\Apache-Tomcat-7.0.41\\wtpwebapps; #WEB服務的主目錄

        location ~ ^/(WEB-INF)/ { 
          deny all; #禁止通路WEB-INF目錄
        }           

        # 動态資料由代理伺服器Tomcat處理
        location ~ .*\.(jsp|jspx|do)?$ { 
          proxy_pass http://B2C;# 反向代理         
          proxy_set_header  X-Real-IP $remote_addr;
          proxy_next_upstream http_502 http_504 error timeout invalid_header;
       }    

       # 靜态資料直接讀取不經過Tomcat伺服器
       location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
       {        
         expires      30d; #在用戶端儲存時間
       }
       location ~ .*\.(js|css)?$
       {        
         expires      1h;
       }

       # 監控Nginx服務狀态
       location /Nginxstatus {
         stub_status on;
         access_log   off;
       }        

        #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;
        location = /50x.html {
            root   html;
        }

    }

}           

什麼是nginx

Nginx是一款高性能的http 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器。由俄羅斯的程式設計師Igor Sysoev所開發,官方測試nginx能夠支支撐5萬并發連結,并且cpu、記憶體等資源消耗卻非常低,運作非常穩定。

應用場景

1、http伺服器。Nginx是一個http服務可以獨立提供http服務。可以做網頁靜态伺服器。

2、虛拟主機。可以實作在一台伺服器虛拟出多個網站。例如個人網站使用的虛拟主機。

3、反向代理,負載均衡。當網站的通路量達到一定程度後,單台伺服器不能滿足使用者的請求時,需要用多台伺服器叢集可以使用nginx做反向代理。并且多台伺服器可以平均分擔負載,不會因為某台伺服器負載高當機而某台伺服器閑置的情況。

nginx安裝

下載下傳nginx:

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

要求的安裝環境

1、需要安裝gcc的環境。yum install gcc-c++

2、第三方的開發包。

 PCRE

PCRE(Perl Compatible Regular Expressions)是一個Perl庫,包括 perl 相容的正規表達式庫。nginx的http子產品使用pcre來解析正規表達式,是以需要在linux上安裝pcre庫。

yum install -y pcre pcre-devel

注:pcre-devel是使用pcre開發的一個二次開發庫。nginx也需要此庫。

 zlib

zlib庫提供了很多種壓縮和解壓縮的方式,nginx使用zlib對http包的内容進行gzip,是以需要在linux上安裝zlib庫。

yum install -y zlib zlib-devel

   openssl
    OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協定,并提供豐富的應用程式供測試或其它目的使用。
    nginx不僅支援http協定,還支援https(即在ssl協定上傳輸http),是以需要在linux安裝openssl庫。
yum install -y openssl openssl-devel           

安裝步驟

第一步:把nginx的源碼包上傳到linux系統
第二步:解壓縮
[root@localhost ~]# tar zxf nginx-1.8.0.tar.gz 
第三步:使用configure指令建立一makeFile檔案。
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
注意:啟動nginx之前,上邊将臨時檔案目錄指定為/var/temp/nginx,需要在/var下建立temp及nginx目錄
[root@localhost sbin]# mkdir /var/temp/nginx/client -p
第四步:make
第五步:make install           

啟動nginx

進入sbin目錄

[root@localhost sbin]# ./nginx

關閉nginx:

[root@localhost sbin]# ./nginx -s stop

推薦使用:

[root@localhost sbin]# ./nginx -s quit

重新開機nginx:
1、先關閉後啟動。
2、重新整理配置檔案:
[root@localhost sbin]# ./nginx -s reload           

配置虛拟主機

就是在一台伺服器啟動多個網站。

如何區分不同的網站:

1、域名不同

2、端口不同

通過端口區分不同虛拟機

Nginx的配置檔案:

/usr/local/nginx/conf/nginx.conf

#user  nobody;
    worker_processes  1;

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

    #pid        logs/nginx.pid;

    events {
        worker_connections  1024;
    }

    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;
        #一個server節點就是一個虛拟主機 可以配置多個server,配置了多個虛拟主機。
        server {
            listen       80;
            server_name  localhost;

            #charset koi8-r;

            #access_log  logs/host.access.log  main;

            location / {
                #Html是nginx安裝目錄下的html目錄
                root   html; 
                index  index.html index.htm;
            }
        }
    }
添加虛拟主機:

    #user  nobody;
    worker_processes  1;

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

    #pid        logs/nginx.pid;

    events {
        worker_connections  1024;
    }

    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;

        server {
            listen       80;
            server_name  localhost;

            #charset koi8-r;

            #access_log  logs/host.access.log  main;

            location / {
                root   html;
                index  index.html index.htm;
            }
        }
        server {
            listen       81;
            server_name  localhost;

            #charset koi8-r;

            #access_log  logs/host.access.log  main;

            location / {
                root   html-81;
                index  index.html index.htm;
            }
        }
    }           

通過域名區分虛拟主機

什麼是域名

域名就是網站。

www.baidu.com

www.taobao.com

www.jd.com

Tcp/ip

Dns伺服器:把域名解析為ip位址。儲存的就是域名和ip的映射關系。
    一級域名:
    Baidu.com
    Taobao.com
    Jd.com
    二級域名:
    www.baidu.com
    Image.baidu.com
    Item.baidu.com
    三級域名:
    1.Image.baidu.com
    Aaa.image.baidu.com

    一個域名對應一個ip位址,一個ip位址可以被多個域名綁定。
    本地測試可以修改hosts檔案。
    修改window的hosts檔案:(C:\Windows\System32\drivers\etc)
    可以配置域名和ip的映射關系,如果hosts檔案中配置了域名和ip的對應關系,不需要走dns伺服器。
Nginx的配置

    #user  nobody;
    worker_processes  1;

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

    #pid        logs/nginx.pid;

    events {
        worker_connections  1024;
    }

    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;

        server {
            listen       80;
            server_name  localhost;

            #charset koi8-r;

            #access_log  logs/host.access.log  main;

            location / {
                root   html;
                index  index.html index.htm;
            }
        }
        server {
            listen       81;
            server_name  localhost;

            #charset koi8-r;

            #access_log  logs/host.access.log  main;

            location / {
                root   html-81;
                index  index.html index.htm;
            }
        }
        server {
            listen       80;
            server_name  www.taobao.com;

            #charset koi8-r;

            #access_log  logs/host.access.log  main;

            location / {
                root   html-taobao;
                index  index.html index.htm;
            }
        }
        server {
            listen       80;
            server_name  www.baidu.com;

            #charset koi8-r;

            #access_log  logs/host.access.log  main;

            location / {
                root   html-baidu;
                index  index.html index.htm;
            }
        }
    }

    域名的配置:
        192.168.25.148 www.taobao.com
        192.168.25.148 www.baidu.com           

反向代理

反向代理伺服器決定哪台伺服器提供服務 傳回代理伺服器不提供伺服器。也是請求的轉發。

Nginx實作反向代理

兩個域名指向同一台nginx伺服器,使用者通路不同的域名顯示不同的網頁内容。

兩個域名是www.sian.com.cn和www.sohu.com

nginx伺服器使用虛拟機192.168.101.3

第一步:安裝兩個tomcat,分别運作在8080和8081端口。

第二步:啟動兩個tomcat。

第三步:反向代理伺服器的配置

upstream tomcat1 {

server 192.168.25.148:8080;

}

server {

listen 80;

server_name www.sina.com.cn;

#charset koi8-r;

            #access_log  logs/host.access.log  main;

            location / {
                proxy_pass   http://tomcat1;
                index  index.html index.htm;
            }
        }
        upstream tomcat2 {
        server 192.168.25.148:8081;
        }
        server {
            listen       80;
            server_name  www.sohu.com;

            #charset koi8-r;

            #access_log  logs/host.access.log  main;

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

第四步:nginx重新加載配置檔案

第五步:配置域名

在hosts檔案中添加域名和ip的映射關系

192.168.25.148 www.sina.com.cn

192.168.25.148 www.sohu.com

什麼是負載均衡高可用
    nginx作為負載均衡器,所有請求都到了nginx,可見nginx處于非常重點的位置,如果nginx伺服器當機後端web服務将無法提供服務,影響嚴重。
    為了屏蔽負載均衡伺服器的當機,需要建立一個備份機。主伺服器和備份機上都運作高可用(High Availability)監控程式,通過傳送諸如“I am alive”這樣的資訊來監控對方的運作狀況。當備份機不能在一定的時間内收到這樣的資訊時,它就接管主伺服器的服務IP并繼續提供負載均衡服務;當備份管理器又從主管理器收到“I am alive”這樣的資訊時,它就釋放服務IP位址,這樣的主伺服器就開始再次提供負載均衡服務。           
什麼是keepalived   
    keepalived是叢集管理中保證叢集高可用的一個服務軟體,用來防止單點故障。
    Keepalived的作用是檢測web伺服器的狀态,如果有一台web伺服器當機,或工作出現故障,Keepalived将檢測到,并将有故障的web伺服器從系統中剔除,當web伺服器工作正常後Keepalived自動将web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工幹涉,需要人工做的隻是修複故障的web伺服器。

keepalived工作原理
    keepalived是以VRRP協定為實作基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛拟路由備援協定。
    虛拟路由備援協定,可以認為是實作路由器高可用的協定,即将N台提供相同功能的路由器組成一個路由器組,這個組裡面有一個master和多個backup,master上面有一個對外提供服務的vip(VIP = Virtual IP Address,虛拟IP位址,該路由器所在區域網路内其他機器的預設路由為該vip),master會發多點傳播,當backup收不到VRRP包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。
    keepalived主要有三個子產品,分别是core、check和VRRP。core子產品為keepalived的核心,負責主程序的啟動、維護以及全局配置檔案的加載和解析。check負責健康檢查,包括常見的各種檢查方式。VRRP子產品是來實作VRRP協定的。 

keepalived+nginx實作主備過程  
    初始狀态:
                                        user
                                            |(0)
                                            |
                                        vip 192.168.101.100
                                        /
                                    /   
                                /(1)        
                            /           
                        /                   
                    /
        nginx                                                       nginx
            負載均衡伺服器(主)                                          負載均衡伺服器(備)
            192.168.101.3                <--心跳-->                       192.168.101.3  
            keepalived                                                  keepalived
                    \
                        \
                            \   (2)
                                \       
                                    \
                                        tomcat 叢集

            0 使用者通路虛拟ip
            1 導入nginx 主
            2 nginx 導入tomcat叢集

    主機當機:                                   

                                        user
                                            |(2)
                                            |
                                        vip 192.168.101.100
                                                \           
                                                    \
                        (1)                             \(3)
                                                            \
                                                                \
                                                                    \
        nginx                                                       nginx
            負載均衡伺服器(主)                                          負載均衡伺服器(備)
            192.168.101.3          (0)   <--心跳-->                       192.168.101.3  
            keepalived                                                  keepalived
                                                                            /
                                                                        /
                                                                    /   
                                                                /(4)
                                                            /
                                           tomcat 叢集

            0 心跳檢查 主挂了
            1 切換到備線路
            2 使用者通路虛拟ip
            3 導入nginx 備
            4 nginx 導入tomcat叢集

    主機恢複:
                                        user
                                            |(0)
                                            |
                                        vip 192.168.101.100
                                        /
                                    /   
                                /(1)        
                            /           
                        /                   
                    /
        nginx                                                       nginx
            負載均衡伺服器(主)                                          負載均衡伺服器(備)
            192.168.101.3                <--心跳-->                       192.168.101.3  
            keepalived                                                  keepalived
                    \
                        \
                            \   (2)
                                \       
                                    \
                                        tomcat 叢集

            0 心跳檢查 主活了
            1 切換到主線路
            2 使用者通路虛拟ip
            3 導入nginx 備
            4 nginx 導入tomcat叢集

高可用環境
    兩台nginx,一主一備:192.168.101.3和192.168.101.4
    兩台tomcat伺服器:192.168.101.5、192.168.101.6

安裝keepalived
    分别在主備nginx上安裝keepalived,參考keepalived.txt進行安裝:           

繼續閱讀