天天看點

Nginx系列之Nginx基礎

博文大綱:

1)Nginx服務概述

2)安裝Nginx

3)Nginx安裝目錄

4)Nginx的編譯參數

5)Nginx常用子產品

6)Nginx内置變量

7)Nginx的配置檔案

8)Nginx日志配置

9)Nginx狀态監控

10)Nginx下載下傳站點

11)Nginx通路限制

12)Nginx通路控制

13)Nginx虛拟主機

Nginx由俄羅斯的lgor Sysoev開發,專為性能優化而開發,其最知名的優點就是它的穩定性和低系統資源消耗、以及對HTTP并發連接配接的高處立能力(單台實體伺服器可支援30000~50000個并發請求)。正因為如此,大量提供社交網絡、新聞資訊、電子商務及虛拟主機等服務的企業紛紛選擇Nginx來提供Web服務。

搭建Web服務如果是為了解析靜态網頁、動态網頁等、不需要太多的功能,那麼Nginx絕對是首選。

本次案例采用yum的方式進行安裝,不過不使用epel源,因為這個nginx版本更新的太快了,導緻epel根本趕不上Nginx的更新速度,是以我們采用官方的yum的yum源進行配置!

[root@nginx ~]# yum install -y gcc gcc- c++ autoconf pcre pcre-devel make automake wget httpd-tools vim tree
#由于是最小化安裝的系統,是以安裝一些必要的軟體
[root@nginx ~]# vim /etc/yum.repos.d/nginx.repo
#配置nginx的yum源,Nginx官方也有相應的配置資訊
[nginx]
name=nginx_repo 
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
#該yum源預設情況下安裝的是nginx最新的、穩定版
[root@nginx ~]# yum -y install nginx              #安裝nginx
[root@nginx ~]# nginx -v             #檢視nginx的版本
nginx version: nginx/1.16.1           

為了更清晰的了解 Nginx 軟體的全貌,有必要介紹下 Nginx 安裝後整體的⽬錄結構及⽂件功能。

[root@nginx ~]# rpm -ql nginx
#檢視與nginx相關的目錄           

下圖對nginx的安裝目錄進行詳細的解釋!

Nginx系列之Nginx基礎

[root@nginx ~]# nginx -V
#檢視nginx的編譯參數           

下圖展示了Nginx編譯參數選項以及作用!

Nginx系列之Nginx基礎

Nginx子產品分為 Nginx官⽅子產品以及Nginx第三⽅子產品!如圖表:

Nginx編譯選項 子產品作用
ngx_http_core_module 包含⼀些核⼼的http參數配置,對應Nginx的配置區塊部分
ngx_http_access_module 通路控制子產品,⽤來控制⽹站⽤戶對Nginx的通路
ngx_http_gzip_module 壓縮子產品,對Nginx傳回的資料壓縮,屬于性能優化子產品
ngx_http_fastcgi_module fastci子產品,和動态應⽤相關的子產品,例如PHP
ngx_http_proxy_module proxy代理子產品
ngx_http_upstream_module 負載均衡子產品,可以實作⽹站的負載均衡功能及節點的健康檢查
ngx_http_rewrite_module URL位址重寫子產品
ngx_http_limit_conn_module 限制⽤戶并發連接配接數及請求數子產品
ngx_http_limit_req_module 限制Nginx request processing rate根據定義的key
ngx_http_log_module 通路⽇志子產品,以指定的格式記錄Nginx客戶通路⽇志等資訊
ngx_http_auth_basic_module Web認證子產品,設定Web⽤戶通過賬号密碼通路Nginx
nginx_http_ssl_module ssl子產品,⽤于加密的http連接配接,如https

$uri:目前請求的URI,不帶參數;
$request_uri:請求的URI,帶完整參數;
$host:http請求封包中host首部,如果沒有則以處理此請求的虛拟主機名稱名代替;
$hostname:nginx服務運作在主機的主機名;
$remote_addr:用戶端IP;
$remote_port:用戶端端口;
$remote_user:使用使用者認證時用戶端使用者輸入的使用者名;
$request_filename:使用者請求中的URI經過本地root或alias轉換後映射的本地檔案路徑;
$request_method:請求方法:GET、POST、PUT
$server_addr:伺服器位址;
$server_name:伺服器名稱;
$server_port:伺服器端口;
$server_protocol:伺服器向用戶端發送響應時的協定,如http/1.1 http/1.0;
$scheme:在請求中使用scheme,作用是截取http://xxxx.com中的http;
$http_HEADER:比對請求封包中指定的HEADER;
$http_host:比對請求封包中的host首部;
$document_root:目前請求映射到的root配置;
$http_user_agent:從http請求的頭部資訊中,擷取用戶端的通路裝置;
$status:響應封包傳回的狀态碼;
$body_bytes_sent:從服務端響應給用戶端body資訊大小;
$http_referer:http上一級頁面,防盜鍊、使用者行為;
$http_x_forwarded_for:http請求攜帶的http資訊;
$time_local:nginx的時間;           

Nginx主配置⽂件 /etc/nginx/nginx.conf 是⼀個純⽂本類型的⽂件,整個配置⽂件是以區塊的形式組織的。⼀般,每個區塊以⼀對⼤括号 {} 來表示開始與結束。

//nginx預設配置文法
user                //設定nginx服務的系統使⽤⽤戶
worker_processes    //⼯作程序, 配置和CPU個數保持⼀緻
error_log      //錯誤⽇志,  後⾯接⼊的是路徑
pid                         //Nginx服務啟動時的pid
//events事件子產品
events  {       //事件子產品
        worker_connections      //每個worker程序⽀持的最⼤連接配接數
        use                 //核心模型,select,poll,epoll
}
//⾮虛拟主機的配置或公共配置定義在http{}段内, server{}段外
http    {
...             
#必須使⽤虛拟機配置站點,   每個虛拟機使⽤⼀個server{}段
    'server'    {
            listen  80;             //監聽端⼝, 預設80
        server_name     localhost;  //提供服務的域名或主機名
#控制⽹站通路路徑
                                'location'  /   {
                                        root    /usr/share/nginx/html;          //存放⽹站路徑
                                        index   index.html  index.htm;              //預設通路⾸⻚⽂件
                                }

#/指定錯誤代碼,   統⼀定義錯誤⻚⾯,   錯誤代碼重定向到新的Locaiton
                                error_page          500 502 503 504     /50x.html;
                                'location'  =   /50x.html   {
                                     root           html;
                                }
                }
                ...
#第⼆個虛拟主機配置
                'server'    {
                ...
                }
}           

//配置文法: 包括: error.log   access.log
Syntax: log_format  name    [escape=default|json]   string  ...;
Default:                log_format  combined    "...";
Context:                http
//Nginx預設配置
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

//Nginx⽇志變量
$remote_addr                //表示用戶端位址
$remote_user        //http用戶端請求nginx認證⽤戶名
$time_local                 //Nginx的時間
$request                        //Request請求⾏,   GET等⽅法、http協定版本
$status                         //respoence傳回狀态碼
$body_bytes_sent                //從服務端響應給用戶端body資訊⼤⼩
$http_referer                       //http上⼀級⻚⾯,    防盜鍊、⽤戶⾏為分析
$http_user_agent                //http頭部資訊, 用戶端通路裝置
$http_x_forwarded_for           //http請求攜帶的http資訊           

--with-http_stub_status_module 記錄 Nginx 用戶端基本通路狀态資訊!

具體配置如下:

location    /mystatus   {
                stub_status on;
                access_log  off;
}
//Nginx_status概述
Active  connections:2       //Nginx目前活躍連接配接數
server  accepts handled requests
16                  16                  19
server表示Nginx處理接收握⼿總次數。
accepts表示Nginx處理接收總連接配接數。
請求丢失數=(握⼿數-連接配接數)可以看出,本次狀态顯示沒有丢失請求。
handled requests,表示總共處理了19次請求。
Reading                 Nginx讀取資料
Writing                 Nginx寫的情況
Waiting             Nginx開啟keep-alive⻓連接配接情況下,    既沒有讀也沒有寫,   建⽴連接配接情況           

Nginx預設是不允許列出整個目錄浏覽下載下傳的!

Syntax: autoindex   on  |   off;
Default:                
autoindex   off;
Context:                http,   server, location
//autoindex常⽤參數
autoindex_exact_size    off;
預設為on, 顯示出⽂件的确切⼤⼩,機關是bytes。
修改為off,顯示出⽂件的⼤概⼤⼩,機關是kB或者MB或者GB。
autoindex_localtime on;
預設為off,顯示的⽂件時間為GMT時間。
修改為on, 顯示的⽂件時間為⽂件的伺服器時間。
charset utf-8,gbk;
預設中⽂⽬錄亂碼,添加上解決亂碼。           

配置目錄浏覽功能

#開啟⽬錄浏覽
        location /down {
                     root    /usr/share/nginx/html;
                     autoindex       on;
                    autoindex_localtime     on;
                        autoindex_exact_size    off;
        }           

連接配接頻率限制:limit_conn_module
請求頻率限制:limit_req_module           

http協定的連接配接與請求

HTTP是建⽴在TCP, 在完成HTTP請求需要先建⽴TCP三次握⼿(稱為TCP連接配接),在連接配接的基礎上在HTTP請求。

Nginx系列之Nginx基礎

HTTP協定的連接配接與請求

HTTP協定版本 連接配接關系
HTTP1.0 TCP不能複用
HTTP1.1 順序性TCP複用
HTTP2.0 多路複用TCP複用
HTTP請求建立在一次TCP連接配接基礎上;
一次TCP請求至少産生一次HTTP請求;           

1)Nginx連接配接限制

//Nginx連接配接限制文法
Syntax:     limit_conn_zone key zone=name:size;
Default:    —
Context:    http
Syntax: limit_conn  zone    number;
Default:    —
Context:    http,   server, location
//具體配置如下:
http    {
//http段配置連接配接限制,  同⼀時刻隻允許⼀個用戶端IP連接配接
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
        ...
        server  {
        ...     
        location / {
            limit_conn  conn_zone   1;    #同⼀時刻隻允許⼀個用戶端IP連接配接
                                }
#壓⼒測試
yum install -y  httpd-tools
ab  -n  50  -c  20      http://127.0.0.1/index.html           

2)Nginx請求限制

//Nginx請求限制文法
Syntax:     limit_req_zone  key zone=name:size  rate=rate;
Default:    —
Context:    http
Syntax: limit_conn  zone    number  [burst=number]  [nodelay];
Default:    —
Context:    http,   server, location
//具體配置如下:
http    {
//http段配置請求限制,  rate限制速率,限制⼀秒鐘最多⼀個IP請求
limit_req_zone  $binary_remote_addr zone=req_zone:10m   rate=1r/s;
                ...
    server  {
                ...     
                location / {
                    limit_req   zone=req_zone;     #1r/s隻接收⼀個請求,其餘請求拒絕處理并傳回錯誤碼給用戶端
                    #limit_req  zone=req_zone   burst=3 nodelay;    #請求超過1r/s,剩下的将被延遲處理,請求數超過burst定義的數量,    多餘的請求傳回503
                                }
#壓⼒測試
yum install -y  httpd-tools
ab  -n  50  -c  20      http://127.0.0.1/index.html           

連接配接請求沒有請求限制有效?

1)多個請求可以建⽴在⼀次的TCP連接配接之上, 那麼我們對請求的精度限制,當然⽐對⼀個連接配接的限制會更加的有效;

2)因為同⼀時刻隻允許⼀個連接配接請求進⼊;

3)但是同⼀時刻多個請求可以通過⼀個連接配接進⼊;

4)是以請求限制才是⽐較優的解決⽅案;

基于IP的通路控制:http_access_module
基于⽤戶登陸認證:http_auth_basic_module           

1)基于IP的通路控制

//允許配置文法
Syntax: allow   address |   CIDR    |   unix:   |   all;
Default:        -
Context:    http,   server, location,   limit_except
//拒絕配置文法
Syntax: deny    address |   CIDR    |   unix:   |   all;
Default:        -
Context:    http,   server, location,   limit_except
//配置拒絕某⼀個IP,    其他全部允許
location    ~   ^/1.html    {
                root    /usr/share/nginx/html;
                index   index.html;
                deny    192.168.10.1;                    #注意檢查順序是從上往下
                allow   all;
}
//隻允許某⼀個⽹段通路,其它全部拒絕
location    /   {
                root    html;
                index   index.php   index.html  index.htm;
                allow   192.168.10.0/24;
                deny    all;
}           

http_access_module局限性:

Nginx系列之Nginx基礎

下圖是使⽤http_x_forwarded_for記錄真實用戶端IP位址以及代理伺服器IP

Nginx系列之Nginx基礎

解決方案:

1)采⽤HTTP頭資訊控制通路, 代理以及web服務開啟 http_x_forwarded_for;

2)結合geo子產品;

3)通過HTTP⾃動以變量傳遞;

2)基于使用者登入認證

//配置文法
Syntax: auth_basic  string| off;
Default:    auth_basic  off;
Context: http,  server, location,   limit_except
//⽤戶密碼記錄配置⽂件
Syntax: auth_basic_user_file    file;
Default:    -
Context:    http,   server, location,   limit_except
//需要安裝依賴元件
[root@nginx ~]# yum install httpd-tools
[root@nginx ~]# htpasswd    -c  /etc/nginx/auth_conf    zhangsan     #新建立的使用者
[root@nginx ~]# htpasswd    -b  /etc/nginx/auth_conf    lisi 123456     #增加使用者需使用-b選項并指定密碼
//可在http,server,location下添加如下資訊
auth_basic  "請輸入使用者名及密碼!";
auth_basic_user_file    /etc/nginx/auth_conf;           

使用者認證局限性:

1)使用者資訊依賴檔案方式;

2)使用者管理檔案過多,無法關聯;

3)操作管理機械,效率低下;

解決方法:

1)Nginx結合LUA實作高效認證;

2)Nginx結合nginx-auth-ldap子產品;

1)配置基于域名的虛拟主機

1.建立web站點⽬錄
[root@nginx conf]#  mkdir   /soft/code/{www,bbs}
[root@nginx conf]#  echo    "www"   >   /soft/code/www/index.html
[root@nginx conf]#  echo    "bbs"   >   /soft/code/bbs/index.html
2.配置虛拟主機
[root@nginx conf]#  cat conf.d/{www,bbs}.conf
server  {
    listen  80;
    server_name     www.nginx.com;
    root    /soft/code/www;
    ...
}
server  {
    ...
    listen 80;
    server_name     bbs.nginx.com;
    root    /soft/code/bbs;
}           

2)配置不同端⼝通路不同虛拟主機

//僅修改listen監聽端⼝即可,  但不能和系統端⼝發⽣沖突
server  {
    ...
        listen 8001;
        ...
}
server  {
        ...
        listen  8002;
        ...
}           

3)配置虛拟主機名稱

#預設配置
[root@nginx ~]# vim /etc/nginx/nginx.conf
server  {
        listen 80;
        server_name www.nginx.com;
}
#别名配置
[root@LNMP  ~]# vim /etc/nginx/nginx.conf
server  {
        listen  80;
        server_name     www.nginx.com   nginx.com;
        ...
}
//使⽤Linux下curl測試結果
[root@LNMP  conf]#  curl    nginx.com
www.nginx.com
[root@LNMP  conf]#  curl    www.nginx.com
www.nginx.com
//通路帶www和不帶www是⼀樣的, 除了别名實作也可以通過rewrite實作           

繼續閱讀