本節索引:
一、Nginx介紹
二、Nginx服務配置
三、Web服務常見功能及配置
一、Nginx介紹
Nginx:engine X ,2002年,開源,商業版
Nginx是免費,開源,高性能的HTTP和反向代理服務器,郵件代理服務器,通
用TCP/UDP代理服務器
解決C10K問題(10K Connections)
二次開發版:
Tengine, OpenResty(章亦春)
特性:
模塊化設計,較好的擴展性
高可靠性
支持熱部署:不停機更新配置文件,升級版本,更換日志文件
低內存消耗:10000個keep-alive連接模式下的非活動連接,僅需2.5M內存
event-driven,aio,mmap,sendfile
基本功能:
靜態資源的web服務器
http協議反向代理服務器
pop3/imap4協議反向代理服務器
FastCGI(LNMP),uWSGI(python)等協議
模塊化(非DSO),如zip,SSL模塊
web服務相關的功能:
虛擬主機(server)
支持 keep-alive 和管道連接
訪問日志(支持基于日志緩沖提高其性能)
url rewirte
路徑別名
基于IP及用戶的訪問控制
支持速率限制及并發數限制
重新配置和在線升級而無須中斷客戶的工作進程
Memcached的GET 接口
為什么選擇Nginx?
Nginx 是一個高性能的Web和反向代理服務器, 它具有有很多非常優越的特性:作為 Web 服務器:相比
Apache,Nginx 使用更少的資源,支持更多的并發連接,體現更高的效率,這點使 Nginx尤其受到虛擬主
機提供商的歡迎。能夠支持50000個并發連接數的響應,Nginx選擇了epoll作為開發模型.
作為負載均衡服務器:Nginx 既可以在內部直接支持Rails 和 PHP,也可以支持作為 HTTP代理服務器 對
外進行服務。Nginx 用 C 編寫, 不論是系統資源開銷還是 CPU 使用效率都比Perlbal 要好的多。
作為郵件代理服務器: Nginx 同時也是一個非常優秀的郵件代理服務器(最早開發這個產品的目的之一也是
作為郵件代理服務器),Last.fm 描述了成功并且美妙的使用經驗。
Nginx 安裝非常的簡單,配置文件 非常簡潔(還能夠支持perl語法),Bugs非常少的服務器:Nginx 啟動特
別容易,并且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟動。你還能夠在 不間斷服務
的情況下進行軟件版本的升級。
Nginx程序架構
Nginx程序架構:
master/worker結構
一個master進程:
負載加載和分析配置文件、管理worker進程、平滑升級
一個或多個worker進程
處理并響應用戶請求
緩存相關的進程:
cache loader:載入緩存對象
cache manager:管理緩存對象
高度模塊化
nginx高度模塊化,但其模塊早期不支持DSO機制;1.9.11版本支持動態裝載和
卸載
模塊分類:
核心模塊:core module
標準模塊:
HTTP 模塊: ngx_http_*
HTTP Core modules 默認功能
HTTP Optional modules 需編譯時指定
Mail 模塊 ngx_mail_*
Stream 模塊 ngx_stream_*
第三方模塊
二、Nginx服務配置
配置文件的組成部分:
主配置文件:nginx.conf
子配置文件:include conf.d/*.conf
fastcgi, uwsgi,scgi等協議相關的配置文件
mime.types:支持的mime類型
主配置文件的配置指令:
directive value [value2 …];
注意:
(1) 指令必須以分號結尾
(2) 支持使用配置變量
內建變量:由Nginx模塊引入,可直接引用
自定義變量:由用戶使用set命令定義
set variable_name value;
引用變量:$variable_name
主配置文件結構:
主配置文件結構:四部分組成
main block:主配置段,即全局配置段,對http,mail都有效
event {
…
} ????????#事件驅動相關的配置
http {
…
} ????????#http/https協議相關配置段
mail {
…
} ????????#mail協議相關配置段
stream {
…
}???????? # stream服務器相關配置段
http協議相關的配置結構
三、Web服務常見功能及配置
(一)性能優化相關的配置:
1、worker_processes number | auto
worker進程的數量;通常應該為當前主機的cpu的物理核心數
2、worker_cpu_affinity cpumask …
worker_cpu_affinity auto [cpumask] 提高緩存命中率
CPU MASK: 00000001:0號CPU
00000010:1號CPU
10000000:8號CPU
worker_cpu_affinity 0001 0010 0100 1000;
worker_cpu_affinity 0101 1010;
3、worker_priority number
指定worker進程的nice值,設定worker進程優先級:[-20,20]
4、worker_rlimit_nofile number
worker進程所能夠打開的文件數量上限,如65535
示例:修改worker進程數量
示例:設置NICE優先級
?
變為前臺執行
daemon on|off
是否以守護進程方式運行nignx,默認是守護進程方式,用于測試環境
以守護方式(前臺執行)運行
EVENT語句塊
每個worker支持的最大連接1024,生成環境應適當調大
work_connections *Cpu個數= worker_rlimit_nofile number
?
?
(二)虛擬主機配置
定義一個專門存放虛擬主機的目錄:
配置一個虛擬主機
server {
listen address[:PORT]|PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT;
}
vim a.com.conf
vim b.com.conf
server {
???????? ?? listen 8080
???????? ?? server_name www.b.com
}
?
?
(三)改變默認指向:default_server
vim c.com.conf
要注意將主配置文件中的defaults_server刪掉,否則nginx服務將無法正常啟動
?
?
?
?(四)支持通配符寫法
?
匹配優先級機制從高到低:
(1) 首先是字符串精確匹配 如:www.magedu.com
(2) 左側*通配符 如:*.magedu.com
(3) 右側*通配符 如:www.magedu.*
(4) 正則表達式 如: ~^.*\.magedu\.com$
(5) default_server
?
?
(五)隱藏Nginx版本
server_tokens on | off | build | string
是否在響應報文的Server首部顯示nginx版本
vim /etc/nginx/conf/nginx.conf
再次訪問
?
?(五)軟連接指向
?
?
?(六)針對特定文件指定存放位置
location [ = | ~ | ~* | ^~ ] uri { … }
location @name { … }
在一個server中location配置段可存在多個,用于實現從uri到文件系統的路
徑映射;ngnix會根據用戶請求的URI來檢查定義的所有location,并找出一個最
佳匹配,而后應用其配置
示例:
server {…
server_name www.magedu.com;
location /images/ {
root /data/imgs/;
}
}
http://www.magedu.com/images/logo.jpg
–> /data/imgs/images/logo.jpg
?
示例:
?
?
?
(七)定制錯誤頁面
echo ‘<h1>NO FOUND PAGE</h1>’ > /data/sitea/error/404.html
客戶端訪問測試:
?
?
?
?(八)避免流氓瀏覽器404劫持
error_page code … [=[response]] uri;
模塊:ngx_http_core_module
定義錯誤頁,以指定的響應狀態碼進行響應
可用位置:http, server, location, if in
location
error_page 404 /404.html
error_page 404 =200 /404.html
修改配置文件
再次訪問:
修改404頁面到指定默認頁面
?
keepalive_timeout timeout [header_timeout];
設定保持連接超時時長,0表示禁止長連接,默認為75s
?
keepalive_requests number;
在一次長連接上所允許請求的資源的最大數量
默認為100
?
?
(九)除了管理員域其他主機無法使用GET以外的其他方法
?
?
(十)實現基于ip的訪問控制功能
ngx_http_access_module模塊
1、allow address | CIDR | unix: | all;
2、deny address | CIDR | unix: | all;
http, server, location, limit_except
自上而下檢查,一旦匹配,將生效,條件嚴格的置前
示例:
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
?
?
?
(十一)實現基于用戶的訪問控制:
ngx_http_auth_basic_module模塊
實現基于用戶的訪問控制,使用basic機制進行用戶認證
1、auth_basic string | off;
2、auth_basic_user_file file;
location /admin/ {
auth_basic “Admin Area”;
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
用戶口令文件:
1、明文文本:格式name:password:comment
2、加密文本:由htpasswd命令實現
httpd-tools所提供
?
示例:
cd /etc/nginx/conf.d/vhost
htpasswd -cm nginxuser httpuser1
htpasswd -m nginxuser httpuser2
修改配置
針對整個網站生效
針對特定目錄生效
http://www.a.com/admin/
?
?
?
(十二)Nginx狀態頁
ngx_http_stub_status_module模塊
功能:用于輸出nginx的基本狀態信息
輸出信息示例:
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
上面三個數字分別對應accepts,handled,requests三個值
Reading: 6 Writing: 179 Waiting: 106
示例:
瀏覽器訪問http://192.168.30.10/status
相關參數說明:
Active connections:當前狀態,活動狀態的連接數
accepts:統計總值,已經接受的客戶端請求的總數
handled:統計總值,已經處理完成的客戶端請求的總數
requests:統計總值,客戶端發來的總的請求數
Reading:當前狀態,正在讀取客戶端請求報文首部的連接的連接數
Writing:當前狀態,正在向客戶端發送響應報文過程中的連接數
Waiting:當前狀態,正在等待客戶端發出請求的空閑連接數
(十三)日志相關設置
ngx_http_log_module模塊
指定日志格式記錄請求
1、log_format name string …;
string可以使用nginx核心模塊及其它模塊內嵌的變量
2、access_log path [format [buffer=size] [gzip[=level]] [flush=time]
[if=condition]];
access_log off;
訪問日志文件路徑,格式及相關的緩沖的配置
buffer=size
flush=time
3、open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
緩存各日志文件相關的元數據信息
max:緩存的最大文件描述符數量
min_uses:在inactive指定的時長內訪問大于等于此值方可被當作活動項
inactive:非活動時長
valid:驗證緩存中各緩存項是否為活動項的時間間隔
示例:自定義日志
系統默認:
自定義一個日志:
添加到access_log(可添加到任何語句塊中)
測試日志
(十四)實現Nginx的SSL加密https
ngx_http_ssl_module模塊:
1、ssl on | off;
為指定虛擬機啟用HTTPS protocol, 建議用listen指令代替
2、ssl_certificate file;
當前虛擬主機使用PEM格式的證書文件
3、ssl_certificate_key file;
當前虛擬主機上與其證書匹配的私鑰文件
4、ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];支持ssl協議版本,默
認為后三個
5、ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
none: 通知客戶端支持ssl session cache,但實際不支持
builtin[:size]:使用OpenSSL內建緩存,為每worker進程私有
[shared:name:size]:在各worker之間使用一個共享的緩存
6、ssl_session_timeout time;
客戶端連接可以復用ssl session cache中緩存的ssl參數的有效時長,默認5m
示例:
server {
listen 443 ssl;
server_name www.magedu.com;
root /vhosts/ssl/htdocs;
ssl on;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
}
檢查語法:
nginx -t
驗證https
(十五)實現NGINX搭建多個HTTPS網站
修改配置文件
驗證https:
(十六)rewite重寫
ngx_http_rewrite_module模塊:
The ngx_http_rewrite_module module is used to change request URI
using PCRE regular expressions, return redirects, and conditionally select
configurations.
將用戶請求的URI基于PCRE regex所描述的模式進行檢查,而后完成重定向替換
1、rewrite regex replacement [flag]
將用戶請求的URI基于regex所描述的模式進行檢查,匹配到時將其替換為
replacement指定的新的URI
注意:如果在同一級配置塊中存在多個rewrite規則,那么會自下而下逐個
檢查;被某條件規則替換完成后,會重新一輪的替換檢查
隱含有循環機制,但不超過10次;如果超過,提示500響應碼,[flag]所表示
的標志位用于控制此循環機制
如果replacement是以http://或https://開頭,則替換結果會直接以重向返
回給客戶端, 即永久重定向301
[flag]:
last:重寫完成后停止對當前URI在當前location中后續的其它重寫操作,
而后對新的URI啟動新一輪重寫檢查;提前重啟新一輪循環,不建議在location中
使用
break:重寫完成后停止對當前URI在當前location中后續的其它重寫操作,
而后直接跳轉至重寫規則配置塊之后的其它配置;結束循環,建議在location中使
用
redirect:臨時重定向,重寫完成后以臨時重定向方式直接返回重寫后生成
的新URI給客戶端,由客戶端重新發起請求;使用相對路徑,或者http://或https://
開頭,狀態碼:302
permanent:?重寫完成后以永久重定向方式直接返回重寫后生成的新URI給
客戶端,由客戶端重新發起請求,狀態碼:301
2、return
return code [text];
return code URL;
return URL;
停止處理,并返回給客戶端指定的響應碼
3、rewrite_log on | off;
是否開啟重寫日志, 發送至error_log(notice level)
4、set $variable value;
用戶自定義變量
注意:變量定義和調用都要以$開頭
5、if (condition) { … }
條件滿足時,執行配置塊中的配置指令;server, location
condition:
比較操作符:
= 相同 != 不同
~:模式匹配,區分字符大小寫
~*:模式匹配,不區分字符大小寫
!~:模式不匹配,區分字符大小寫
!~*:模式不匹配,不區分字符大小寫
文件及目錄存在性判斷:
-e, !-e 存在(包括文件,目錄,軟鏈接)
-f, !-f 文件 -d, !-d 目錄 -x, !-x 執行
?
示例:
www.a.com/images/a.jpg? –>? www.a.com/media/images/a.jpg
相關配置:
rewrite? ^(images/.*)$? /media/$1
示例:
www.a.com/bbs? –>? www.a.com/forum
redirect模式:302
permanent模式
(十七)實現http自動跳轉https
(十八)實現將http與https寫入同一個虛擬機
break模式:可避免死循環
(十九)實現自定義響應碼
(二十)Nginx防盜鏈
ngx_http_referer_module模塊:
功能:用來阻止Referer首部無有效值的請求訪問,可防止盜鏈
格式:valid_referers none|blocked|server_names|string …;
定義referer首部的合法可用值,不能匹配的將是非法值
none:請求報文首部沒有referer首部
blocked:請求報文有referer首部,但無有效值
server_names:參數,其可以有值作為主機名或主機名模式
arbitrary_string:任意字符串,但可使用*作通配符
regular expression:被指定的正則表達式模式匹配到的字符串,要使用~開頭
開啟防盜鏈功能后,盜鏈圖片將無法正常顯示
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/102626