Skip to content

Nginx是甚麼?

Nginx是一款高性能的Web服務器和反向代理服務器.最初由Igor Sysoev編寫,可以作為HTTP SERVER使用,也可以作為負載均衡器、HTTP緩存和反向代理服務器使用.Nginx採事件驅動的異步架構,可以支持高併發和大規模的Web流量.

TIP

底層為 linux 異步非阻塞網路I/O模型.(高併發),支持gzip壓縮. =>Web服務器,WWW服務器,HTTP服務器,web信息展示,被動式的接收到請求後,才會回應當前請求內容.

  • 3萬個tcp/ip連結下,消耗內存不到150兆

企業或服務拿Nginx來幹嗎?

  • 網頁展示
  • 提供多個域名的網頁服務
  • 提供反向代理服務
  • 提供簡單資源下載服務 (FTP)
  • 用戶行為分析

Nginx的運行架構

多進程,調用多個cpu解析用戶請求.可針對進程數量去設置cpu數量.

默認使用root用戶創建master進程,透過master再創建多個worker進程.

  • master進程

監聽 ip.port 0.0.0.0:80 被動等待用戶發來連接請求,nginx的主進程工作狀態.

用於管理資源.

  • worker進程

1.實際處理用戶發來請求

2.master根據nginx.conf裡的配置參數有幾個worker

3.用戶請求來時,worker之間會有一個競爭狀態,勝利者可以與客戶端建立連線.

4.當worker接受到用戶請求後,如需向後反向代理給後端,會經過一層層分析後返回給用戶.

Nginx的有用指令

markdown

nginx -V 可以看到詳細訊息
nginx -t 檢測nginx.conf語法
nginx -s reload 重新加載nginx.conf
nginx -s stop 停止  === kill -15 nginx
nginx #直接運行nginx,前提是當前機器沒運行nginx
ps -ef|grep nginx 命令及输出字段解析
rpm -ql nginx

Nginx語法規則

  • 配置文件由指令與指令塊構成;
  • 每條指令以 ; 分號結尾,指令與參數間以空格符號分隔;
  • 指令塊以 {} 大括號將多條指令組織在一起;
  • include 語句允許組合多個配置文件以提升可維護性;
  • 使用 # 符號添加注釋,提高可讀性;
  • 使用 $ 符號使用變量;
  • 部分指令的參數支援正則表達式;

WARNING

  • 大多數指令都有預設值,如果沒有明確設定,將使用預設值。
  • Nginx 的配置文件是順序讀取的,即後面的指令會覆蓋前面的指令。
  • 指令可以使用變量,這些變量可以是預定義的變量,也可以是自定義的變量。
  • 指令參數支援一些特殊字符,如 $、@、#、/、~ 等。這些字符在配置文件中有特殊的含義。
  • 使用 include 指令可以將其他配置文件中的指令包含到當前配置文件中,以便提高可維護性。
  • 注釋可以使用 # 或 // 符號添加。注釋可以位於行的開頭或指令的末尾,但不能位於指令的中間。
  • 部分指令的參數支援正則表達式,如 location 指令中的正則表達式用於匹配 URL 路徑。正則表達式的語法和用法與其他語言中的正則表達式相同。

Nginx的配置文件詳解

txt

#user  nobody;                         # 指定用户使用nginx
worker_processes  1;                   # nginx工作程序數量,一般與cpu核數相同

#全域設置
#error_log  logs/error.log;            # 錯誤日誌目錄
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;            # nginx的pid存放目錄


#全域設置
events {
    use epoll;     # 使用epoll的I/O模型(如果你未定義Nginx如何使用,會自動分配最合適的)
    worker_connections 1024;   # 每個程序允許的最大併發數量
}
#核心HTTP部屬功能 
http {
    # 配置使用最多最頻繁的部分
    # 設置日誌
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;   # Nginx訪問日誌位置

    sendfile            on;   # 开启高效傳輸模式
    tcp_nopush          on;   # 減少網路報文數量
    tcp_nodelay         on;
    keepalive_timeout   65;   # 保持連接的時間,單位秒
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;      # 文件拓展名與類型映射表
    default_type        application/octet-stream;   # 默認文件類型

    include /etc/nginx/conf.d/*.conf;   # 加載子配置項
    
    server {

    listen       80;       # 配置監聽的端口
    charset      utf-8; #支持中文參數
    server_name  localhost;    # 配置的域名
    
    location / {

      root   /usr/share/nginx/html;  # 網站根目錄
      index  index.html index.htm;   # 默認首頁
      deny 172.168.22.11;   # 禁止訪問的ip地址,可以為all
      allow 172.168.33.44; # 允许訪問的ip地址,可以為all
      
    }
    
    error_page 500 502 503 504 /50x.html;  # 默認50x對應的訪問頁面
    error_page 400 404 error.html;   # 同上
    }

# 第二個虛擬主機
    
server { 
    }
}

使用上遇到的問題

部屬此部落格時,因為較不熟悉Nginx的部屬配置,發現reload網頁時就會發生框架啟動失敗的問題,原本以為是自己的Docker進入點寫錯,後來詢問後端朋友,表示設定並未出錯,詢問了網站部屬方的工程師後,發現只是一個location刷新空白的導頁錯誤= =,差點沒把自己氣歪XD

以下是Vue的範本,擷取至Nginx常用的基礎配置一文

txt

server {
  # 項目啟動port
  listen            80;
  # 域名(localhost)
  server_name       _;
  # 禁止 iframe 嵌套
  add_header        X-Frame-Options SAMEORIGIN;
  
  # 根路徑
  location / {
    # 項目目錄
    root /xxx;
    # 默認讀取文件
    index           index.html;
    # 配置 history 模式的刷新空白
    try_files       $uri $uri/ /index.html; =>導頁會錯誤,因匹配到前方路由時,便會停止匹配(QQ)
    try_files $uri $uri.html $uri/index.html /404.html; =>正確
  }
  
  # 後墜解决靜態資源找不到问题
  location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { 
    root           html/static/; =>記得要用時要修正成自己的目錄結構
  }
  
  # 圖片防盜
  location ~/static/.*\.(jpg|jpeg|png|gif|webp)$ {
    root              html;
    valid_referers    *.deeruby.com;
    if ($invalid_referer) {
      return          403;
    }
  }
  
  # 訪問限制
  location /static {
    root               html;
    # allow 允许
    allow              39.xxx.xxx.xxx;
    # deny  拒绝
    deny               all;
  }
}

參考資料

Released under the MIT License.