少年:Nginx 瞭解下

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

Nginx簡介

傳統的 Web 服務器,每一個客戶端鏈接做爲一個單獨的進程或線程處理,需在切換任務時將 CPU 切換到新的任務並建立一個新的運行時上下文,消耗額外的內存和 CPU 時間,當併發請求增長時,服務器響應變慢,從而對性能產生負面影響。 在這裏插入圖片描述css

所以致使咱們迫切須要幾個高性能的Web服務器。目前常見的應用服務器:Apache/Microsoft IIS/Tomcat/Lighttpd/Nginx這幾種,目前主流就是Apache跟Nginx兩個Web服務器了。html

Apache

Apache仍然是時長佔用量最高的web服務器,據最新數據統計,市場佔有率目前是50%左右。主要優點在於一個是比較早出現的一個Http靜態資源服務器,同時又是開源的。因此在技術上的支持以及市面上的各類解決方案都比較成熟。Apache支持的模塊很是豐富。node

Nginx

Nginx是俄羅斯人編寫的一款高性能的HTTP和反向代理服務器,Nginx 是開源、高性能、高可靠的 Web 和反向代理服務器,並且支持熱部署,幾乎能夠作到 7 * 24 小時不間斷運行,即便運行幾個月也不須要從新啓動,還能在不間斷服務的狀況下對軟件版本進行熱更新。性能是 Nginx 最重要的考量,其佔用內存少、併發能力強、能支持高達 5w 個併發鏈接數,最重要的是,Nginx 是免費的並能夠商業化,配置使用也比較簡單。nginx

選擇Nginx的理由也很簡單:第一,它能夠支持5W高併發鏈接,第二,內存消耗少,第三,成本低,若是採用F五、NetScaler等硬件負載均衡設備的話,須要大幾十萬。而Nginx是開源的,能夠無償使用而且能用於商業用途。web

Nginx 使用場景:

  1. 反向代理
  2. 緩存跟負載均衡
  3. 靜態資源服務,經過本地文件系統提供服務;
  4. Keepalived + Nginx 實現高可用

正向代理和反向代理

正向代理

意思是一個位於客戶端和原始服務器(origin server)之間的服務器, 爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),而後代理向原始服務器轉交請求並將得到的內容返回給客戶端。比較通俗的例子以下。 在這裏插入圖片描述正則表達式

反向代理

反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並將從服務器上獲得的結果返回給internet上請求鏈接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器。對於用戶來講只知道這個網址的存在是不知道若干server的! 在這裏插入圖片描述數據庫

負載均衡

通常狀況下,客戶端發送多個請求到服務器,服務器處理請求,其中一部分可能要操做一些資源好比數據庫、靜態資源等,服務器處理完畢後,再將結果返回給客戶端。這種模式對於早期的系統來講,功能要求不復雜,且併發請求相對較少的狀況下還能勝任,成本也低。隨着信息數量不斷增加,訪問量和數據量飛速增加,以及系統業務複雜度持續增長,這種作法已沒法知足要求,併發量特別大時,服務器容易崩,好比咱們部署的Tomcat服務是有服務瓶頸的。apache

很明顯這是因爲服務器性能的瓶頸形成的問題,除了堆機器以外,最重要的作法就是負載均衡(Load Balance)。請求爆發式增加的狀況下,單個機器性能再強勁也沒法知足要求了,這個時候集羣的概念產生了,單個服務器解決不了的問題,可使用多個服務器,而後將請求分發到各個服務器上,將負載分發到不一樣的服務器,這就是負載均衡,核心是「分攤壓力」。Nginx 實現負載均衡,通常來講指的是將請求轉發給服務器集羣。 在這裏插入圖片描述ubuntu

動靜分離

爲了加快網站的解析速度,能夠把動態頁面和靜態頁面由不一樣的服務器來解析,加快解析速度,下降原來單個服務器的壓力。segmentfault

通常來講,都須要將動態資源和靜態資源分開,因爲 Nginx 的高併發和靜態資源緩存等特性,常常將靜態資源部署在 Nginx 上。若是請求的是靜態資源,直接到靜態資源目錄獲取資源,若是是動態資源的請求,則利用反向代理的原理,把請求轉發給對應後臺應用去處理,從而實現動靜分離。 使用先後端分離後,能夠很大程度提高靜態資源的訪問速度,即便動態服務不可用,靜態資源的訪問也不會受到影響。 在這裏插入圖片描述

Nginx安裝

通常狀況下有兩種安裝方式

1. 自動化安裝
# 切換至root用戶
sudo su root apt-get install nginx 複製代碼

在這裏插入圖片描述 查看nginx是否安裝成功 在這裏插入圖片描述 啓動nginx 在這裏插入圖片描述 啓動後,在網頁重輸入ip地址(重要:可能須要關閉防火牆或者開發指定端口才能夠正常訪問哦),便可看到nginx的歡迎頁面。至此nginx安裝成功 在這裏插入圖片描述 nginx文件安裝完成以後的文件位置

  • /usr/sbin/nginx:主程序
  • /etc/nginx:存放配置文件
  • /usr/share/nginx:存放靜態文件
  • /var/log/nginx:存放日誌

卸載nginx

# 完全卸載nginx
apt-get --purge autoremove nginx #查看nginx的版本號 nginx -v 複製代碼
在這裏插入圖片描述
在這裏插入圖片描述
2. 源碼安裝

安裝依賴包

apt-get install gcc
apt-get install libpcre3 libpcre3-dev apt-get install zlib1g zlib1g-dev # Ubuntu14.04的倉庫中沒有發現openssl-dev,由下面openssl和libssl-dev替代 #apt-get install openssl openssl-dev sudo apt-get install openssl sudo apt-get install libssl-dev 複製代碼

安裝nginx

cd /usr/local
mkdir nginx cd nginx wget http://nginx.org/download/nginx-1.13.7.tar.gz tar -xvf nginx-1.13.7.tar.gz 複製代碼

在這裏插入圖片描述 編譯nginx

# 進入nginx目錄
cd /usr/local/nginx/nginx-1.13.7 # 執行命令 ./configure # 執行make命令 make # 執行make install命令 make install 複製代碼

此時在/usr/local/nginx目錄下主要文件以下:

  • Conf 配置文件
  • Html 靜態網頁文件
  • Logs 日誌文件
  • Sbin 二進制程序

啓動nginx

#進入nginx啓動目錄
cd /usr/local/nginx/sbin # 啓動nginx ./nginx 複製代碼
3. 防火牆

安裝以後開啓 Nginx,若是系統開啓了防火牆,那麼須要設置一下在防火牆中加入須要開放的端口,下面列舉幾個經常使用的防火牆操做(沒開啓的話不用管這個):

systemctl start firewalld  # 開啓防火牆
systemctl stop firewalld # 關閉防火牆 systemctl status firewalld # 查看防火牆開啓狀態,顯示running則是正在運行 firewall-cmd --reload # 重啓防火牆,永久打開端口須要reload一下 # 添加開啓端口,--permanent表示永久打開,不加是臨時打開重啓以後失效 firewall-cmd --permanent --zone=public --add-port=8888/tcp # 查看防火牆,添加的端口也能夠看到 firewall-cmd --list-all 複製代碼

而後設置 Nginx 的開機啓動:

systemctl enable nginx
複製代碼

啓動 Nginx (其餘命令後面有詳細講解):

systemctl start nginx
複製代碼

而後訪問你的 IP,這時候就能夠看到 Nginx 的歡迎頁面了~ Welcome to nginx!

Nginx 經常使用命令

Nginx 的命令在控制檯中輸入 nginx -h 就能夠看到完整的命令,這裏列舉幾個經常使用的命令:

nginx -s reload # 向主進程發送信號,從新加載配置文件,熱重啓 nginx -s reopen # 重啓 Nginx nginx -s stop # 快速關閉 nginx -s quit # 等待工做進程處理完成後關閉 nginx -T # 查看當前 Nginx 最終的配置 nginx -t -c <配置路徑> # 檢查配置是否有問題,若是已經在配置目錄,則不須要-c

systemctl 是 Linux 系統應用管理工具 systemd 的主命令,用於管理系統,咱們也能夠用它來對 Nginx 進行管理,相關命令以下:

systemctl start nginx # 啓動 Nginx systemctl stop nginx # 中止 Nginx systemctl restart nginx # 重啓 Nginx systemctl reload nginx # 從新加載 Nginx,用於修改配置後 systemctl enable nginx # 設置開機啓動 Nginx systemctl disable nginx # 關閉開機啓動 Nginx systemctl status nginx # 查看 Nginx 運行狀態

Nginx 配置語法

nginx.conf結構圖能夠這樣歸納: 在這裏插入圖片描述

main        # 全局配置,對全局生效
├── events # 配置影響 Nginx 服務器或與用戶的網絡鏈接 ├── http # 配置代理,緩存,日誌定義等絕大多數功能和第三方模塊的配置 │ ├── upstream # 配置後端服務器具體地址,負載均衡配置不可或缺的部分 │ ├── server # 配置虛擬主機的相關參數,一個 http 塊中能夠有多個 server 塊 │ ├── server │ │ ├── location # server 塊能夠包含多個 location 塊,location 指令用於匹配 uri │ │ ├── location │ │ └── ... │ └── ... └── ... 複製代碼

一個 Nginx 配置文件的結構就像上圖 nginx.conf 顯示的那樣,配置文件的語法規則:

  1. 配置文件由指令與指令塊構成;
  2. 每條指令以 ; 分號結尾,指令與參數間以空格符號分隔;
  3. 指令塊以 {} 大括號將多條指令組織在一塊兒;
  4. include 語句容許組合多個配置文件以提高可維護性;
  5. 使用 # 符號添加註釋,提升可讀性;
  6. 使用 $ 符號使用變量;
  7. 部分指令的參數支持正則表達式;

典型配置

Nginx 的典型配置:

user  nginx;                        # 運行用戶,默認便是nginx,能夠不進行設置
worker_processes 1; # Nginx 進程數,通常設置爲和 CPU 核數同樣 error_log /var/log/nginx/error.log warn; # Nginx 的錯誤日誌存放目錄 pid /var/run/nginx.pid; # Nginx 服務啓動時的 pid 存放位置  events {  use epoll; # 使用epoll的I/O模型(若是你不知道Nginx該使用哪一種輪詢方法,會自動選擇一個最適合你操做系統的)  worker_connections 1024; # 每一個進程容許最大併發數 }  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; # Nginx訪問日誌存放位置   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; # 默認文件類型   include /etc/nginx/conf.d/*.conf; # 加載子配置項   server {  listen 80; # 配置監聽的端口  server_name localhost; # 配置的域名   location / {  root /usr/share/nginx/html; # 網站根目錄  index index.html index.htm; # 默認首頁文件  deny 172.168.22.11; # 禁止訪問的ip地址,能夠爲all  allow 172.168.33.44; # 容許訪問的ip地址,能夠爲all  }   error_page 500 502 503 504 /50x.html; # 默認50x對應的訪問頁面  error_page 400 404 error.html; # 同上  } } 複製代碼

server 塊能夠包含多個 location 塊,location 指令用於匹配 uri,語法:

location [ = | ~ | ~* | ^~] uri {
 ... } 複製代碼

指令後面:

= 精確匹配路徑,用於不含正則表達式的 uri 前,若是匹配成功,再也不進行後續的查找; ^~ 用於不含正則表達式的 uri; 前,表示若是該符號後面的字符是最佳匹配,採用該規則,再也不進行後續的查找; ~ 表示用該符號後面的正則去匹配路徑,區分大小寫; ~* 表示用該符號後面的正則去匹配路徑,不區分大小寫。跟 ~ 優先級都比較低,若有多個location的正則能匹配的話,則使用正則表達式最長的那個;

若是 uri 包含正則表達式,則必需要有 ~ 或 ~* 標誌

Location匹配規則:
在這裏插入圖片描述
在這裏插入圖片描述
Rewrite

rewrite是實現URL重定向的重要指令,他根據regex(正則表達式)來匹配內容跳轉到replacement,結尾是flag標記 在這裏插入圖片描述 在這裏插入圖片描述

Nginx 核心流程

在這裏插入圖片描述 url = 域名+端口+path+param 匹配過程:

一、域名(ip)+端口 ----》定位虛擬機 二、path與location部分匹配, path = 匹配path + 剩餘path 三、root:在目錄裏找path1+path2路徑 alias:在目錄裏找path2路徑 若url以/結尾,認爲是目錄,執行index;不然認爲path路徑到達文件 四、 proxy_pass=http://172.17.0.4:8081/ proxy_pass= ip:port/ ip:port/時,轉發ip+端口+path2路徑 ip:port 時,轉發ip+端口+path1+path2路徑

nginx執行過程驗證

server { listen 80; server_name process.sowhat.com; #後臺服務原始路徑:172.17.0.4:8081/nginx/sowhat/getInfo #無/,訪問路徑:http://process.sowhat.com/nginx/sowhat/getInfo location /nginx/sowhat { #匹配路徑/nginx/sowhat,剩餘路徑/getInfo proxy_pass http://172.17.0.4:8081;#此處未關閉,傳遞整個路徑/nginx/sowhat/getInfo到目標ip:port // proxy_pass http://172.17.0.4:8081/nginx/sowhat; } #有/,訪問路徑:http://process.sowhat.com/dynamic/nginx/sowhat/getInfo location /dynamic {#匹配路徑/dynamic,剩餘路徑/nginx/sowhat/getInfo proxy_pass http://172.17.0.4:8081/;#此處關閉,只傳遞/nginx/sowhat/getInfo到目標ip:port } #訪問路徑:http://process.sowhat.com/static/a.html ---b.html/c.html location /static { # 匹配路徑/static,剩餘路徑/a.html # root html/;# root聲明,在html文件夾,查找/static/a.html文件 } #訪問路徑:http://process.sowhat.com/target/a.html ---b.html/c.html location /target {#匹配路徑/target,剩餘路徑/a.html alias html/static/;# alias聲明,在html/static/文件夾,查找a.html文件 } }

點綴

一、index執行時機

Root/alias時,若頁面請求以/結尾,則認爲path只到目錄 此時啓動index,找目錄內的index文件

二、if語句,內置變量:簡單的if判斷,沒有else 三、跨域:A域名頁面,訪問B域名,在B服務里加配置:W3C要求,不可跨域,又提出瞭如何跨域。

CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。 它容許瀏覽器向跨源服務器,發出XMLHttpRequest請求,從而克服AJAX只能同源使用的限制。 簡單請求: 瀏覽器在跨源AJAX請求的頭信息之中,自動在添加一個Origin字段(本次請求來自哪一個源 )。 服務器根據這個值,在許可範圍內,則在頭信息包含 Access-Control-Allow-Origin 。 複雜請求: 會在正式通訊以前,增長一次HTTP查詢請求,稱爲"預檢"請求OPTIONS

四、防盜鏈:本身域名,被其它域名頁面訪問。防君子:一些文件只可在固定域名訪問,不可保存本地跟新網頁打開這樣的操做。 五、緩存:緩存瀏覽器。nginx告訴瀏覽能夠緩存:減小nginx壓力 六、壓縮: gzip :服務器跟瀏覽器協商採用何種壓縮

對輸出到客戶端的內容進行壓縮,以減少傳輸文件體積,減小對網絡帶寬的佔用。服務器端要壓縮,客戶端必須解壓縮,這都將佔用cpu時間。不過,因爲傳輸內容減少了,傳輸過程當中,各網卡、路由器、交換機對數據包的處理時間也會縮短。gzip壓縮是就在這裏贏得了時間。 必須知足如下幾個條件: 一、客戶端發送的HTTP報頭必須含有 Accept-Encoding 字段,且其值包含 gzip 這個壓縮類型。通常瀏覽器都會發 Accept-Encoding:gzip, deflate, sdch 這樣的報頭。 二、服務器啓用了gzip壓縮,那麼響應頭會包含 Content-Encoding:gzip, 客戶端根據這個來判斷服務器返回的內容是否真正爲gzip壓縮過的內容。 gzip壓縮對文本文件壓縮效果很是好(40%~80%),而對圖片文件效果甚微。 實際應用中能夠考慮對js、html、css格式的文件開啓gzip壓縮。

七、https配置。 nginx 祕鑰生成過程

一、建立服務器私鑰,命令會讓你輸入一個口令: openssl genrsa -des3 -out server.key 1024 二、建立簽名請求的證書(CSR): openssl req -new -key server.key -out server.csr 三、在加載SSL支持的Nginx並使用上述私鑰時除去必須的口令: openssl rsa -in server.key -out server_nopass.key 四、最後標記證書使用上述私鑰和CSR: openssl x509 -req -days 365 -in server.csr -signkey server_nopass.key -out server.crt

nginx.Conf文件中:

ssl_certificate /etc/nginx/conf.d/server.crt; ssl_certificate_key /etc/nginx/conf.d/server_nopass.key; 在這裏插入圖片描述

八、keepalived來配置nginx主備 Keepalived功能:

管理LVS負載均衡軟件 實現LVS集羣節點的健康檢查 做爲系統網絡服務的高可用性(failover)

在這裏插入圖片描述 工做中nginx經常使用模式: 在這裏插入圖片描述

Nginx工做模式

Nginx因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。 nginx橫空出世以前,Apache服務器一直佔據web服務器的壟斷地位,因此就用對比的方式來解釋nginx那麼強! IO多路複用 二者性能差異的主要緣由在於網絡IO模型選擇不一樣,apache使用了select,而nginx使用了epoll模型!

舉個例子:一個萬人村裏面選村長,有兩種方式:

①,讓每一個人在紙條上寫下本身的名字,而後前村長去收集紙條(一個線程去遍歷),而後獲得村長推薦候選人的名單(須要處理的鏈接),這就至關於select模型,去輪詢每個鏈接,並對須要進行處理的鏈接進行處理! ②,每一個人均可以毛遂自薦(每一個鏈接都有可能活躍),想要競選的在旁邊站成一排(事件觸發,放入隊列中),而後就在這幾我的中選擇(幾個待處理的任務),至關於只要對少許的事件進行處理!

一個是從上萬人中循環獲得幾個進行處理,一個是幾個本身站出來直接處理,這種效率相差不是通常的大吧? nginx是基於epoll模型開發的,而epoll是基於JAVA NIO的同步非阻塞開發,在高併發狀況下能支持更多的鏈接! nginx是事件驅動的,一個主進程跟多個工做進程組成的工做模式,主線程負責循環分配事件,多個工做線程負責事件的處理! 在這裏插入圖片描述

參考

一文nginx ubuntu下安裝nginx nginx下Location跟Rewrite總結 全部本文資料彙總

本文使用 mdnice 排版

相關文章
相關標籤/搜索