本篇參考於尚硅谷
https://www.bilibili.com/vide...
本次安裝全程使用docker
Nginx ("engine x") 是一個高性能的 HTTP 和反向代理服務器,特色是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好。php
Nginx 能夠做爲靜態頁面的 web 服務器,同時還支持 CGI 協議的動態語言,好比 perl、php等。可是不支持java。Java程序只能經過與tomcat配合完成。Nginx專爲性能優化而開發,性能是其最重要的考量,實現上很是注重效率 ,能經受高負載的考驗,有報告代表能支持高達 50,000個併發鏈接數。html
參考 https://lnmp.org/nginx.html
若是把局域網外的 Internet 想象成一個巨大的資源庫,則局域網中的客戶端要訪問Internet,則須要經過代理服務器來訪問,這種代理服務就稱爲正向代理。
java
其實客戶端對代理是無感知的,由於客戶端不須要任何配置就能夠訪問,咱們只須要將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數據後,在返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器IP地址。node
當客戶端請求數據發送到服務器,服務器處理完請求後將結果返回給客戶端。這種單一模式在早期是適用的,當訪問和數據量增長以及業務複雜度增長時候就再也不適用了,能夠經過提高服務器配置來解決,可是服務器提高是有限制,頂級物理配置不能解決問題,這樣就只能在縱向解決問題。增長服務器數量,把請求分發到各個服務器將負載發到不一樣的服務器,這就是負載均衡。
nginx
爲了加快網站的解析速度,能夠把動態頁面和靜態頁面由不一樣的服務器來解析,加快解析速度。下降原來單個服務器的壓力。web
docker安裝nginx參照:
在容器中redis
幫助命令docker
nginx -h
查看版本信息編程
nginx -v
關閉命令
nginx -s stop
從新加載命令 (可作開啓命令)
nginx -s reload
設置開機自動啓動
chkconfig nginx on
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 { } }
建立一個tomcat容器開放 9001端口
在 nginx.conf文件 中添加serer塊 就能夠訪問tomcat了
server { listen 80; server_name ip地址; location / { proxy_pass http://ip地址:9001; } }
使用nginx 反向代理,根據訪問的路徑跳轉到不一樣端口的服務中
訪問 ip地址:8080/edu 跳轉到ip地址:9001:edu
訪問 ip地址:8080/vod 跳轉到ip地址:9002:vod
在兩個tomcat容器中的webapps文件夾中分別添加edu文件夾和vod文件夾
修改配置文件 server模塊
server { listen 80; server_name IP地址; location ~ /edu/ { proxy_pass http://IP地址:9001; } location ~ /vod/ { proxy_pass http://IP地址:9002; } }
location指令說明:
一、= :用於不含正則表達式的 uri 前,要求請求字符串與 uri 嚴格匹配,若是匹配成功,就中止繼續向下搜索並當即處理該請求。
二、~:用於表示 uri 包含正則表達式,而且區分大小寫。
三、~*:用於表示 uri 包含正則表達式,而且不區分大小寫。
四、^~:用於不含正則表達式的 uri 前,要求 Nginx 服務器找到標識 uri 和請求字符串匹配度最高的 location 後,當即使用此 location 處理請求,而再也不使用 location 塊中的正則 uri 和請求字符串作匹配。
能夠參考 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; }
第一種 輪詢(默認)
每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down 掉,能自動剔除。
第二種weight
weight 表明權重默認爲1,權重越高被分配的客戶端越多
第三種ip_hash
每一個請求按訪問ip 的hash 結果分配,這樣每一個訪客固定訪問一個後端服務器
第四種fair(第三方)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
首先,對於每一個 worker 進程來講,獨立的進程,不須要加鎖,因此省掉了鎖帶來的開銷,同時在編程以及問題查找時,也會方便不少。其次,採用獨立的進程,可讓互相之間不會影響,一個進程退出後,其它進程還在工做,服務不會中斷,master 進程則很快啓動新的worker 進程。固然,worker 進程的異常退出,確定是程序有 bug 了,異常退出,會致使當前worker 上的全部請求失敗,不過不會影響到全部請求,因此下降了風險。
Nginx 同redis 相似都採用了 io 多路複用機制,每一個worker 都是一個獨立的進程,但每一個進程裏只有一個主線程,經過異步非阻塞的方式來處理請求, 即便是千上萬個請求也不在話下。每一個 worker 的線程能夠把一個 cpu 的性能發揮到極致。因此 worker 數和服務器的 cpu數相等是最爲適宜的。設少了會浪費cpu,設多了會形成 cpu 頻繁切換上下文帶來的損耗。
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 進程所能創建鏈接的最大值,因此,一個 nginx 能創建的最大鏈接數,應該是 worker_connections * worker_processes。固然,這裏說的是最大鏈接數,對於HTTP 請 求 本 地 資 源來 說 , 能 夠 支 持 的 最大 並 發 數 量 是 worker_connections * worker_processes,若是是支持 http1.1 的瀏覽器每次訪問要佔兩個鏈接,因此普通的靜態訪問最大併發數是: worker_connections * worker_processes /2,而若是是HTTP 做 爲反向代理來講,最大併發數量應該是 worker_connections * worker_processes/4。由於做爲反向代理服務器,每一個併發會創建與客戶端的鏈接和與後端服務的鏈接,會佔用兩個鏈接。
此處可參考
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
查看啓動
查看keepalived狀態
修改裏面的資源文件後訪問
宿主機 外部測試
斷開master容器後