Welcome to Aaron Blog! 🎉

Nginx是甚麼?

Nginx是甚麼?如何設定?

Loading comments...

Nginx是甚麼?

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

企業或服務拿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的有用指令


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 語句允許組合多個配置文件以提升可維護性;
  • 使用 # 符號添加注釋,提高可讀性;
  • 使用 $ 符號使用變量;
  • 部分指令的參數支援正則表達式;

Nginx的配置文件詳解


#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常用的基礎配置一文

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;
  }
}

參考資料

Loading comments...