1. 程式人生 > 實用技巧 >leetcode 40組合總和 II

leetcode 40組合總和 II

Nginx

1.Nginx反向代理

  • 既然是反向代理,那麼什麼是正向代理,當一個使用者向訪問谷歌瀏覽器,我通過在瀏覽器中配置代理伺服器(比如www.zxdl.com)通過代理伺服器去訪問谷歌瀏覽器。

  • 而反向代理是,其實客戶端對代理無感知,客戶端不需要任何配置就可以訪問,我們只需要將請求傳送到反向代理伺服器,由反向代理伺服器去選擇目標伺服器獲取資料後再返回客戶端,此時反向代理伺服器和目標伺服器對外就是一個伺服器,暴漏的是代理伺服器地址。隱藏真實伺服器地址。

2.負載均衡

  • 我們增加伺服器的數量,然後將請求分發到各個伺服器上,將原先請求集中到單個伺服器上改成將請求分發多個伺服器上,將負載分發到不同的伺服器,也就是我們所說的負載均衡。

3.動靜分離

  • 動態資源和靜態資源分開部署,把動態頁面和靜態頁面由不同的伺服器來解析,加快解析速度,降低原來單個伺服器的壓力。

4.nginx安裝

  • 安裝nginx前需要安裝一些依賴

    1.pcre依賴安裝
    wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
    
    tar -xvf pcre-8.37.tar.gz 
    cd pcre-8.37/
    # 檢查,如果抱錯:configure: error: You need a C++ compiler for C++ support. 請執行:yum install -y gcc gcc-c++
    ./configure 
    # 安裝
    make && make install
    # 檢視安裝是否完成:pcre-config --version
    # yum 安裝 openssl zlib 
    # yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
    
  • 安裝nginx

    https://www.runoob.com/linux/nginx-install-setup.html
    

5.nginx常用命令

# 檢視版本好
/usr/sbin/nginx -v
# 啟動
/usr/sbin/nginx
# 停止
/usr/sbin/nginx -s stop
# 重新載入配置
/usr/sbin/nginx -s reload

6.nginx配置

  • 全域性塊:主要影響nginx伺服器整體執行配置指令
  • events塊:影響nginx與使用者網路連線
  • http塊:

6.1全域性塊

worker_processes 1; #它可以有效提高併發處理,根據CPU核心數,e.g:雙核4執行緒可以設定為4
worker_connections #單個工作程序可以允許同時建立連線的數量。預設:1024。它與記憶體和作業系統級別的‘程序最大可開啟檔案數’

6.2events塊

1.connections不是隨便設定的,而是與兩個指標有重要關聯,一是記憶體,二是作業系統級別的“程序最大可開啟檔案數”。
2.記憶體:每個連線數分別對應一個read_event、一個write_event事件,一個連線數大概佔用232位元組,2個事件總佔用96位元組,那麼一個連線總共佔用328位元組,通過數學公式可以算出100000個連線數大概會佔用 31M = 100000 * 328 / 1024 / 1024,當然這只是nginx啟動時,connections連線數所佔用的nginx。
3.程序最大可開啟檔案數:程序最大可開啟檔案數受限於作業系統,可通過 ulimit -n 命令查詢,以前是1024,現在是65535,
nginx提供了worker_rlimit_nofile指令,這是除了ulimit的一種設定可用的描述符的方式。 該指令與使用ulimit對使用者的設定是同樣的效果。此指令的值將覆蓋ulimit的值,如:worker_rlimit_nofile 20960;
設定ulimits:ulimit -SHn 65535

6.3http塊

  • http塊,server塊

7.Nginx配置例項-反向代理

server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  192.168.1.1;#訪問ip
        root         /usr/share/nginx/html;

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

        location / {
          proxy_pass http://127.0.0.1:8080
        }
  ...
}
# 當用戶瀏覽器訪問192.168.1.1 就會反向代理到 http://127.0.0.1:8080
  • 根據不同路徑訪問,當訪問 127.0.0.1:9001/edu/將轉發到http://127.0.0.1:8001,當訪問 127.0.0.1:9001/vod/將轉發到http://127.0.0.1:8002,
server {
        listen       9001;
        server_name  localhost;
  location ~/edu/ {
    proxy_pass http://127.0.0.1:8001;
  }
  location ~/vod/ {
    proxy_pass http://127.0.0.1:8002;
  }
}

  • 負載均衡。瀏覽器訪問http://192.168.1.1/edu/a.html 負載均衡效果,平均分配8080和8081
# 負載均衡配置

![image-20200827231727170](/Users/xujunkai/Library/Application Support/typora-user-images/image-20200827231727170.png)

  • 動靜分離
    • 靜態資源放在獨立伺服器上。通過nginx轉到靜態伺服器。通過expires可以設計瀏覽器快取時間。它會對比伺服器該檔案最後更新時間的變化,如果沒有變化,則不從伺服器抓取,返回狀態碼304,如果有修改,則直接從伺服器重新下載,返回狀態碼200。
location /www/ {
  root /data/; #訪問data目錄下靜態檔案
  autoindex on;# 它會列出當前檔案下所有靜態資源
}
# 當你輸入   http://192.168.1.1/xxxx/a.html
location /xxx/ {
  root /data/; #訪問data目錄下靜態檔案
}
# 直接返回a.html

7.Nginx配置高可用的叢集

  • 一臺主伺服器一臺從伺服器

  • 需要一個軟體keepalived

對外暴漏一個虛擬ip,當主伺服器掛了,會將虛擬IP轉從伺服器。
  • 準比工作
1.準備2臺伺服器
2.在兩臺伺服器安裝nginx
3.在兩臺伺服器安裝keepalived
	yum install keepalived
  • 編輯/etc/keepalived/keepalived.conf。之前有預設配置檔案
# 全域性定義
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL# 唯一值,伺服器名字可在vi /etc/hosts中配置,如 127.0.0.1 LVS_DEVEL
}
# 檢測指令碼 和權重引數,判斷nginx是否活著
vrrp_script chk_http_port {
  script "/usr/local/src/nginx_check.sh"
  interval 2 #檢測指令碼執行間隔
  weight 2 #設定當前伺服器權重
}

// 虛擬ip配置
vrrp instance VI_1 {
  state MASTER # 主伺服器為MASTER,備份伺服器BACKUP
  interface ens33 # 要在哪個網絡卡繫結你虛擬主機名字
  virtual_router_id 51# 主,備機的virtual_router_id必須相同
  priority 100 #主,備機取不同的優先順序,主機值較大,備份機較小
  advert_int 1# 每隔1秒,進行心跳
  # 許可權校驗
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.11.50 # 虛擬ip地址繫結,當然可以繫結多個
  }
}
  • nginx_check.sh 檢查nginx是否還活著
#! /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
  • 從伺服器更改 虛擬ip配置即可
state BACKUP # 主伺服器為MASTER,備份伺服器 BACKUP
priority 90 # priority小於主伺服器
  • 啟動nginx 主伺服器和備份伺服器
  • 啟動keepalived
systemctl start keepalived.service
  • 測試
1.在瀏覽器輸入虛擬ip也就是上面設定的192.168.11.50
2.通過ip a 檢視虛擬ip是否繫結

# 當把主伺服器停止 再從瀏覽器訪問虛擬ip,按理來說是可以訪問的
./nginx -s stop #停止主伺服器
# 瀏覽器也可以正常訪問。說明切換了備份伺服器。

8.nginx機制

![image-20200830110351231](/Users/xujunkai/Library/Application Support/typora-user-images/image-20200830110351231.png)

- 一個 master和多個woker工作的好處
- 可以使用nginx -s reload熱部署,利用nginx進行熱部署
- 每個work是獨立程序,如果其中一個woker出現問題,其他woker獨立的,繼續進行爭搶,實現請求過程,不會造成服務中斷
- nginx使用io多路複用,Windows無這種機制。
  • 關於連線數
根據cpu數量設定worker
傳送請求佔用多少個woker連線數???要麼2個,要麼4個
  連線 + 返回
work支援最大連線數: cpu核數 乘以最大連線數:比如4個worker 每個worker支援1024連線數 那麼就是4*1024
worker支援最大併發數???? 
	4*1024除以2 或 4, 但也不絕對,支援最大併發數,應該用如下公式

	- 普通靜態訪問最大併發數:worker_connections * worker_processes/2
	- 而如果是HTTP作為反向代理,最大併發數量是worker_connections * worker_processes/4