文章目錄
推薦閱讀
- 一文深入理解Zookeeper核心知識,2020年你值得擁有
- 深入理解Dubbo核心概念,這篇文章你絕對不能錯過
- 微服務入門,有這一篇就夠了
- 分佈式微服務架構(初級篇)
- 一文總結Spring 註解及作用詳解
- 更多請關注我的博客…
什麼是Nginx?
- Nginx 是一款輕量級的 Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,其特點是佔有內存少,併發能力強。事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
- Nginx 以事件驅動的方式編寫,所以有非常好的性能,同時也是一個非常高效的反向代理、負載平衡。
web 服務器
- Nginx 可以作爲靜態頁面的 web 服務器,同時還支持 CGI 協議的動態語言,比如 perl、php等。但是不支持 java。Java 程序只能通過與 tomcat 配合完成。Nginx 專爲性能優化而開發,性能是其最重要的考量,實現上非常注重效率 ,能經受高負載的考驗,有報告表明能支持高
達 50,000 個併發連接數。 - CGI 協議:CGI即通用網關接口(Common Gateway Interface),是外部應用程序(CGI程序)與Web服務器之間的接口標準,是在CGI程序和Web服務器之間傳遞信息的規程。
正向代理
- Nginx 不僅可以做反向代理,實現負載均衡。還能用作正向代理來進行訪問等功能。
- 正向代理:如果把局域網外的 Internet 想象成一個巨大的資源庫,則局域網中的客戶端要訪問 Internet,則需要通過代理服務器來訪問,這種代理服務就稱爲正向代理。
- 正向代理最大的特點:客戶端非常明確要訪問的服務器地址;服務器只清楚請求來自哪個代理服務器,而不清楚來自哪個具體的客戶端;正向代理模式屏蔽或者隱藏了真實客戶端信息。
反向代理
- 反向代理,其實客戶端對代理是無感知的,因爲客戶端不需要任何配置就可以訪問,我們只需要將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數據後,在返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器 IP 地址。
- 多個客戶端給服務器發送的請求,nginx服務器接收到之後,按照一定的規則分發給了後端的業務處理服務器進行處理了。此時,請求的來源也就是客戶端是明確的,但是請求具體由哪臺服務器處理的並不明確了,nginx扮演的就是一個反向代理角色
- 反向代理,主要用於服務器集羣分佈式部署的情況下,反向代理隱藏了服務器的信息!
負載均衡
- 明確了所謂代理服務器的概念,那麼接下來,nginx扮演了反向代理服務器的角色,它是以依據什麼樣的規則進行請求分發的呢?分發的規則是否可以控制呢?
- 隨着信息數量的不斷增長,訪問量和數據量的飛速增長,以及系統業務的複雜度增加,傳統的
用戶訪問<-->Tomcat服務器
架構會造成服務器相應客戶端的請求日益緩慢,併發量特別大的時候,還容易造成服務器直接崩潰。很明顯這是由於服務器性能的瓶頸造成的問題,那麼如何解決這種情況呢? - 這時候集羣的概念產生了,單個服務器解決不了,我們增加服務器的數量,然後將請求分發到各個服務器上,將原先請求集中到單個服務器上的情況改爲將請求分發到多個服務器上,將負載分發到不同的服務器,也就是我們所說的負載均衡。
- 這裏提到的客戶端發送的、nginx反向代理服務器接收到的請求數量,就是我們說的負載量;請求數量按照一定的規則進行分發到不同的服務器處理的規則,就是一種均衡規則;所以將服務器接收到的請求按照規則分發的過程,稱爲負載均衡。
負載均衡調度算法
- weight輪詢(默認):接收到的請求按照順序逐一分配到不同的後端服務器,即使在使用過程中,某一臺後端服務器宕機,nginx會自動將該服務器剔除出隊列,請求受理情況不會受到任何影響。 這種方式下,可以給不同的後端服務器設置一個權重值(weight),用於調整不同的服務器上請求的分配率;權重數據越大,被分配到請求的機率越大;該權重值,主要是針對實際工作環境中不同的後端服務器硬件配置進行調整的。
- ip_hash:每個請求按照發起客戶端的ip的hash結果進行匹配,這樣的算法下一個固定ip地址的客戶端總會訪問到同一個後端服務器,這也在一定程度上解決了集羣部署環境下session共享的問題。
- fair:智能調整調度算法,動態的根據後端服務器的請求處理到響應的時間進行均衡分配,響應時間短處理效率高的服務器分配到請求的概率高,響應時間長處理效率低的服務器分配到的請求少;結合了前兩者的優點的一種調度算法。但是需要注意的是nginx默認不支持fair算法,如果要使用這種調度算法,請安裝upstream_fair模塊
- url_hash:按照訪問的url的hash結果分配請求,每個請求的url會指向後端固定的某個服務器,可以在nginx作爲靜態服務器的情況下提高緩存效率。同樣要注意nginx默認不支持這種調度算法,要使用的話需要安裝nginx的hash軟件包
動靜分離
- 爲了加快網站的解析速度,可以把動態頁面和靜態頁面由不同的服務器來解析,加快解析速
度。降低原來單個服務器的壓力。
Nginx常用命令
start nginx
啓動nginxnginx -s stop
快速關閉Nginx,可能不保存相關信息,並迅速終止web服務。nginx -s quit
平穩關閉Nginx,保存相關信息,有安排的結束web服務。nginx -s reload
因改變了Nginx相關配置,需要重新加載配置而重載。nginx -s reopen
重新打開日誌文件。nginx -c filename
爲 Nginx 指定一個配置文件,來代替缺省的。nginx -t
不運行,而僅僅測試配置文件。nginx 將檢查配置文件的語法的正確性,並嘗試打開配置文件中所引用到的文 件。nginx -v
顯示 nginx 的版本。nginx -V
顯示 nginx 的版本,編譯器版本和配置參數
nginx 原理與優化參數配置
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安裝(Linux)
- 官網地址:https://nginx.org/en/download.html
- 安裝Nginx源
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7- 0.el7.ngx.noarch.rpm
- 安裝該rpm後,我們就能在/etc/yum.repos.d/ 目錄中看到一個名爲nginx.repo 的文件。
- 安裝完Nginx源後,就可以正式安裝Nginx了。
yum install -y nginx
配置文件描述
- nginx.conf配置文件描述:
基本配置
- 全局塊配置:配置影響nginx全局的指令。一般有運行nginx服務器的用戶組,nginx進程pid存放路徑,日誌存放路
徑,配置文件引入,允許生成worker process數等。
#user nobody; #配置用戶或者組,默認爲nobody
worker_processes 1; #允許生成的進程數,默認爲1
#error_log logs/error.log; #制定日誌路徑,級別。這個設置可以放入全局塊,
#http塊,server塊,級別以此爲:debug|info|notice|warn|error|crit|alert|emerg
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; #指定nginx進程運行文件存放地址
events塊配置
- events塊:配置影響nginx服務器或與用戶的網絡連接。有每個進程的最大連接數,選取哪種事件驅動模型處理連接
請求,是否允許同時接受多個網路連接,開啓多個網絡連接序列化等。
accept_mutex on; #設置網路連接序列化,防止驚羣現象發生,默認爲on
multi_accept on; #設置一個進程是否同時接受多個網絡連接,默認爲off
#use epoll; #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大連接數,默認爲1024(早期是512)
max_client
- nginx作爲http服務器的時候:
max_clients = worker_processes * worker_connections
由HTTP客戶端發起一個請求,創建一個到服務器指定端口(默認是80端口)的TCP連接。HTTP服務器則在那個端口監聽客戶端的請求。一旦收到請求,
服務器會向客戶端返回一個狀態,比如"HTTP/1.1 200 OK",以及返回的內容,如請求的文 件、錯誤消息、或者其它信息。同一時刻nginx在處理客
戶端發送的http請求應該只是一個connection,由此可知理論上作 爲http web服務器角色的nginx能夠處理的最大連接數就是最大客戶端連接數。
- nginx作爲反向代理服務器的時候:
max_clients = worker_processes * worker_connections/4
如果作爲反向代理,因爲瀏覽器默認會開啓2個連接到server,而且Nginx還會使用fds(file descriptor)從同一個連接池建立連接到upstream後
端。則最大連接數的計算公式需要除4
http塊配置
- 可以嵌套多個server,配置代理,緩存,日誌定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日誌自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數等。
#配置nginx支持哪些文件擴展名與文件類型映射表。在conf/mime.types查看支持哪些類型
include mime.types;
#默認文件類型(流)類型,支持很多文件、圖片、js/css等
default_type application/octet-stream;
#自定義格式
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';
access_log log/access.log myFormat; #combined爲日誌格式的默認值
#優化參數 允許sendfile方式傳輸文件,開啓高校效傳輸模式
sendfile on; #tcp_nopush on; #防止網絡阻塞
#keepalive_timeout 0;
keepalive_timeout 65; #長連接超時時間(單位秒)
#gzip on; #開啓gzip壓縮
server塊配置
- 配置虛擬主機的相關參數,一個http中可以有多個server。
#配置虛擬主機
server {
listen 80; #配置監聽端口
server_name localhost; #配置服務器名
#charset koi8-r; #編碼格式
#access_log logs/host.access.log main; //主機的訪問日誌(如沒有,全局爲準)
#默認的匹配/請求,當訪問路徑中有/,會被該location匹配處理
location / {
root html; #root是配置服務器的默認網站根目錄位置,在nginx目錄下html
index index.html index.htm;
}
#error_page 404 /404.html; #配置404頁面
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; #配置50x頁面
location = /50x.html { #精確匹配
root html;
}
#禁止(外網)訪問 .htaccess文件
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
server2塊配置
- 和上方很類似,主要是配置另一個虛擬機信息
# 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;
# }
# }
server3塊配置
- 配置https服務
- HTTP:是互聯網上應用最爲廣泛的一種網絡協議,是一個客戶端和服務器端請求和應答的標準(TCP),用於從WWW服務器傳 輸超文本到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網絡傳輸減少。
- HTTPS:是以安全爲目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的 詳細內容就需要SSL。(加密)
# 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;
# }
# }
應用場景
需求1: 靜態資源
靜態配置文件處理
- 由於Nginx性能很高,對於常用的靜態資源,可直接交由Nginx進行訪問處理
- 示例:
location / {
root D:/nginx-tomcat/exam; # /opt/static/exam
index index.html index.htm;
}
需求2:反向代理
讓nginx進行轉發,即所 謂的反向代理 訪問localhost時轉到tomcat
- 修改nginx.conf文件,查看server 節點,相當於一個代理服務器,可以配置多個。
listen:表示當前的代理服務器監聽的端口,默認的是監聽80端口。
server_name:表示服務名稱。
location:表示匹配的路徑,這時配置了/表示所有請求都被匹配到這裏
root:裏面配置了root這時表示當匹配這個請求的路徑時,將會在這個文件夾內尋找相應的文件。
index:當沒有指定主頁時,默認會選擇這個指定的文件,它可以有多個,並按順序來加載,如果第一個不存在,則找第二 個,依此類推
下面的error_page是代表錯誤的頁面,
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
localhost時轉到tomcat時。修改兩個地方:
server_name exam_qf;
location / {
proxy_pass http://127.0.0.1:8080;
}
- proxy_pass,它表示代理路徑,相當於轉發,而不像之前說的root必須指定一個文件夾。
你知道的越多,你不知道的越多。
有道無術,術尚可求,有術無道,止於術。
如有其它問題,歡迎大家留言,我們一起討論,一起學習,一起進步