Nginx-基礎篇
Nginx-基礎篇
一、Nginx簡述:
- Nginx是一個
開源
且高效能
、可靠
的HTTP中介軟體、代理服務。
二、常見的HTTP服務:
- HTTPD - Apache 基金會的產品
- IIS - 微軟的產品
- GWS -Google的產品
三、Nginx特性、實現優點
原因一、IO多路複用epoll
- 什麼是IO多路複用:
- 多個描述符的I/O操作都能再一個執行緒內併發交替地順序完成,這就叫I/O多路複用,這裡的
複用
指的是複用同一個執行緒。 - epoll模型
- 1)每當FD就緒,採用系統的回撥函式之間將fd放入,效率更高。
- 2)最大連線無限制。
原因二、輕量級
- 功能模組少
- 程式碼模組化
- 易讀、容易二次開發
原因三、CPU親和(affinity)
- 是一種把CPU核心和Nginx工作程序綁方式,把每個
worker程序
固定再一個CPU
上執行,減少切換CPU和ache miss,獲得更好的效能。
原因四、sendfile
- 檔案通過核心傳遞給使用者核心空間:
- 從Nginx2.2以後通過零拷貝,靜態檔案不需要使用者核心:
四、Nginx搭建與基本引數使用
- Mainline version - 開發版
- Stable version - 穩定版 (開發使用)
- Legacy version - 歷史版本
- nginx官方網站:http://nginx.org/
基本引數使用:
安裝目錄:
-
whereis nginx
-
nginx: /usr/sbin/nginx /etc/nginx /usr/share/nginx
- etc/:主要放置一些核心的配置
路徑 | 型別 | 作用 |
---|---|---|
/etc/logrotate.d/nginx | 配置檔案 | Nginx日誌輪轉,用於logrotate服務的日誌切割 |
/etc/nginx/nginx.conf | 配置檔案 | 主要配置 |
/etc/nginx/conf.d/default.conf | 配置檔案 | 預設的配置檔案 |
/etc/nginx/conf.d | 目錄 | |
/etc/nginx/fastcgi_params | 配置檔案 | cgi配置相關、fastcgi配置 |
/etc/nginx/uwsgi_params | 配置檔案 | cgi配置相關、fastcgi配置 |
/etc/nginx/scgi_params | 配置檔案 | cgi配置相關、fastcgi配置 |
/etc/nginx/koi_utf | 配置檔案 | 編碼轉換對映檔案 |
/etc/nginx/koi_win | 配置檔案 | 編碼轉換對映檔案 |
/etc/nginx/win_utf | 配置檔案 | 編碼轉換對映檔案 |
/etc/nginx/mime.types | 配置檔案 | 設定http協議的Countent-Type與副檔名對應關係 |
/usr/sbin/nginx | 命令 | Nginx服務啟動管理的終端命令 |
/usr/sbin/nignx-debug | 命令 | Nginx服務啟動管理的終端命令 |
/var/cache/nginx | 目錄 | Nginx快取目錄 |
/var/log/nginx | 目錄 | Nginx日誌目錄 |
編輯引數:
-
nginx -v: 檢視Nginx安裝的版本號
-
nginx -V:檢視編譯相關的引數
(--with-xxx)
nginx開啟的模組
編譯選項 | 作用 |
---|---|
–prefix=/etc/nginx | nginx主目錄 |
–sbin-path=/usr/sbin/nginx | nginx執行目錄 |
–modules-path=/usr/lib64/nginx/modules | nginx模組 |
–conf-path=/etc/nginx/nginx.conf | nginx配置目錄 |
–error-log-path=/var/log/nginx/error.log | nginx錯誤日誌 |
–http-log-path=/var/log/nginx/access.log | nginx訪問日誌 |
–pid-path=/var/run/nginx.pid | nginx的PID檔案 |
–lock-path=/var/run/nginx.lock | nginx的鎖放到哪個路徑下 |
–http-client-body-temp-path=/var/cache/nginx/clinent_temp | 執行對應模組時,Nginx所保留的臨時檔案 |
–http-proxy-temp-path=/var/cache/nginx/proxy_temp | … |
–http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp | … |
–http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp | … |
–http-scgi-temp-path=/var/cache/nginx/scgi_temo | … |
–user=nginx | 設定Nginx程序啟動的使用者和使用者組 |
–group=nginx | … |
–with-cc-opt=parameters | 設定額外的引數將被新增到CFLAGS變數 |
–with-ld-opt=parameters | 設定附加的引數,連結系統庫 |
Nginx基本配置語法:
-
第一部分
系統模組
:user 設定nginx服務的系統使用使用者 worker_processes 工作程序數(一般跟伺服器的CPU保持一致就可以) error_log nginx的錯誤日誌 warn:表示nginx錯誤日誌的級別 pid nginx服務啟動時候pid -
第二部分
事件模組
:events worker_connections 每個程序最大連線數 user 工作程序數 -
第三部分
http{}
內容:http { .................. include /etc/nginx/conf.d/*.conf; server { listen 80 ; # 監聽的是80埠 server_name localhost; # 主機名或者獨立域名 location / { # 預設訪問的路徑一些配置 root /usr/share/nginx/html; index index.html index.html; } # 下面就是訪問錯誤頁面 error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; # 存放在系統的路徑下面 } } }
HTTP請求:
- request - 包括
請求行,請求頭部,請求資料
- response - 包括
狀態行、訊息報頭、響應正文
五、Nginx日誌型別:
error.log
- 記錄nginx錯誤的狀態
access_log
-
記錄http請求訪問的狀態,分析客戶每一回的訪問,行為的請求
log_format main '$remote_addr(客戶端地址) - $remote_user(http客戶端請求的認證名) [$time_local](nginx時間) "$request(請求行)" ' '$status(response返回的狀態) $body_bytes_sent(服務端返回給客戶端body資訊的大小) "$http_referer(上一級頁面的url地址)" ' '"$http_user_agent(客戶端用什麼來訪問)" "$http_x_forwarded_for(攜帶請求的資訊)"'; access_log /var/log/nginx/access.log main; # http請求訪問的狀態, main就是名字(跟log_format後面名字相同 ), log_format後面的格式(請求的格式),會打入到access.log裡面
-
HTTP請求變數 -arg_PARAMETER、http_HEDER(request裡面的heder)、sent_http_HEADER(response裡面的heder)
再main
後面新增$http_user_agent'
: 把大寫變成小寫
把-
變成_
-
內建變數 - Nginx內建的
- 去官網看
-
自定義變數 - 自己定義
六、Nginx模組講解:
Nginx官方模組:
- nginx -V:檢視編輯的引數。
--with--xxx
就是開啟的模組
編譯選項 | 作用 |
---|---|
–with-http_stub_status_module | Nginx的客戶端狀態 |
location /my {
stub_status;
}
# 輸入127.0.0.1/my
-
random_index_module:
- 語法:
- Syntax:random_index on | off
- Default:random_index off ;
- Context:location;
編譯選項 作用 –with-http_random_index_module 目錄中選擇一個隨機主頁 location / { root /opt/app/code; random_index on; # index index.html index.htm; } # 再/opt/app/code/ 有三個html檔案, 當訪問/ 的時候出隨機出現下面這三個html(注意如果html是隱藏檔案的話,識別不了)
- 語法:
-
http_sub_module模組:
編輯選項 作用 –with-http_sub_module HTTP內容替換 -
語法:
-
Syntax: sub_filter string replacement;
-
Default:-
-
Context:http, server, location
location / { root /opt/app/code; index index.html index.htm; sub_filter '<a>json' '<a>JSON'; } # 再root /opt/app/code 新建立sub.html 檔案就是下面的栗子 替換<a>json 變成<a>JSON
<html> <head> <mate charset="utf-8"> <title>heihei</title> </head> <a>json</a> <a>at</a> <a>heihei</a> <a>at</a> <a>json</a> </body> </html>
# 再網頁上輸入127.0.0.1/sub.html JSON at heihei at json # 代表已經替換成功了 可是發現一個檔案就是有兩個json 只是替換了一個
-
-
語法(主要用於cache):
- Syntax: sub_filter_last_modified on|off;
- Default:sub_filter_last_moduified off;
- Context:http, server , location
-
語法(匹配所有html程式碼中如果是on就匹配第一個,如果是off匹配所有的):
-
Syntax: sub_filter_once on| off;
-
Default: sub_filter_once or;
-
Context: http ,server ,location
location / { root /opt/app/code; index index.html index.htm; sub_filter '<a>json' '<a>JSON'; sub_filter_once off; # 新增這個配置項,再重新開啟瀏覽器(127.0.0.1/sub.html) } # 就會出現JSON at heihei at JSON 都已經完成了替換
-
-
Nginx第三方模組:
七、Nginx的請求限制:
HTTP協議的連線與請求:
-
HTTP請求建立再一次TCP連線基礎上
-
一次TCP請求至少產生一次HTTP請求
- 圖表:
HTTP協議請求 連線關係 HTTP1.0 TCP不能複用 HTTP1.1 順序性TCP複用 HTTP2.0 多路複用TCP複用
連線頻率的限制 -limit_conn_module
-
語法:
- Syntax: limit_conn_zone key zone=name:size;
- Default:-
- Context:http
-
語法:
-
Syntax:limit_conn_zone number;
-
Default:-
-
Context: http, server , location
limit_conn_zone $binary_remote_addr zone=conn_zone:1m; # HTTP 伺服器 server { # 監聽80埠, 80埠是知名埠, 用於HTTP協議 listen 80; # 定義使用www.xx.com訪問 server_name localhost; location / { root html; index index.html index.htm; limit_conn conn_zone 1; # 指服務端,同一時刻只允許連線一個ip過來 }
-
請求頻率的限制 -limit_req_module
-
語法:
-
Syntax:limit_req_zone key zone=name:size rate=rate;
-
Default:-
-
Context:http
limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s; # 請求頻率的限制 # HTTP 伺服器 server { # 監聽80埠, 80埠是知名埠, 用於HTTP協議 listen 80; # 定義使用www.xx.com訪問 server_name localhost; location / { root /opt/app/code; index index.html index.htm; limit_req zone=req_zone; # 只能訪問一次,當再訪問403 }
-
-
語法:
-
Syntax:limit_req zone=name [burst=number], [ nodelay]
-
Defalut:-
-
Context:http, server ,location
location / { root /opt/app/code; index index.html index.htm; limit_req zone=req_zone burst=3 nodelay; # burst=3:表示客戶端訪問3次後,在一秒執行,啟到延遲作用 nodelay:就是直接返回503 }
-
八、Nginx的訪問控制:
基於IP的訪問控制 - http_access_module(允許哪些ip來訪問)
-
允許訪問語法:
-
Syntax:allow address(IP地址) | CIDR(網段進行配置) |unix:(socket) |all(所有的);
-
Default:-
-
Context:http, server , location, limit_except
location / { root html; index index.html index.htm; } location ~ ^/admin.html { root /opt/app/code; allow 192.168.37.129; # 只允許192.168.37.129訪問 deny all; # 除了上面的都不能訪問 index index.html index.htm; }
-
-
不允許訪問的語法:
-
Syntax: deny address | CIDR | unix: | all;
-
Default: -
-
Context:http , server , location, limit_except
location / { root html; index index.html index.htm; } location ~ ^/admin.html { root /opt/app/code; deny 192.168.37.129; # 不允許訪問的IP地址 allow all; # 除了deny中的IP地址以外都可以訪問 index index.html index.htm; }
-
-
http_access_module
侷限性
:
-
http_x_forwarded_for
:- http常用的一個變數
- http_x_forwarded_for =
Client IP, Proxy(1)IP(表示經過第一臺代理的時候), Proxy(2)IP.....
- http常用的一個變數
-
解決http_access_module侷限性:
- 方法一:採用別的HTTP頭資訊控制訪問,如
HTTP_X_FORWARD_FOR
- 方法二:結合
geo模組作
- 方法三:通過
HTTP自定義變數傳遞
- 方法一:採用別的HTTP頭資訊控制訪問,如
基於使用者的信任登入 - http_auth_basic_module
-
語法(前端字串認證):
- 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
-
首先我再ubuntu系統:
- 安裝
htpasswd
:apt install apache2-utils
- 再
/etc/nginx/
建立一個使用者名稱密碼檔案:- 再上級目錄下輸入 lh9就是使用者名稱,會輸入2次密碼:
htpasswd -c ./auth_conf lh9
- 檢視密碼:
- more ./auth_conf
- 安裝
-
舉個栗子(當再開啟127.0.0.1/admin.html 會有賬號密碼,輸入成功就會跳轉到這個頁面):
location ~ ^/admin.html { root /opt/app/code; auth_basic "Auth access test! input your passward!"; # 前端字串認證 auth_basic_user_file /etc/nginx/auth_conf; # 通過檔案,儲存使用者密碼資訊的檔案 index index.html index.htm; }
-
http_auth_basic_module
侷限性:-
一、使用者資訊依賴檔案方式
-
二、操作管理機械、效率低下
-
解決方案:
-
一、Nginx結合LUA實現高效驗證
-
二、Nginx和LDAP打通,利用nginx-auth-ldap模組
-
-