從頭到尾掌握Nginx(一)-創(chuàng)新互聯(lián)

1)Nginx服務(wù)概述

Nginx由俄羅斯的lgor Sysoev開(kāi)發(fā),專(zhuān)為性能優(yōu)化而開(kāi)發(fā),其最知名的優(yōu)點(diǎn)就是它的穩(wěn)定性和低系統(tǒng)資源消耗、以及對(duì)HTTP并發(fā)連接的高處立能力(單臺(tái)物理服務(wù)器可支持30000~50000個(gè)并發(fā)請(qǐng)求)。正因?yàn)槿绱?,大量提供社交網(wǎng)絡(luò)、新聞資訊、電子商務(wù)及虛擬主機(jī)等服務(wù)的企業(yè)紛紛選擇Nginx來(lái)提供Web服務(wù)。

創(chuàng)新互聯(lián)公司是一家以網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、品牌設(shè)計(jì)、軟件運(yùn)維、成都網(wǎng)站推廣、小程序App開(kāi)發(fā)等移動(dòng)開(kāi)發(fā)為一體互聯(lián)網(wǎng)公司。已累計(jì)為被動(dòng)防護(hù)網(wǎng)等眾行業(yè)中小客戶(hù)提供優(yōu)質(zhì)的互聯(lián)網(wǎng)建站和軟件開(kāi)發(fā)服務(wù)。

搭建Web服務(wù)如果是為了解析靜態(tài)網(wǎng)頁(yè)、動(dòng)態(tài)網(wǎng)頁(yè)等、不需要太多的功能,那么Nginx絕對(duì)是選。

2)安裝Nginx

本次案例采用yum的方式進(jìn)行安裝,不過(guò)不使用epel源,因?yàn)檫@個(gè)nginx版本更新的太快了,導(dǎo)致epel根本趕不上Nginx的更新速度,所以我們采用官方的yum的yum源進(jìn)行配置!

[root@nginx ~]# yum install -y gcc gcc- c++ autoconf pcre pcre-devel make automake wget httpd-tools vim tree
#由于是最小化安裝的系統(tǒng),所以安裝一些必要的軟件
[root@nginx ~]# vim /etc/yum.repos.d/nginx.repo
#配置nginx的yum源,Nginx官方也有相應(yīng)的配置信息
[nginx]
name=nginx_repo 
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
#該yum源默認(rèn)情況下安裝的是nginx最新的、穩(wěn)定版
[root@nginx ~]# yum -y install nginx              #安裝nginx
[root@nginx ~]# nginx -v             #查看nginx的版本
nginx version: nginx/1.16.1

3)Nginx安裝目錄

為了更清晰的了解 Nginx 軟件的全貌,有必要介紹下 Nginx 安裝后整體的?錄結(jié)構(gòu)及?件功能。

[root@nginx ~]# rpm -ql nginx
#查看與nginx相關(guān)的目錄

下圖對(duì)nginx的安裝目錄進(jìn)行詳細(xì)的解釋?zhuān)?br/>從頭到尾掌握Nginx(一)

4)Nginx的編譯參數(shù)

[root@nginx ~]# nginx -V
#查看nginx的編譯參數(shù)

下圖展示了Nginx編譯參數(shù)選項(xiàng)以及作用!
從頭到尾掌握Nginx(一)

5)Nginx常用模塊

Nginx模塊分為 Nginx官?模塊以及Nginx第三?模塊!如圖表:

Nginx編譯選項(xiàng) 模塊作用
ngx_http_core_module包含?些核?的http參數(shù)配置,對(duì)應(yīng)Nginx的配置區(qū)塊部分
ngx_http_access_module訪問(wèn)控制模塊,?來(lái)控制?站?戶(hù)對(duì)Nginx的訪問(wèn)
ngx_http_gzip_module壓縮模塊,對(duì)Nginx返回的數(shù)據(jù)壓縮,屬于性能優(yōu)化模塊
ngx_http_fastcgi_modulefastci模塊,和動(dòng)態(tài)應(yīng)?相關(guān)的模塊,例如PHP
ngx_http_proxy_moduleproxy代理模塊
ngx_http_upstream_module負(fù)載均衡模塊,可以實(shí)現(xiàn)?站的負(fù)載均衡功能及節(jié)點(diǎn)的健康檢查
ngx_http_rewrite_moduleURL地址重寫(xiě)模塊
ngx_http_limit_conn_module限制?戶(hù)并發(fā)連接數(shù)及請(qǐng)求數(shù)模塊
ngx_http_limit_req_module限制Nginx request processing rate根據(jù)定義的key
ngx_http_log_module訪問(wèn)?志模塊,以指定的格式記錄Nginx客戶(hù)訪問(wèn)?志等信息
ngx_http_auth_basic_moduleWeb認(rèn)證模塊,設(shè)置Web?戶(hù)通過(guò)賬號(hào)密碼訪問(wèn)Nginx
nginx_http_ssl_modulessl模塊,?于加密的http連接,如https

6)Nginx內(nèi)置變量

$uri:當(dāng)前請(qǐng)求的URI,不帶參數(shù);
$request_uri:請(qǐng)求的URI,帶完整參數(shù);
$host:http請(qǐng)求報(bào)文中host首部,如果沒(méi)有則以處理此請(qǐng)求的虛擬主機(jī)名稱(chēng)名代替;
$hostname:nginx服務(wù)運(yùn)行在主機(jī)的主機(jī)名;
$remote_addr:客戶(hù)端IP;
$remote_port:客戶(hù)端端口;
$remote_user:使用用戶(hù)認(rèn)證時(shí)客戶(hù)端用戶(hù)輸入的用戶(hù)名;
$request_filename:用戶(hù)請(qǐng)求中的URI經(jīng)過(guò)本地root或alias轉(zhuǎn)換后映射的本地文件路徑;
$request_method:請(qǐng)求方法:GET、POST、PUT
$server_addr:服務(wù)器地址;
$server_name:服務(wù)器名稱(chēng);
$server_port:服務(wù)器端口;
$server_protocol:服務(wù)器向客戶(hù)端發(fā)送響應(yīng)時(shí)的協(xié)議,如http/1.1 http/1.0;
$scheme:在請(qǐng)求中使用scheme,作用是截取http://xxxx.com中的http;
$http_HEADER:匹配請(qǐng)求報(bào)文中指定的HEADER;
$http_host:匹配請(qǐng)求報(bào)文中的host首部;
$document_root:當(dāng)前請(qǐng)求映射到的root配置;
$http_user_agent:從http請(qǐng)求的頭部信息中,獲取客戶(hù)端的訪問(wèn)設(shè)備;
$status:響應(yīng)報(bào)文返回的狀態(tài)碼;
$body_bytes_sent:從服務(wù)端響應(yīng)給客戶(hù)端body信息大小;
$http_referer:http上一級(jí)頁(yè)面,防盜鏈、用戶(hù)行為;
$http_x_forwarded_for:http請(qǐng)求攜帶的http信息;
$time_local:nginx的時(shí)間;

7)Nginx的配置文件

Nginx主配置?件 /etc/nginx/nginx.conf 是?個(gè)純?本類(lèi)型的?件,整個(gè)配置?件是以區(qū)塊的形式組織的。?般,每個(gè)區(qū)塊以?對(duì)?括號(hào) {} 來(lái)表示開(kāi)始與結(jié)束。

//nginx默認(rèn)配置語(yǔ)法
user                                                                //設(shè)置nginx服務(wù)的系統(tǒng)使??戶(hù)
worker_processes                //?作進(jìn)程, 配置和CPU個(gè)數(shù)保持?致
error_log                                           //錯(cuò)誤?志, 后?接?的是路徑
pid                                                                 //Nginx服務(wù)啟動(dòng)時(shí)的pid
//events事件模塊
events  {               //事件模塊                                              
                worker_connections      //每個(gè)worker進(jìn)程?持的最?連接數(shù)
                use                                                                 //內(nèi)核模型,select,poll,epoll
}
//?虛擬主機(jī)的配置或公共配置定義在http{}段內(nèi), server{}段外
http    {
...             
                //必須使?虛擬機(jī)配置站點(diǎn),  每個(gè)虛擬機(jī)使??個(gè)server{}段
                'server'    {
                                listen  80;             //監(jiān)聽(tīng)端?, 默認(rèn)80
                                server_name     localhost;  //提供服務(wù)的域名或主機(jī)名

                                //控制?站訪問(wèn)路徑
                                'location'  /   {
                                                root            /usr/share/nginx/html;          //存放?站路徑
                                                index       index.html  index.htm;              //默認(rèn)訪問(wèn)???件
                                }

                                //指定錯(cuò)誤代碼,   統(tǒng)?定義錯(cuò)誤??,   錯(cuò)誤代碼重定向到新的Locaiton
                                error_page          500 502 503 504     /50x.html;
                                'location'  =   /50x.html   {
                                                root            html;
                                }
                }
                ...
                //第?個(gè)虛擬主機(jī)配置
                'server'    {
                ...
                }
}

8)Nginx日志配置

//配置語(yǔ)法: 包括: error.log   access.log
Syntax: log_format  name    [escape=default|json]   string  ...;
Default:                log_format  combined    "...";
Context:                http
//Nginx默認(rèn)配置
    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                //表示客戶(hù)端地址
$remote_user                //http客戶(hù)端請(qǐng)求nginx認(rèn)證?戶(hù)名
$time_local                 //Nginx的時(shí)間
$request                                //Request請(qǐng)求?,   GET等?法、http協(xié)議版本
$status                                 //respoence返回狀態(tài)碼
$body_bytes_sent                //從服務(wù)端響應(yīng)給客戶(hù)端body信息??
$http_referer                           //http上?級(jí)??,    防盜鏈、?戶(hù)?為分析
$http_user_agent                //http頭部信息, 客戶(hù)端訪問(wèn)設(shè)備
$http_x_forwarded_for           //http請(qǐng)求攜帶的http信息

9)Nginx狀態(tài)監(jiān)控

--with-http_stub_status_module 記錄 Nginx 客戶(hù)端基本訪問(wèn)狀態(tài)信息!
具體配置如下:

    location    /mystatus   {
                stub_status on;
                access_log  off;
}
//Nginx_status概述
Active  connections:2               //Nginx當(dāng)前活躍連接數(shù)
server  accepts handled requests
16                  16                  19
server表示Nginx處理接收握?總次數(shù)。
accepts表示Nginx處理接收總連接數(shù)。
請(qǐng)求丟失數(shù)=(握?數(shù)-連接數(shù))可以看出,本次狀態(tài)顯示沒(méi)有丟失請(qǐng)求。
handled requests,表示總共處理了19次請(qǐng)求。
Reading                 Nginx讀取數(shù)據(jù)
Writing                 Nginx寫(xiě)的情況
Waiting             Nginx開(kāi)啟keep-alive?連接情況下,    既沒(méi)有讀也沒(méi)有寫(xiě),   建?連接情況

10)Nginx下載站點(diǎn)

Nginx默認(rèn)是不允許列出整個(gè)目錄瀏覽下載的!

Syntax: autoindex   on  |   off;
Default:                
autoindex   off;
Context:                http,   server, location
//autoindex常?參數(shù)
autoindex_exact_size    off;
默認(rèn)為on, 顯示出?件的確切??,單位是bytes。
修改為off,顯示出?件的?概??,單位是kB或者M(jìn)B或者GB。
autoindex_localtime on;
默認(rèn)為off,顯示的?件時(shí)間為GMT時(shí)間。
修改為on, 顯示的?件時(shí)間為?件的服務(wù)器時(shí)間。
charset utf-8,gbk;
默認(rèn)中??錄亂碼,添加上解決亂碼。

配置目錄瀏覽功能

//開(kāi)啟?錄瀏覽
        location /down {
                            root    /usr/share/nginx/html;
                            autoindex       on;
                            autoindex_localtime     on;
                            autoindex_exact_size    off;
        }

11)Nginx訪問(wèn)限制

連接頻率限制:limit_conn_module
請(qǐng)求頻率限制:limit_req_module

http協(xié)議的連接與請(qǐng)求
HTTP是建?在TCP, 在完成HTTP請(qǐng)求需要先建?TCP三次握?(稱(chēng)為T(mén)CP連接),在連接的基礎(chǔ)上在HTTP請(qǐng)求。
從頭到尾掌握Nginx(一)
HTTP協(xié)議的連接與請(qǐng)求

HTTP協(xié)議版本 連接關(guān)系
HTTP1.0TCP不能復(fù)用
HTTP1.1順序性TCP復(fù)用
HTTP2.0多路復(fù)用TCP復(fù)用
HTTP請(qǐng)求建立在一次TCP連接基礎(chǔ)上;
一次TCP請(qǐng)求至少產(chǎn)生一次HTTP請(qǐng)求;
1)Nginx連接限制
//Nginx連接限制語(yǔ)法
Syntax:     limit_conn_zone key zone=name:size;
Default:    —
Context:    http
Syntax: limit_conn  zone    number;
Default:    —
Context:    http,   server, location
//具體配置如下:
http    {
//http段配置連接限制,  同?時(shí)刻只允許?個(gè)客戶(hù)端IP連接
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
                ...
                server  {
                ...     
                                location    /   {
                                //同?時(shí)刻只允許?個(gè)客戶(hù)端IP連接
                                limit_conn  conn_zone   1;
                                }
//壓?測(cè)試
yum install -y  httpd-tools
ab  -n  50  -c  20      http://127.0.0.1/index.html
2)Nginx請(qǐng)求限制
//Nginx請(qǐng)求限制語(yǔ)法
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段配置請(qǐng)求限制,  rate限制速率,限制?秒鐘最多?個(gè)IP請(qǐng)求
limit_req_zone  $binary_remote_addr zone=req_zone:10m   rate=1r/s;
                ...
                server  {
                ...     
                                location    /   {
                                //1r/s只接收?個(gè)請(qǐng)求,其余請(qǐng)求拒絕處理并返回錯(cuò)誤碼給客戶(hù)端
                                                limit_req   zone=req_zone;
                                //請(qǐng)求超過(guò)1r/s,剩下的將被延遲處理,請(qǐng)求數(shù)超過(guò)burst定義的數(shù)量,   多余的請(qǐng)求返回503
                                                #limit_req  zone=req_zone   burst=3 nodelay;
                                }
//壓?測(cè)試
yum install -y  httpd-tools
ab  -n  50  -c  20      http://127.0.0.1/index.html

連接請(qǐng)求沒(méi)有請(qǐng)求限制有效?
1)多個(gè)請(qǐng)求可以建?在?次的TCP連接之上, 那么我們對(duì)請(qǐng)求的精度限制,當(dāng)然?對(duì)?個(gè)連接的限制會(huì)更加的有效;
2)因?yàn)橥?時(shí)刻只允許?個(gè)連接請(qǐng)求進(jìn)?;
3)但是同?時(shí)刻多個(gè)請(qǐng)求可以通過(guò)?個(gè)連接進(jìn)?;
4)所以請(qǐng)求限制才是?較優(yōu)的解決?案;

12)Nginx訪問(wèn)控制

基于IP的訪問(wèn)控制:http_access_module
基于?戶(hù)登陸認(rèn)證:http_auth_basic_module
1)基于IP的訪問(wèn)控制
//允許配置語(yǔ)法
Syntax: allow   address |   CIDR    |   unix:   |   all;
Default:        -
Context:    http,   server, location,   limit_except
//拒絕配置語(yǔ)法
Syntax: deny    address |   CIDR    |   unix:   |   all;
Default:        -
Context:    http,   server, location,   limit_except
//配置拒絕某?個(gè)IP,    其他全部允許
location    ~   ^/1.html    {
                root    /usr/share/nginx/html;
                index   index.html;
                deny    192.168.10.1;                    #注意檢查順序是從上往下
                allow   all;
}
//只允許某?個(gè)?段訪問(wèn),其它全部拒絕
location    /   {
                root            html;
                index       index.php   index.html  index.htm;
                allow           192.168.10.0/24;
                deny                all;
}

http_access_module局限性:
從頭到尾掌握Nginx(一)
下圖是使?http_x_forwarded_for記錄真實(shí)客戶(hù)端IP地址以及代理服務(wù)器IP
從頭到尾掌握Nginx(一)
解決方案:
1)采?HTTP頭信息控制訪問(wèn), 代理以及web服務(wù)開(kāi)啟 http_x_forwarded_for;
2)結(jié)合geo模塊;
3)通過(guò)HTTP?動(dòng)以變量傳遞;

2)基于用戶(hù)登錄認(rèn)證
//配置語(yǔ)法
Syntax: auth_basic  string| off;
Default:    auth_basic  off;
Context: http,  server, location,   limit_except
//?戶(hù)密碼記錄配置?件
Syntax: auth_basic_user_file    file;
Default:    -
Context:    http,   server, location,   limit_except
//需要安裝依賴(lài)組件
[root@nginx ~]# yum install httpd-tools
[root@nginx ~]# htpasswd    -c  /etc/nginx/auth_conf    zhangsan     #新創(chuàng)建的用戶(hù)
[root@nginx ~]# htpasswd    -b  /etc/nginx/auth_conf    lisi 123456     #增加用戶(hù)需使用-b選項(xiàng)并指定密碼
//可在http,server,location下添加如下信息
auth_basic  "請(qǐng)輸入用戶(hù)名及密碼!";
auth_basic_user_file    /etc/nginx/auth_conf;

用戶(hù)認(rèn)證局限性:
1)用戶(hù)信息依賴(lài)文件方式;
2)用戶(hù)管理文件過(guò)多,無(wú)法聯(lián)動(dòng);
3)操作管理機(jī)械,效率低下;

解決方法:
1)Nginx結(jié)合LUA實(shí)現(xiàn)高效認(rèn)證;
2)Nginx結(jié)合nginx-auth-ldap模塊;

13)Nginx虛擬主機(jī)

所謂虛擬主機(jī),在web服務(wù)器?是?個(gè)獨(dú)?的?站站點(diǎn),這個(gè)站點(diǎn)對(duì)應(yīng)獨(dú)?的域名(也可能是IP或端?),具有獨(dú)?的程序及資源?錄,可以獨(dú)?地對(duì)外提供服務(wù)供?戶(hù)訪問(wèn)。

1)配置基于域名的虛擬主機(jī)
1.創(chuàng)建web站點(diǎn)?錄
[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.配置虛擬主機(jī)
[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)配置不同端?訪問(wèn)不同虛擬主機(jī)
//僅修改listen監(jiān)聽(tīng)端?即可,  但不能和系統(tǒng)端?發(fā)?沖突
server  {
                ...
                listen 8001;
                ...
}
server  {
                ...
                listen  8002;
                ...
}
3)配置虛擬主機(jī)別名

所謂虛擬主機(jī)別名,就是虛擬主機(jī)設(shè)置除了主域名以外的?個(gè)域名,實(shí)現(xiàn)?戶(hù)訪問(wèn)的多個(gè)域名對(duì)應(yīng)同?個(gè)虛擬主機(jī)?站的功能。
以www.nginx.com 域名的虛擬主機(jī)為例:為其增加?個(gè)別名nginx.com時(shí),出現(xiàn)?站內(nèi)容和訪問(wèn)www.nginxi.com 是?樣的,具體配置如下:

//默認(rèn)配置
[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測(cè)試結(jié)果
[root@LNMP  conf]#  curl    nginx.com
www.nginx.com
[root@LNMP  conf]#  curl    www.nginx.com
www.nginx.com
//訪問(wèn)帶www和不帶www是?樣的, 除了別名實(shí)現(xiàn)也可以通過(guò)rewrite實(shí)現(xiàn)

————————本文到此結(jié)束,感謝閱讀————————————

標(biāo)題名稱(chēng):從頭到尾掌握Nginx(一)-創(chuàng)新互聯(lián)
本文鏈接:http://muchs.cn/article4/egcie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站網(wǎng)站設(shè)計(jì)、虛擬主機(jī)、網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷(xiāo)推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名