Nginx
之前做項目都是用Nginx做反向代理來發布項目,由於時間問題一直沒有好好總結一下,
今天就來總結一下Nginx的各種用處!
1、什麼是nginx?nginx可以做些什麼?
Nginx 是高性能的 HTTP 和反向代理的服務器,處理高併發能力是十分強大的,能經受高負載的考驗,有報告表明能支持高達 50,000 個併發連接數,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
Nginx提供了正向代理,反向代理,動靜分離,負載均衡以及Nginx搭建高可用集羣。
2、正向代理
Nginx 不僅可以做反向代理,實現負載均衡。還能用作正向代理來進行上網等功能。
正向代理:如果把局域網外的 Internet 想象成一個巨大的資源庫,則局域網中的客戶端要訪問 Internet,則需要通過代理服務器來訪問,這種代理服務就稱爲正向代理。如下圖(用visio隨便畫了一下)
需要在客戶端配置代理服務器進行指定網站訪問
3、反向代理
反向代理,其實客戶端對代理是無感知的,因爲客戶端不需要任何配置就可以訪問,我們只需要將請求發送到反向代理服務器由反向代理服務器去選擇目標服務器獲取數據後,在返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器 IP 地址。
4、負載均衡
客戶端發送多個請求到服務器,服務器處理請求,有一些可能要與數據庫進行交互,服務器處理完畢後,再將結果返回給客戶端。這種架構模式對於早期的系統相對單一,併發請求相對較少的情況下是比較適合的,成本也低。但是隨着信息數量的不斷增長,訪問量和數據量的飛速增長,以及系統業務的複雜度增加,這種架構會造成服務器相應客戶端的請求日益緩慢,併發量特別大的時候,還容易造成服務器直接崩潰。很明顯這是由於服務器性能的瓶頸造成的問題,那麼如何解決這種情況呢?
增加服務器的數量,然後將請求分發到各個服務器上,將原先請求集中到單個服務器上的情況改爲將請求分發到多個服務器上,將負載分發到不同的服務器,也就是我們所說的負載均衡。
5、動靜分離
爲了加快網站的解析速度,可以把動態頁面和靜態頁面由不同的服務器來解析,加快解析速度。降低原來單個服務器的壓力。
Liunx下安裝Nginx
windows下安裝就不用說了,下載解壓後就可以直接運行用。
nginx官網,點擊進去下載:http://nginx.org/
開始進行 nginx 安裝
(1 )安裝 pcre 依賴
第一步 聯網下載 pcre 壓縮文件依賴
wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
第二步 解壓壓縮文件
使用命令 tar –xvf pcre-8.37.tar.gz
第三步./configure 完成後,回到 pcre 目錄下執行 make ,最後執行 make install
(2 )安裝 openssl 、zlib 、 gcc 依賴,聯網執行以下命令
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
(3)安裝 nginx
1、 解壓縮 nginx-xx.tar.gz 包。
2、 進入解壓縮目錄,執行./configure。
3、 make && make install
進入目錄 /usr/local/nginx/sbin/nginx 啓動服務
這樣就成功安裝好啦。
在 windows 系統中訪問 linux 中 nginx ,默認不能訪問的,因爲防火牆問題
(1 )關閉防火牆
(2 )開放訪問的端口號,80 端口
查看開放的端口號
firewall-cmd --list-all
設置開放的端口號
firewall-cmd --add-service=http –permanent
firewall-cmd --add-port=80/tcp --permanent
重啓防火牆
firewall-cmd –reload
再用windows瀏覽器訪問liunx的ip地址
Nginx 的常用的命令
1、啓動nginx命令
在/usr/local/nginx/sbin 目錄下執行 ./nginx
2、關閉命令
在/usr/local/nginx/sbin 目錄下執行 ./nginx -s stop
3、重新加載命令
在/usr/local/nginx/sbin 目錄下執行 ./nginx -s reload
Nginx的nginx.conf 配置文件
1、nginx 安裝目錄下,其默認的配置文件都放在這個目錄的 conf 目錄下,而主配置文件nginx.conf 也在其中,後續對 nginx 的使用基本上都是對此配置文件進行相應的修改
2 、配置文件中的內容
包含三部分內容
(1 )全局塊:配置服務器整體運行的配置指令比如 worker_processes 1; 處理併發數的配置
從配置文件開始到 events 塊之間的內容,主要會設置一些影響 nginx 服務器整體運行的配置指令,主要包括配置運行 Nginx 服務器的用戶(組)、允許生成的 worker process 數,進程 PID 存放路徑、日誌存放路徑和類型以及配置文件的引入等。這是 Nginx 服務器併發處理服務的關鍵配置,worker_processes 值越大,可以支持的併發處理量也越多,但是會受到硬件、軟件等設備的制約。
(2 )events 塊 :影響 Nginx 服務器與用戶的網絡連接比如 worker_connections 1024; 支持的最大連接數爲 1024。events 塊涉及的指令主要影響 Nginx 服務器與用戶的網絡連接,常用的設置包括是否開啓對多 work process下的網絡連接進行序列化,是否允許同時接收多個網絡連接,選取哪種事件驅動模型來處理連接請求,每個 wordprocess 可以同時支持的最大連接數等。下述例子就表示每個 work process 支持的最大連接數爲 1024。這部分的配置對 Nginx 的性能影響較大,在實際中應該靈活配置
(3 )http 塊:
這算是 Nginx 服務器配置中最頻繁的部分,代理、緩存和日誌定義等絕大多數功能和第三方模塊的配置都在這裏。需要注意的是:http 塊也可以包括 http 全局塊、server 塊。
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
實現效果:使用 nginx 反向代理,訪問 www .aaa.com 直接跳轉到 127.0.0.1:8080
1、 啓動一個 tomcat,瀏覽器地址欄輸入 127.0.0.1:8080,會出現如下
2、通過修改本地 host 文件,將 www .aaa.com 映射到 127.0.0.1
host文件的路徑在:C:\Windows\System32\drivers\etc
打開hosts文件 在尾部添加 127.0.0.1:8080 www.aaa.com
配置完成之後,我們便可以通過 www.123.com:8080 訪問到第一步出現的 Tomcat 初始界面
爲什麼會這樣呢?大家都知道在瀏覽器輸入一個網址中間過程是什麼樣的吧,不知道的可以去百度一下,這裏不講解
在瀏覽器輸入一個網址首先會在你的本地hosts文件李查找有沒有這個網址,有的話就會直接返回這個網址通過對應的ip去訪問。
我們知道用戶是不用輸入端口號的,那麼如何只需要輸入 www.aaa.com 便可以跳轉到 Tomcat 初始界面呢?便用到 nginx的反向代理
在 nginx.conf 做如下配置
如上配置,我們監聽 80 端口,訪問域名爲 www.aaa.com,不加端口號時默認爲 80 端口,故訪問該域名時會跳轉到 127.0.0.1:8080 路徑上。在瀏覽器端輸入 www.aaa.com 就會跳轉到tomcat的首頁了,是不是很簡單吶。
實例2
使用 nginx 反向代理,根據訪問的路徑跳轉到不同端口的服務中 nginx 監聽端口爲 8088,
訪問 http://127.0.0.1: 8088/aaa/ 直接跳轉到 127.0.0.1:8081
訪問 http://127.0.0.1: 8088/bbb/ 直接跳轉到 127.0.0.1:8082
1、配置兩個 tomcat,一個 8001 端口,一個 8002 端口,並準備好測試的頁面。
2、修改 nginx 的配置文件 在 http 塊中添加 server{ }
location 指令說明
該指令用於匹配 URL。
語法如下:
location [ = | ~ | ~* | ^~] url {
}
1、= :用於不含正則表達式的 uri 前,要求請求字符串與 uri 嚴格匹配,如果匹配成功,就停止繼續向下搜索並立即處理該請求。
2、~:用於表示 uri 包含正則表達式,並且區分大小寫。
3、~*:用於表示 uri 包含正則表達式,並且不區分大小寫。
4、^~:用於不含正則表達式的 uri 前,要求 Nginx 服務器找到標識 uri 和請求字
符串匹配度最高的 location 後,立即使用此 location 處理請求,而不再使用 location塊中的正則 uri 和請求字符串做匹配。
注意:如果 uri 包含正則表達式,則必須要有 ~ 或者 ~* 標識。
nginx 配置實例-負載均衡
首先準備兩個同時啓動的 Tomcat,
在 nginx 的配置文件中進行負載均衡的配置
nginx 分配服務器策略
第一種 輪詢(默認)
每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器 down 。 掉,能自動剔除。
第二種 weight
weight 代表權重默認爲 1, 權重越高被分配的客戶端越多
第三種 ip_hash
每個請求按訪問 ip 的 的 hash 結果分配,這樣每個訪客固定訪問一個後端服務器
第四種 fair (第三方)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。如下:
nginx 配置實例-動靜分離
Nginx 動靜分離簡單來說就是把動態跟靜態請求分開,不能理解成只是單純的把動態頁面和靜態頁面物理分離。嚴格意義上說應該是動態請求跟靜態請求分開,可以理解成使用 Nginx處理靜態頁面,Tomcat 處理動態頁面。動靜分離從目前實現角度來講大致分爲兩種,一種是純粹把靜態文件獨立成單獨的域名,放在獨立的服務器上,也是目前主流推崇的方案;另外一種方法就是動態跟靜態文件混合在一起發佈,通過 nginx 來分開。
.進行 nginx 配置
通過 location 指定不同的後綴名實現不同的請求轉發。通過 expires 參數設置,可以使瀏覽器緩存過期時間,減少與服務器之前的請求和流量。具體 Expires 定義:是給一個資源設定一個過期時間,也就是說無需去 服務端驗證,直接通過瀏覽器自身確認是否過期即可,所以不會產生額外的流量。此種方法非常適合不經常變動的資源。(如果經常更新的文件,不建議使用 Expires 來緩存),我這裏設置 3d ,表示在這 3 天之內訪問這個 URL ,發送一個請求,比對服務器該文件最後更新時間沒有變化,則不會從服務器抓取,返回狀態碼 304 ,如果有修改,則直接從服務器重新下載,返回狀態碼 200
重點是添加 location,
最後檢查 Nginx 配置是否正確即可,然後測試動靜分離是否成功,之需要刪除後端 tomcat服務器上的某個靜態文件,查看是否能訪問,如果可以訪問說明靜態資源 nginx 直接返回了,不走後端 tomcat 服務器。
nginx 搭建高可用集羣(主從模式)
1、需要什麼
(1 )需要兩臺 nginx 服務器
(2 )需要 keepalived
(3)需要虛擬 ip
2 、配置高可用的準備工作
(1 )需要兩臺服務器 192.168.17.156 和 192.168.17.157
(2 )在兩臺服務器安裝 nginx
(3 )在兩臺服務器安裝 keepalived
3 、在兩臺服務器安裝 keepalived
(1 ) 使用 yum 命令進行安裝
yum install keepalived –y
(2 )安裝之後,在 etc 裏面生成目錄 keepalived ,有文件 keepalived.conf
4 、完成高可用配置(主從配置)
(1 )修改/etc/keepalived/keepalivec.conf 配置文件
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.17.156
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(檢測腳本執行的間隔)
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 備份服務器上將 MASTER 改爲 BACKUP
interface ens33 //網卡
virtual_router_id 51 # 主、備機的 virtual_router_id 必須相同
priority 90 # 主、備機取不同的優先級,主機值較大,備份機值較小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虛擬地址
}
}
(2 )在/usr/local/src 添加檢測腳本
#!/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
(3 )把兩臺服務器上 nginx 和 和 keepalived 啓動
啓動 nginx :./nginx
啓動 keepalived :systemctl start keepalived.service
5 、最終測試
(1 )在瀏覽器地址欄輸入 虛擬 ip 地址 192.168.17.50
(2 )把主服務器(192.168.17.129 )nginx 和 和 keepalived 停止,再輸入 192.168.17.50
一樣可以訪問到nginx的主頁面。
Nginx原理
1 、mater 和 和 worker
2 、worker 如何進行工作的
3 、一個 master 和多個 woker 有好處
(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
到此爲止所有總結就結束了。有哪裏不足的希望有大佬指點出來。
學如逆水行舟,不進則退。
一起學習吧!!!!!!!!!!!!