1. 程式人生 > 實用技巧 >nginx常用模組二及location配置說明

nginx常用模組二及location配置說明

一、nginx常用模組

1.目錄索引模組 ngx_http_autoindex_module

1)配置

[root@web02 /etc/nginx/conf.d]# vim test.conf 
server {
    listen 80;
    server_name www.test.com;

    location / {
        root /code;
        index index.html;
    }
    location /download {
        root /code;
        index index.html;
        autoindex on;
    }
}

2)優化引數

#顯示檔案大小,使用off
autoindex_exact_size off;

#顯示確切檔案修改時間
autoindex_localtime on;

2.訪問限制模組 ngx_http_access_module

[root@web02 /etc/nginx/conf.d]# vim test.conf 

server {
    listen 80;
    server_name www.test.com;

    location / {
        root /code;
        index index.html;
    }
    location /download {
        root /code;
        index index.html;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
        #allow 10.0.0.0/24;
        allow 10.0.0.1;
        deny all;
    }
}

3.訪問控制模組

1)語法

#開啟認證控制,沒有任何作用就是為了開啟
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

2)配置密碼檔案

#生成密碼檔案
[root@web02 /etc/nginx/conf.d]# htpasswd -c /etc/nginx/auth_basic lhd
New password: 
Re-type new password: 
Adding password for user lhd

#生成密碼,在命令列輸入密碼
[root@web02 /etc/nginx/conf.d]# htpasswd -b -c /etc/nginx/auth_basic lhd linux
Adding password for user lhd

#檢視
[root@web02 /etc/nginx/conf.d]# vim /etc/nginx/auth_basic
lhd:$apr1$JmblF9to$jDnvQn1w7oETPYyvaL2OG.

3)配置nginx

[root@web02 /etc/nginx/conf.d]# cat test.conf 
server {
	listen 80;
	server_name www.test.com;

	location / {
		root /code;
		index index.html;
	}
	location /download {
		root /code;
		index index.html;
		autoindex on;
		autoindex_exact_size off;
		autoindex_localtime on;
		allow 10.0.0.1;
		deny all;
		auth_basic "輸入使用者名稱和密碼";
		auth_basic_user_file /etc/nginx/auth_basic;
    }
}

4)新增多使用者

#不新增-c引數可以新增多個使用者
[root@web02 /etc/nginx/conf.d]# htpasswd /etc/nginx/auth_basic lhd
New password: 
Re-type new password: 
Adding password for user lhd

[root@web02 /etc/nginx/conf.d]# vim /etc/nginx/auth_basic
qiudao:$apr1$UL89inf6$.59e04v5ILGHpkMs2xZzF.
lhd:$apr1$9fOQ/hLl$DEugqKzv.0SNBziFMLdVZ1

4.nginx狀態模組

1)語法

Syntax:	stub_status;
Default:	—
Context:	server, location

2)配置

[root@web02 /etc/nginx/conf.d]# cat test.conf 
server {
	listen 80;
	server_name www.test.com;

	location / {
		root /code;
		index index.html;
	}
	location /download {
		root /code;
		index index.html;
		autoindex on;
		autoindex_exact_size off;
		autoindex_localtime on;
		allow 10.0.0.1;
		deny all;
		auth_basic "輸入使用者名稱和密碼";
		auth_basic_user_file /etc/nginx/auth_basic;
    }
	location /status {
		stub_status;
    }
}

3)狀態頁

#訪問 http://www.test.com/status

#返回內容
Active connections: 2 
server accepts handled requests
 		  2 	 2 	   	 1 
Reading: 0 Writing: 1 Waiting: 1 

#nginx七種狀態
Active connections		#活躍的連線數
accepts				   #接受的TCP連線數
handled				   #已處理的TCP連線數
requests			   #請求數
Reading				   #讀取的請求頭的數量
Writing				   #響應的請求頭的數量
Waiting				   #等待的請求數量

#可以用作監控日PV
[root@web02 /etc/nginx/conf.d]# curl -s http://www.test.com/status | awk 'NR==3 {print $3}'

5.連線限制模組 ngx_http_limit_conn_module

1)語法

#設定限制的空間
Syntax:	limit_conn_zone key zone=name:size;
Default:	—
Context:	http

limit_conn_zone 	#呼叫限制模組
key 			   #儲存的內容
zone=			   #空間
name:			   #空間的名字
size;			   #空間的大小

#呼叫空間
Syntax:	limit_conn zone number;
Default:	—
Context:	http, server, location

limit_conn 			#呼叫空間
zone 				#空間名字
number;				#同一個資訊可以儲存的次數

2)配置

[root@web02 /etc/nginx/conf.d]# cat test.conf 

limit_conn_zone $remote_addr zone=conn_zone:1m;
server {
	listen 80;
	server_name www.test.com;
	limit_conn conn_zone 1;

	location / {
		root /code;
		index index.html;
	}
	location /download {
		root /code;
		index index.html;
		autoindex on;
		autoindex_exact_size off;
		autoindex_localtime on;
		allow 10.0.0.1;
		deny all;
		auth_basic "輸入使用者名稱和密碼";
		auth_basic_user_file /etc/nginx/auth_basic;
    }
	location /status {
		stub_status;
    }
}

6.請求限制模組

1)語法

#設定請求限制的空間
Syntax:	limit_req_zone key zone=name:size rate=rate [sync];
Default:	—
Context:	http

limit_req_zone 		#呼叫模組
key 				#空間儲存的內容
zone=				#指定空間
name:				#空間的名字
size 				#空間的大小
rate=rate;			#讀寫速率

#呼叫空間
Syntax:	limit_req zone=name [burst=number] [nodelay | delay=number];
Default:	—
Context:	http, server, location

limit_req 					#呼叫空間
zone=name 					#指定空間名字
[burst=number] 				#擴充套件
[nodelay | delay=number];	  #延時

2)配置

[root@web02 /etc/nginx/conf.d]# cat test.conf 
limit_conn_zone $remote_addr zone=conn_zone:1m;
limit_req_zone $remote_addr zone=req_zone:1m rate=1r/s;

server {
	listen 80;
	server_name www.test.com;
	limit_conn conn_zone 1;
	limit_req zone=req_zone;
	location / {
		root /code;
		index index.html;
	}
	location /download {
		root /code;
		index index.html;
		autoindex on;
		autoindex_exact_size off;
		autoindex_localtime on;
		allow 10.0.0.1;
		deny all;
		auth_basic "輸入使用者名稱和密碼";
		auth_basic_user_file /etc/nginx/auth_basic;
    }
	location /status {
		stub_status;
    }
}

3)測試請求限制

[root@web02 /etc/nginx/conf.d]# ab -n 200 -c 2 http://www.test.com/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.test.com (be patient)
Completed 100 requests
Completed 200 requests
Finished 200 requests


Server Software:        nginx/1.18.0
Server Hostname:        www.test.com
Server Port:            80

Document Path:          /
Document Length:        13 bytes

Concurrency Level:      2
Time taken for tests:   0.036 seconds
Complete requests:      200
Failed requests:        199
   (Connect: 0, Receive: 0, Length: 199, Exceptions: 0)
Write errors:           0
Non-2xx responses:      199
Total transferred:      73674 bytes
HTML transferred:       39216 bytes
Requests per second:    5492.24 [#/sec] (mean)
Time per request:       0.364 [ms] (mean)
Time per request:       0.182 [ms] (mean, across all concurrent requests)
Transfer rate:          1975.76 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.8      0      12
Processing:     0    0   0.6      0       4
Waiting:        0    0   0.5      0       4
Total:          0    0   1.0      0      12

Percentage of the requests served within a certain time (ms)
  50%      0
  66%      0
  75%      0
  80%      0
  90%      0
  95%      0
  98%      4
  99%      4
 100%     12 (longest request)
[root@web02 /etc/nginx/conf.d]#

二、nginx的location配置

使用Nginx Location可以控制訪問網站的路徑,但一個server可以有多個location配置, 多個location的優先順序該如何區分

1.location語法

Syntax:	location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default:	—
Context:	server, location

2.location匹配符

匹配符 匹配規則 優先順序
= 精確匹配 1
^~ 以某個字串開頭 2
~ 區分大小寫的正則匹配 3
~* 不區分大小寫的正則匹配 3
/ 通用匹配,任何請求都會匹配到 4

3.優先順序驗證

[root@web02 /etc/nginx/conf.d]# cat location.conf 
server {
    listen 80;
    server_name www.location.com;
    #location / {
    #    default_type text/html;
    #    return 200 "location /";
    #}
 
    location =/ {
        default_type text/html;
        return 200 "location =/";
    }
 
    location ~* / {
        default_type text/html;
        return 200 "location ~* /";
    }
 
    location ^~ / {
      default_type text/html;
      return 200 "location ^~";
    }
}

4.location應用場景

#通用匹配,任何請求都會匹配到
location / {
    ...
}
 
#嚴格區分大小寫,匹配以.php結尾的都走這個location    
location ~ \.php$ {
    ...
}
 
#嚴格區分大小寫,匹配以.jsp結尾的都走這個location 
location ~ \.jsp$ {
    ...
}
 
#不區分大小寫匹配,只要使用者訪問.jpg,gif,png,js,css結尾的都走這條location
location ~* .*\.(jpg|gif|png|js|css)$ {
    ...
}
 
#不區分大小寫匹配
location ~* "\.(sql|bak|tgz|tar.gz|.git)$" {
    ...
}

三、LNMP架構

1.簡介

LNMP是一套技術的組合,L=Linux、N=Nginx、M~=MySQL、P~=PHP
不僅僅包含這些,還有redis/ELK/zabbix/git/jenkins/kafka

2.LNMP工作方式

首先Nginx服務是不能處理動態請求,那麼當用戶發起動態請求時, Nginx又是如何進行處理的。
	1.靜態請求:請求靜態檔案的請求
		靜態檔案:
		1)上傳時什麼樣子,檢視時就是什麼樣子
		2)html的頁面都是靜態的
	2.動態請求:請求動態內容,帶引數的請求
		1)伺服器上並不是真實存在的,需要都資料庫等服務上去獲取資料,組成的頁面
	
當用戶發起http請求,請求會被Nginx處理,如果是靜態資源請求Nginx則直接返回,如果是動態請求Nginx則通過fastcgi協議轉交給後端的PHP程式處理,具體如下圖所示

1.訪問流程

1.瀏覽器輸入域名,瀏覽器拿著域名取DNS伺服器解析
2.DNS伺服器解析域名為IP
3.瀏覽器去請求該IP對應的伺服器
4.瀏覽器請求nginx
5.nginx判斷請求是動態請求還是靜態請求
	#靜態請求
	location / {
    	root /code;
    	index index.html;
	}
	#動態請求
	location ~* \.php$ {
    	fastcgi_pass 127.0.0.1:9000;
    	... ...
	}
6.如果是靜態請求,nginx直接返回內容
7.如果是動態內容,nginx會通過fastcgi協議找php-fpm管理程序

8.php-fpm管理程序會去下發工作給wrapper工作程序
9.wrapper工作程序判斷是不是php檔案
10.如果只是php檔案,可以直接解析然後返回結果
11.如果還需要讀取資料庫,wrapper程序會去讀取資料庫資料,然後返回資料