什么是nginx?
nginx 是高性能的 HTTP 和反向代理的服務(wù)器,處理高并發(fā)能力是十分強大的,能經(jīng)受高負 載的考驗,有報告表明能支持高達 50,000 個并發(fā)連接數(shù)。
我們使用nginx的主要目的:
- 反向代理
其實客戶端對代理是無感知的,因為客戶端不需要任何配置就可以訪問,我們只需要將請求發(fā)送到反向代理服務(wù)器,由反向代理服務(wù)器去選擇目標服務(wù)器獲取數(shù)據(jù)后,在返回給客戶端,此時反向代理服務(wù)器和目標服務(wù)器對外就是一個服務(wù)器,暴露的是代理服務(wù)器地址,隱藏了真實服務(wù)器 IP 地址。 - 負載均衡
我們增加服務(wù)器的數(shù)量,然后將請求分發(fā)到各個服務(wù)器上,將原先請求集中到單個服務(wù)器上的情況改為將請求分發(fā)到多個服務(wù)器上,將負載分發(fā)到不同的服務(wù)器,也就是我們 所說的負載均衡 -
動靜分離
- 其他功能
白名單,訪問頻率
安裝nginx
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar -xvf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure
make && make install # 編譯并安裝
安裝完成會后,nginx被安裝到/usr/local/nginx目錄,在nginx有sbin啟動腳本。啟動nginx,我們可以在local:80看到Welcome to nginx!
常用命令
./nginx -s stop # 關(guān)閉nginx
./nginx # 啟動nginx
./nginx -s reload # 重加載(修改配置的情況下可以不stop)
配置文件
當(dāng)我們啟動nginx的時候,nginx會默認加載/usr/local/nginx/conf/nginx.conf的配置文件。我們也可以指定加載自定義的配置文件。
# nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
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;
}
}
可見配置文件是包含三部分:
第一部分:全局塊
從配置文件開始到 events 塊之間的內(nèi)容,主要會設(shè)置一些影響 nginx 服務(wù)器整體運行的配置指令,主要包括配 置運行 Nginx 服務(wù)器的用戶(組)、允許生成的 worker process 數(shù),進程 PID 存放路徑、日志存放路徑和類型以 及配置文件的引入等。
第二部分:events 塊
events 塊涉及的指令主要影響 Nginx 服務(wù)器與用戶的網(wǎng)絡(luò)連接,常用的設(shè)置包括是否開啟對多 work process 下的網(wǎng)絡(luò)連接進行序列化,是否允許同時接收多個網(wǎng)絡(luò)連接,選取哪種事件驅(qū)動模型來處理連接請求,每個 word process 可以同時支持的最大連接數(shù)等。
上述例子就表示每個 work process 支持的最大連接數(shù)為 1024.
第三部分:http 塊
這算是 Nginx 服務(wù)器配置中最頻繁的部分,代理、緩存和日志定義等絕大多數(shù)功能和第三方模塊的配置都在這里。 需要注意的是:http 塊也可以包括 http 全局塊、server 塊。
- http 全局塊
http 全局塊配置的指令包括文件引入、MIME-TYPE 定義、日志自定義、連接超時時間、單鏈接請求數(shù)上限等。 - server 塊
這塊和虛擬主機有密切關(guān)系,虛擬主機從用戶角度看,和一臺獨立的硬件主機是完全一樣的,該技術(shù)的產(chǎn)生是為了 節(jié)省互聯(lián)網(wǎng)服務(wù)器硬件成本。每個 http 塊可以包括多個 server 塊,而每個 server 塊就相當(dāng)于一個虛擬主機。 而每個 server 塊也分為全局 server 塊,以及可以同時包含多個 locaton 塊。
全局 server 塊:最常見的配置是本虛擬機主機的監(jiān)聽配置和本虛擬主機的名稱或 IP 配置。
location 塊:一個 server 塊可以配置多個 location 塊。這塊的主要作用是基于 Nginx 服務(wù)器接收到的請求字符串(例如 server_name/uri-string),對虛擬主機名稱 (也可以是 IP 別名)之外的字符串(例如 前面的 /uri-string)進行匹配,對特定的請求進行處理。地址定向、數(shù)據(jù)緩 存和應(yīng)答控制等功能,還有許多第三方模塊的配置也在這里進行。
反向代理實例一
當(dāng)我們訪問127.0.0.1的時候,訪問到的是http://www.baidu.com
只需如下配置
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://www.baidu.com;
index index.html index.htm;
}
}
注意:/代表訪問127.0.0.1:80下的任何資源(如127.0.0.1:80/xxx)都會訪問到 http://www.baidu.com
反向代理實例二
根據(jù)訪問的路徑跳轉(zhuǎn)到不同端口的服務(wù)中
訪問 http://127.0.0.1:9001/v1/ 直接跳轉(zhuǎn)到 http://127.0.0.1:4001/
訪問 http://127.0.0.1:9001/v2/ 直接跳轉(zhuǎn)到 http://127.0.0.1:4002/
新增server塊
server {
listen 9001;
server_name localhost;
location ~ /v1/ {
proxy_pass http://127.0.0.1:4001;
}
location ~ /v2/ {
proxy_pass http://127.0.0.1:4002;
}
}
注意:當(dāng)我們在瀏覽器上輸入127.0.0.1:9001/v1/的時候,事實上nginx幫我們訪問的是127.0.0.1:4001/v1/,并不是 http://127.0.0.1:4001
在location指令和uri請求中間可以添加可選的修飾符,四種修飾符的含義分別如下
= 表示精確匹配。只有請求的url路徑與后面的字符串完全相等時,才會命中。
~ 表示該規(guī)則是使用正則定義的,區(qū)分大小寫。
~* 表示該規(guī)則是使用正則定義的,不區(qū)分大小寫。
^~ 表示如果該符號后面的字符是最佳匹配,采用該規(guī)則,不再進行后續(xù)的查找。
負載均衡實例
當(dāng)我們請求127.0.0.1的時候,請求會均衡到127.0.0.1:4005和127.0.0.1:4006上去。
upstream myserver{
server 127.0.0.1:4005;
server 127.0.0.1:4006;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://myserver;
}
}
而且 Nginx 提供了幾種分配方式(策略):
1、輪詢(默認)
每個請求按時間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器 down 掉,能自動剔除。
2、weight
weight 代表權(quán),重默認為 1,權(quán)重越高被分配的客戶端越多
upstream myserver{
server 192.168.5.21:80 weight =1;
server 192.168.5.22:80 weight =1;
}
3、ip_hash
每個請求按訪問 ip 的 hash 結(jié)果分配,這樣每個訪客固定訪問一個后端服務(wù)器,可以解決 session 的問題
upstream myserver{
ip_hash;
server 192.168.5.21:80;
server 192.168.5.22:80;
}
4、fair
按后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配。
upstream myserver{
server 192.168.5.21:80;
server 192.168.5.22:80;
fair
}
動靜分離實例
https://klionsec.github.io/2017/12/21/nginx-static-dynamic/
