Nginx+keepalived从入门到集群搭建(手把手教学,建议收藏)
目錄
一、什么是Nginx
二、Nginx的相關概念
1.正向代理
2.反向代理
3.負載均衡
4.動靜分離
三、Nginx安裝
1.安裝
2.其他配置
3.windows中nginx安裝
四、Nginx常用命令
1.查看 nginx 版本號
2.啟動
3.關閉
4. 重新加載命令
五、Nginx的配置文件
1.配置文件位置
2.分析nginx.conf配置文件
六、Nginx配置-反向代理1
1.實現效果:
2.tomcat啟動
?3.nginx配置
4.啟動nginx,訪問
七、Nginx配置-反向代理2
1.實現效果
2.啟動兩個tomcat
3.nginx配置
4.啟動nginx(也可以nginx -s reload),訪問測試
5.location指令說明
八、Nginx配置-負載均衡
1.實現效果
2.準備兩個tomcat
?3.nginx配置
4.啟動nginx,訪問測試
5.nginx負載均衡的策略
九、Nginx配置-動靜分離
1.在nginx目錄下準備靜態資源
2.啟動tomcat
3.配置nginx
4.啟動nginx,查看結果
十、Nginx高可用集群搭建
1.架構圖
2.安裝nginx
3.安裝keepalived
4.配置keepalived.conf
5.寫檢測腳本
6.從服務器也執行3-5步驟
7.把兩臺服務器上 nginx 和 keepalived 啟動
8.測試
十一、Nginx執行原理
1.master、worker
2.worker 如何進行工作的
3.一個master和多個worker有好處
4、設置多少個 woker 合適
5、連接數 worker_connection
一、什么是Nginx
?? ?Nginx ("engine x") 是一個高性能的 HTTP 和反向代理服務器,特點是占有內存少,并發能力強,事實上 nginx 的并發能力確實在同類型的網頁服務器中表現較好,中國大陸使用 nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
?? ?Nginx 可以作為靜態頁面的 web 服務器,同時還支持 CGI 協議的動態語言,比如 perl、 php等。但是不支持 java。 Java 程序只能通過與 tomcat 配合完成。 Nginx 專為性能優化而開發,性能是其最重要的考量,實現上非常注重效率 ,能經受高負載的考驗,有報告表明能支持高達 50,000 個并發連接數。
nginx詳細介紹推薦網址:https://lnmp.org/nginx.html
二、Nginx的相關概念
1.正向代理
?? ?Nginx 不僅可以做反向代理,實現負載均衡。還能用作正向代理來進行上網等功能。
?? ?正向代理:如果把局域網外的 Internet 想象成一個巨大的資源庫,則局域網中的客戶端要訪問 Internet,則需要通過代理服務器來訪問,這種代理服務就稱為正向代理。
? ? 在客戶端(瀏覽器)配置代理服務器,通過代理服務器進行互聯網訪問:
?
2.反向代理
?? ?反向代理,其實客戶端對代理是無感知的,因為客戶端不需要任何配置就可以訪問,我們只需要將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數據后,在返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器 IP 地址。
? ? 暴露的是代理服務器地址,隱藏了真實服務器IP地址:
?
3.負載均衡
?? ?客戶端發送多個請求到服務器,服務器處理請求,有一些可能要與數據庫進行交互,服務器處理完畢后,再將結果返回給客戶端。
?? ?這種架構模式對于早期的系統相對單一,并發請求相對較少的情況下是比較適合的,成本也低。但是隨著信息數量的不斷增長,訪問量和數據量的飛速增長,以及系統業務的復雜度增加,這種架構會造成服務器相應客戶端的請求日益緩慢,并發量特別大的時候,還容易造成服務器直接崩潰。很明顯這是由于服務器性能的瓶頸造成的問題,那么如何解決這種情況呢?
?? ?我們首先想到的可能是升級服務器的配置,比如提高 CPU 執行頻率,加大內存等提高機器的物理性能來解決此問題,但是我們知道摩爾定律的日益失效,硬件的性能提升已經不能滿足日益提升的需求了。最明顯的一個例子,天貓雙十一當天,某個熱銷商品的瞬時訪問量是極其龐大的,那么類似上面的系統架構,將機器都增加到現有的頂級物理配置,都是不能夠滿足需求的。那么怎么辦呢?
?? ?上面的分析我們去掉了增加服務器物理配置來解決問題的辦法,也就是說縱向解決問題的辦法行不通了,那么橫向增加服務器的數量呢?這時候集群的概念產生了,單個服務器解決不了,我們增加服務器的數量,然后將請求分發到各個服務器上,將原先請求集中到單個服務器上的情況改為將請求分發到多個服務器上,將負載分發到不同的服務器,也就是我們所說的負載均衡。
?
4.動靜分離
?? ?為了加快網站的解析速度,可以把動態頁面和靜態頁面由不同的服務器來解析,加快解析速度。降低原來單個服務器的壓力。
?
三、Nginx安裝
1.安裝
(1)安裝編譯工具及庫文件
yum -y install make zlib zlib-devel gcc-c++ libtool??openssl openssl-devel
(2)安裝PCRE
下載 PCRE 安裝包,下載地址: http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
解壓安裝包:tar zxvf pcre-8.35.tar.gz
進入安裝包目錄:cd pcre-8.35
編譯安裝:./configure?后,make && make install
查看pcre版本:pcre-config --version
(3)安裝nginx
下載 Nginx,下載地址:https://nginx.org/en/download.html
解壓:tar zxvf nginx-1.6.2.tar.gz
進入安裝包目錄:cd nginx-1.6.2
編譯安裝:./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
安裝:make && make install
查看版本:/usr/local/webserver/nginx/sbin/nginx -v
2.其他配置
在 windows 系統中訪問 linux 中 nginx,默認不能訪問的,因為防火墻問題,解決方法:
(1)關閉防火墻
(2)開放訪問的端口號, 80 端口
查看開放的端口號
firewall-cmd --list-all
設置開放的端口號
firewall-cmd --add-service=http –permanent
sudo firewall-cmd --add-port=80/tcp --permanent
重啟防火墻
firewall-cmd –reload
3.windows中nginx安裝
(1).下載nginx
http://nginx.org/en/download.html?????????下載穩定版本,以nginx/Windows-1.12.2為例,直接下載 nginx-1.12.2.zip
下載后解壓,解壓后如下
(2).啟動nginx
有很多種方法啟動nginx
(1)直接雙擊nginx.exe,雙擊后一個黑色的彈窗一閃而過
(2)打開cmd命令窗口,切換到nginx解壓目錄下,輸入命令 nginx.exe 或者 start nginx ,回車即可
(3).檢查nginx是否啟動成功
直接在瀏覽器地址欄輸入網址 http://localhost:80,回車,出現以下頁面說明啟動成功
?
?
四、Nginx常用命令
1.查看 nginx 版本號
在/usr/local/nginx/sbin 目錄下執行? ./nginx -v
2.啟動
在/usr/local/nginx/sbin 目錄下執行 ./nginx
3.關閉
在/usr/local/nginx/sbin 目錄下執行 ./nginx -s stop
4. 重新加載命令
在/usr/local/nginx/sbin 目錄下執行 ./nginx -s reload
五、Nginx的配置文件
1.配置文件位置
?? ?nginx 安裝目錄下,其默認的配置文件都放在這個目錄的 conf 目錄下,而主配置文件nginx.conf 也在其中,后續對 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;}#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;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443 ssl;# server_name localhost;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;# ssl_prefer_server_ciphers on;# location / {# root html;# index index.html index.htm;# }#} }2.分析nginx.conf配置文件
(1)全局塊
?? ?從配置文件開始到 events 塊之間的內容,主要會設置一些影響 nginx 服務器整體運行的配置指令,主要包括配置運行 Nginx 服務器的用戶(組)、允許生成的 worker process 數, 進程 PID 存放路徑、日志存放路徑和類型以及配置文件的引入等。
?? ?比如上面第一行配置的, 這是 Nginx 服務器并發處理服務的關鍵配置, worker_processes 值越大,可以支持的并發處理量也越多,但是會受到硬件、軟件等設備的制約:
worker_processes 1;(2)events塊
比如上面的配置:
events {worker_connections 1024; }?? ?events 塊涉及的指令主要影響 Nginx 服務器與用戶的網絡連接,常用的設置包括是否開啟對多 work process下的網絡連接進行序列化,是否允許同時接收多個網絡連接,選取哪種事件驅動模型來處理連接請求,每個 word process 可以同時支持的最大連接數等。
?? ?上述例子就表示每個 work process 支持的最大連接數為 1024。
?? ?這部分的配置對 Nginx 的性能影響較大,在實際中應該靈活配置。
(3)http塊
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80;server_name localhost;location / {root html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}} }?? ?這算是 Nginx 服務器配置中最頻繁的部分,代理、緩存和日志定義等絕大多數功能和第三方模塊的配置都在這里。
?? ?需要注意的是: http 塊也可以包括 http 全局塊、 server 塊。
①、http全局塊
?? ? http 全局塊配置的指令包括文件引入、 MIME-TYPE 定義、日志自定義、連接超時時間、單鏈接請求數上限等。
②、server塊
?? ?這塊和虛擬主機有密切關系,虛擬主機從用戶角度看,和一臺獨立的硬件主機是完全一樣的,該技術的產生是為了節省互聯網服務器硬件成本。
?? ?每個 http 塊可以包括多個 server 塊,而每個 server 塊就相當于一個虛擬主機。
?? ?而每個 server 塊也分為全局 server 塊,以及可以同時包含多個 locaton 塊。
1)、全局 server 塊
?? ?最常見的配置是本虛擬機主機的監聽配置和本虛擬主機的名稱或 IP 配置。
2)、 location 塊
?? ?一個 server 塊可以配置多個 location 塊。
?? ?這塊的主要作用是基于 Nginx 服務器接收到的請求字符串(例如 server_name/uri-string),對虛擬主機名稱(也可以是 IP 別名)之外的字符串(例如 前面的 /uri-string)進行匹配,對特定的請求進行處理。地址定向、數據緩存和應答控制等功能,還有許多第三方模塊的配置也在這里進行。
六、Nginx配置-反向代理1
1.實現效果:
使用 nginx 反向代理,訪問 localhost 直接跳轉到 localhost:8080
2.tomcat啟動
?3.nginx配置
server {listen 80;server_name localhost;location / {#負載均衡反向代理proxy_pass http://localhost:8081;}}4.啟動nginx,訪問
七、Nginx配置-反向代理2
1.實現效果
實現效果:使用 nginx 反向代理, 根據訪問的路徑跳轉到不同端口的服務中
nginx 監聽端口為 80,
訪問 http://localhost/edu/ 直接跳轉到 localhost:8080
訪問 http://localhost/vod/ 直接跳轉到 localhost:8081
2.啟動兩個tomcat
3.nginx配置
server {listen 80;server_name localhost;location ~ /edu/ {proxy_pass http://localhost:8080;}location ~ /vod/ {proxy_pass http://localhost:8081;}}4.啟動nginx(也可以nginx -s reload),訪問測試
?
?
5.location指令說明
該指令用于匹配 URL。
語法如下:
location [ = | ~ | ~* | ^~ ] uri {}(1)、 = :用于不含正則表達式的 uri 前,要求請求字符串與 uri 嚴格匹配,如果匹配
成功,就停止繼續向下搜索并立即處理該請求。
(2)、 ~:用于表示 uri 包含正則表達式,并且區分大小寫。
(3)、 ~*:用于表示 uri 包含正則表達式,并且不區分大小寫。
(4)、 ^~:用于不含正則表達式的 uri 前,要求 Nginx 服務器找到標識 uri 和請求字符串匹配度最高的 location 后,立即使用此 location 處理請求,而不再使用 location塊中的正則 uri 和請求字符串做匹配。
注意:如果 uri 包含正則表達式,則必須要有 ~ 或者 ~* 標識。
八、Nginx配置-負載均衡
1.實現效果
訪問localhost,多次訪問分別訪問兩個tomcat,實現負載均衡。
2.準備兩個tomcat
?
?3.nginx配置
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;#訪問主機列表upstream myserver {server localhost:8080 weight=1;server localhost:8081 weight=1;}server {listen 80;server_name localhost;location / {#負載均衡proxy_pass http://myserver;}} }4.啟動nginx,訪問測試
發現輪訓的訪問兩個tomcat,實現了負載均衡
5.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; }九、Nginx配置-動靜分離
?? ?Nginx 動靜分離簡單來說就是把動態跟靜態請求分開,不能理解成只是單純的把動態頁面和靜態頁面物理分離。嚴格意義上說應該是動態請求跟靜態請求分開,可以理解成使用 Nginx處理靜態頁面, Tomcat 處理動態頁面。
?? ?動靜分離從目前實現角度來講大致分為兩種,一種是純粹把靜態文件獨立成單獨的域名,放在獨立的服務器上,也是目前主流推崇的方案;
?? ?另外一種方法就是動態跟靜態文件混合在一起發布,通過 nginx 來分開。通過 location 指定不同的后綴名實現不同的請求轉發。通過 expires 參數設置,可以使瀏覽器緩存過期時間,減少與服務器之前的請求和流量。具體 Expires 定義:是給一個資源設定一個過期時間,也就是說無需去服務端驗證,直接通過瀏覽器自身確認是否過期即可,所以不會產生額外的流量。此種方法非常適合不經常變動的資源。(如果經常更新的文件,不建議使用 Expires 來緩存),我這里設置 3d,表示在這 3 天之內訪問這個 URL,發送一個請求,比對服務器該文件最后更新時間沒有變化,則不會從服務器抓取,返回狀態碼304,如果有修改,則直接從服務器重新下載,返回狀態碼 200。
1.在nginx目錄下準備靜態資源
?
2.啟動tomcat
3.配置nginx
?
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80;server_name localhost;#靜態資源html頁面location /html/ {root decs/;index index,html index.htm;}#靜態資源圖片location /images/ {root decs/;#可以列表查看autoindex on;}#動態資源tomcatlocation ~ /edu/ {proxy_pass http://localhost:8080;}} }?
4.啟動nginx,查看結果
?
十、Nginx高可用集群搭建
1.架構圖
?
2.安裝nginx
兩臺機器129和131分別裝上nginx
3.安裝keepalived
可以下載壓縮包手動安裝(離線安裝,自行百度),也可以直接使用yum安裝。
yum install keepalived –y
使用yum安裝之后,在 etc 里面生成目錄 keepalived,有文件 keepalived.conf
4.配置keepalived.conf
global_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.17.129smtp_connect_timeout 30router_id LVS_DEVEL # 訪問到主機,本機的hostname,需要修改 }vrrp_script chk_http_port {script "/usr/local/src/nginx_check.sh" # 檢測腳本位置interval 2 #(檢測腳本執行的間隔)weight 2 # 權重 }vrrp_instance VI_1 {state MASTER # 備份服務器上將 MASTER 改為 BACKUP,需要修改interface ens33 //網卡名字,使用ifconfig查看,需要修改virtual_router_id 51 # 主、備機的 virtual_router_id 必須相同priority 100 # 主、備機取不同的優先級,主機值較大,備份機值較小,一般主100從90advert_int 1 # 每隔1秒發送心跳authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.17.50 #// VRRP H 虛擬地址,也可以綁定多個虛擬ip} }5.寫檢測腳本
/usr/local/src/nginx_check.sh
功能:檢測nginx是否啟動,如果停了就重啟,如果還是起不來,就停止keepalived。
#!/bin/bash A=`ps -C nginx – no-header |wc -l` if [ $A -eq 0 ];then/usr/local/nginx/sbin/nginx #nginx啟動路徑sleep 2if [ `ps -C nginx --no-header |wc -l` -eq 0 ];thenkillall keepalivedfi fi6.從服務器也執行3-5步驟
7.把兩臺服務器上 nginx 和 keepalived 啟動
啟動 nginx: ./nginx
啟動 keepalived: systemctl start keepalived.service
8.測試
(1)訪問虛擬IP:192.168.17.50
(2)把主nginx和keepalived停掉,然后再訪問
?
十一、Nginx執行原理
1.master、worker
?
nginx中有兩個線程,一個master,一個worker。
2.worker 如何進行工作的
?
3.一個master和多個worker有好處
(1)可以使用nginx -s?reload熱部署,利用nginx進行熱部署操作。
(2)每個 woker 是獨立的進程, 獨立的進程,不需要加鎖,所以省掉了鎖帶來的開銷;如果有其中的一個 woker 出現問題,其他 woker 獨立的,繼續進行爭搶,實現請求過程,不會造成服務中斷。
4、設置多少個 woker 合適
worker 數和服務器的 cpu 數相等是最為適宜的
5、連接數 worker_connection
第一個:發送請求,占用了 woker 的幾個連接數?
答案: 2 或者 4 個
第二個: nginx 有一個 master,有四個 woker,每個 woker 支持最大的連接數 1024,支持的最大并發數是多少?
? 普通的靜態訪問最大并發數是: worker_connections * worker_processes /2,
? 而如果是 HTTP 作 為反向代理來說,最大并發數量應該是 worker_connections *worker_processes/4
總結
以上是生活随笔為你收集整理的Nginx+keepalived从入门到集群搭建(手把手教学,建议收藏)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ansible使用教程(4W字长文,保姆
- 下一篇: 超详细!带输入输出的十五至尊图你见过吗?