初識nginx

本篇參考於尚硅谷
https://www.bilibili.com/vide...
本次安裝全程使用docker

一: Nginx簡介

1.1 nginx概述

Nginx ("engine x") 是一個高性能的 HTTP 和反向代理服務器,特色是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好。php

1.2 nginx做爲web服務器

Nginx 能夠做爲靜態頁面的 web 服務器,同時還支持 CGI 協議的動態語言,好比 perl、php等。可是不支持java。Java程序只能經過與tomcat配合完成。Nginx專爲性能優化而開發,性能是其最重要的考量,實現上很是注重效率 ,能經受高負載的考驗,有報告代表能支持高達 50,000個併發鏈接數。html

參考 https://lnmp.org/nginx.html

1.3 正向代理

若是把局域網外的 Internet 想象成一個巨大的資源庫,則局域網中的客戶端要訪問Internet,則須要經過代理服務器來訪問,這種代理服務就稱爲正向代理。
zzz.pngjava

1.4 反向代理

其實客戶端對代理是無感知的,由於客戶端不須要任何配置就能夠訪問,咱們只須要將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數據後,在返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器IP地址。node

ffff.jpg

1.5 負載均衡

當客戶端請求數據發送到服務器,服務器處理完請求後將結果返回給客戶端。這種單一模式在早期是適用的,當訪問和數據量增長以及業務複雜度增長時候就再也不適用了,能夠經過提高服務器配置來解決,可是服務器提高是有限制,頂級物理配置不能解決問題,這樣就只能在縱向解決問題。增長服務器數量,把請求分發到各個服務器將負載發到不一樣的服務器,這就是負載均衡。
FZ.jpgnginx

1.6 動靜分離

爲了加快網站的解析速度,能夠把動態頁面和靜態頁面由不一樣的服務器來解析,加快解析速度。下降原來單個服務器的壓力。web

image.png

二: Nginx安裝

docker安裝nginx參照:

docker 入門到實戰(七)docker經常使用安裝正則表達式

三: Nginx經常使用命令和配置文件

3.1 nginx 經常使用的命令

在容器中redis

幫助命令docker

nginx -h

image.png

查看版本信息編程

nginx -v

關閉命令

nginx -s  stop

從新加載命令 (可作開啓命令)

nginx -s  reload

設置開機自動啓動

chkconfig nginx on

3.2 nginx.conf 配置文件

image.png

etc/nginx/conf.d/default.conf   #默認資源配置文件
etc/nginx/nginx.conf        #默認配置
/usr/share/nginx/html   #初始頁面  資源位置
/var/log/nginx    #日誌文件地址
#全局塊
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

# events塊  影響nginx服務器與用戶的網絡鏈接
events {
    worker_connections  1024; #支持鏈接的最大數
}


#http全局塊
http {
    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  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    # server 塊
    #每一個 http 塊能夠包括多個 server 塊,而每一個 server 塊就至關於一個虛擬主機。
    #而每一個 server 塊也分爲全局 server 塊,以及能夠同時包含多個 locaton 塊。
    
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

四: Nginx配置實例-反向代理

4.1 配置實例1

建立一個tomcat容器開放 9001端口

在 nginx.conf文件 中添加serer塊 就能夠訪問tomcat了

server {
        listen       80;
        server_name  ip地址;

    location / {
        proxy_pass http://ip地址:9001; 
        }
    }

image.png

4.2 配置實例2

使用nginx 反向代理,根據訪問的路徑跳轉到不一樣端口的服務中

訪問 ip地址:8080/edu 跳轉到ip地址:9001:edu
訪問 ip地址:8080/vod 跳轉到ip地址:9002:vod

在兩個tomcat容器中的webapps文件夾中分別添加edu文件夾和vod文件夾
image.png

修改配置文件 server模塊

server {
        listen       80;
        server_name  IP地址;

        location ~ /edu/ {
        proxy_pass http://IP地址:9001; 
        }

        location ~ /vod/ {
        proxy_pass http://IP地址:9002; 
        }
    }

image.png

location指令說明:
一、= :用於不含正則表達式的 uri 前,要求請求字符串與 uri 嚴格匹配,若是匹配成功,就中止繼續向下搜索並當即處理該請求。
二、~:用於表示 uri 包含正則表達式,而且區分大小寫。
三、~*:用於表示 uri 包含正則表達式,而且不區分大小寫。
四、^~:用於不含正則表達式的 uri 前,要求 Nginx 服務器找到標識 uri 和請求字符串匹配度最高的 location 後,當即使用此 location 處理請求,而再也不使用 location 塊中的正則 uri 和請求字符串作匹配。

五: nginx 配置實例-負載均衡

5.1 修改nginx.conf文件的server塊

能夠參考 nginxa安裝
server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  39.108.79.168;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        proxy_pass http://pic; 
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

    upstream pic{
                server 39.108.79.168:9001 weight=5;
                server 39.108.79.168:9002 weight=5;
    }

5.2 nginx 分配服務器策略

第一種 輪詢(默認)
每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down 掉,能自動剔除。

第二種weight
weight 表明權重默認爲1,權重越高被分配的客戶端越多

第三種ip_hash
每一個請求按訪問ip 的hash 結果分配,這樣每一個訪客固定訪問一個後端服務器

第四種fair(第三方)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。

六: nginx 原理與優化參數配置

image.png
image.png

master-workers的機制的好處

首先,對於每一個 worker 進程來講,獨立的進程,不須要加鎖,因此省掉了鎖帶來的開銷,同時在編程以及問題查找時,也會方便不少。其次,採用獨立的進程,可讓互相之間不會影響,一個進程退出後,其它進程還在工做,服務不會中斷,master 進程則很快啓動新的worker 進程。固然,worker 進程的異常退出,確定是程序有 bug 了,異常退出,會致使當前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 搭建集羣 主從模式

此處可參考
https://m.jb51.net/article/17...
https://www.cnblogs.com/jinji...

配置好的鏡像已經發到阿里雲

docker pull registry.cn-shanghai.aliyuncs.com/rem/nginx_keeplived:latest

建立兩個容器

docker run -tid --privileged --name nginx_master --restart=always -p 6001:80  rem/nginx_keeplived /usr/sbin/init
docker run -tid --privileged --name nginx_slave --restart=always -p 6002:80  rem/nginx_keeplived /usr/sbin/init

要是容器裏面nginx沒有啓動 能夠命令啓動 也能夠重載啓動

systemctl start nginx.service
nginx  -s reload

設置開機啓動

chkconfig nginx on

查看啓動
image.png

查看keepalived狀態
image.png

修改裏面的資源文件後訪問

image.png

image.png

image.png

image.png

宿主機 外部測試
image.png

斷開master容器後
image.png

相關文章
相關標籤/搜索