1. 程式人生 > >Nginx-基礎篇

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_access_module侷限性:

    • 方法一:採用別的HTTP頭資訊控制訪問,如HTTP_X_FORWARD_FOR
    • 方法二:結合geo模組作
    • 方法三:通過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模組