1)Nginx服務概述
Nginx由俄羅斯的lgor Sysoev開發,專爲性能優化而開發,其最知名的優點就是它的穩定性和低系統資源消耗、以及對HTTP併發連接的高處立能力(單臺物理服務器可支持30000~50000個併發請求)。正因爲如此,大量提供社交網絡、新聞資訊、電子商務及虛擬主機等服務的企業紛紛選擇Nginx來提供Web服務。
搭建Web服務如果是爲了解析靜態網頁、動態網頁等、不需要太多的功能,那麼Nginx絕對是首選。
2)安裝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
3)Nginx安裝目錄
爲了更清晰的瞭解 Nginx 軟件的全貌,有必要介紹下 Nginx 安裝後整體的⽬錄結構及⽂件功能。
[root@nginx ~]# rpm -ql nginx
#查看與nginx相關的目錄
下圖對nginx的安裝目錄進行詳細的解釋!
4)Nginx的編譯參數
[root@nginx ~]# nginx -V
#查看nginx的編譯參數
下圖展示了Nginx編譯參數選項以及作用!
5)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 |
6)Nginx內置變量
$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的時間;
7)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' {
...
}
}
8)Nginx日誌配置
//配置語法: 包括: 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信息
9)Nginx狀態監控
--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⻓連接情況下, 既沒有讀也沒有寫, 建⽴連接情況
10)Nginx下載站點
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;
}
11)Nginx訪問限制
連接頻率限制:limit_conn_module
請求頻率限制:limit_req_module
http協議的連接與請求
HTTP是建⽴在TCP, 在完成HTTP請求需要先建⽴TCP三次握⼿(稱爲TCP連接),在連接的基礎上在HTTP請求。
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 / {
//同⼀時刻只允許⼀個客戶端IP連接
limit_conn conn_zone 1;
}
//壓⼒測試
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 / {
//1r/s只接收⼀個請求,其餘請求拒絕處理並返回錯誤碼給客戶端
limit_req zone=req_zone;
//請求超過1r/s,剩下的將被延遲處理,請求數超過burst定義的數量, 多餘的請求返回503
#limit_req zone=req_zone burst=3 nodelay;
}
//壓⼒測試
yum install -y httpd-tools
ab -n 50 -c 20 http://127.0.0.1/index.html
連接請求沒有請求限制有效?
1)多個請求可以建⽴在⼀次的TCP連接之上, 那麼我們對請求的精度限制,當然⽐對⼀個連接的限制會更加的有效;
2)因爲同⼀時刻只允許⼀個連接請求進⼊;
3)但是同⼀時刻多個請求可以通過⼀個連接進⼊;
4)所以請求限制纔是⽐較優的解決⽅案;
12)Nginx訪問控制
基於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侷限性:
下圖是使⽤http_x_forwarded_for記錄真實客戶端IP地址以及代理服務器IP
解決方案:
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模塊;
13)Nginx虛擬主機
所謂虛擬主機,在web服務器⾥是⼀個獨⽴的⽹站站點,這個站點對應獨⽴的域名(也可能是IP或端⼝),具有獨⽴的程序及資源⽬錄,可以獨⽴地對外提供服務供⽤戶訪問。
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)配置虛擬主機別名
所謂虛擬主機別名,就是虛擬主機設置除了主域名以外的⼀個域名,實現⽤戶訪問的多個域名對應同⼀個虛擬主機⽹站的功能。
以www.nginx.com 域名的虛擬主機爲例:爲其增加⼀個別名nginx.com時,出現⽹站內容和訪問www.nginxi.com 是⼀樣的,具體配置如下:
//默認配置
[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實現
————————本文到此結束,感謝閱讀————————————