nginx基本配置使用

猴子愛香蕉發表於2018-11-26

nginx做為現在最流行的代理伺服器,在佔用記憶體小,效能高效,反向代理,負載均衡等方面有很大的優勢,經常被使用部署來訪問前端靜態資源以及介面層做轉發,那麼我們該怎麼開始上手nginx呢?按照下面說明一步步配置你的nginx

  1. 下載nginx

  2. 環境

    CENTOS>=7.0,位數 X64 CENTOS 7.2

  3. 關閉 iptables

    iptables命令是Linux上常用的防火牆軟體

    功能 命令
    停止防火牆 systemctl stop firewalld.service
    永久關閉防火牆 systemctl disable firewalld.service
  4. 安裝依賴

    yum  -y install gcc gcc-c++ autoconf pcre pcre-devel make automake
    yum  -y install wget httpd-tools vim
    複製程式碼
  5. 開始安裝nginx

    新建一個檔案

    vi /etc/yum.repos.d/nginx.repo
    複製程式碼

    內容輸入如下:

    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgcheck=0
    enabled=1
    複製程式碼

    其中 centos/7 根據自己執行環境配置 系統名/版本號

    下載nginx

    yum install nginx -y
    nginx -v
    nginx -V
    複製程式碼

    參考資料: nginx安裝前所需配置


nginx常用操作

  1. 檢視配置檔案和目錄

    rpm -ql nginx
    複製程式碼

    相關檔案說明:

    型別 路徑 用途
    配置檔案 /etc/logrotate.d/nginx 用於logrotate服務的日誌切割
    配置檔案 /etc/nginx /etc/nginx/nginx.conf /etc/nginx/conf.d /etc/nginx/conf.d/default.conf 主配置檔案
    配置檔案 /etc/nginx/fastcgi_params /etc/nginx/scgi_params /etc/nginx/uwsgi_params cgi配置,fastcgi配置
    配置檔案 /etc/nginx/koi-utf /etc/nginx/koi-win /etc/nginx/win-utf 編碼轉換對映轉化檔案
    配置檔案 /etc/nginx/mime.types 設定http協議的Content-Type與副檔名對應關係
    配置檔案 /usr/lib/systemd/system/nginx-debug.service /usr/lib/systemd/system/nginx.service /etc/sysconfig/nginx /etc/sysconfig/nginx-debug 用於配置系統守護程式管理器管理方式
    配置檔案 /etc/nginx/modules /usr/lib64/nginx/modules nginx模組目錄
    命令 /usr/share/doc/nginx-1.14.0 /usr/share/doc/nginx-1.14.0/COPYRIGHT nginx的手冊和幫助檔案
    目錄 /var/cache/nginx nginx的快取目錄
    目錄 /var/log/nginx nginx的日誌目錄
  2. 啟動和重新載入以及關閉

    systemctl restart nginx.service
    systemctl reload nginx.service
    systemctl stop nginx.service
    
    nginx -s reload
    複製程式碼

    如果在啟動的時候可能會遇到下列問題:

    1. 埠被佔用;
    Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] still could not bind
    
    複製程式碼

    可以先檢視程式,再殺死對應程式

    netstat -ntpl
    
    kill 程式號
    複製程式碼
  3. 配置nginx

/etc/nginx/nginx.conf

檢視日誌命令 tailf -f log目錄
複製程式碼
  user  nginx;   設定nginx服務的系統使用使用者  
  worker_processes  1;  工作程式數,一般和CPU數量相同 

  error_log  /var/log/nginx/error.log warn;   nginx的錯誤日誌  
  pid        /var/run/nginx.pid;   nginx服務啟動時的pid

  events {
      worker_connections  1024;每個程式允許的最大連線數 10000
  }

  http {
      include       /etc/nginx/mime.types;//檔案字尾和型別型別的對應關係
      default_type  application/octet-stream;//預設content-type

      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;//預設訪問日誌 日誌格式與log_format main 對應

      sendfile        on;//啟用sendfile
      #tcp_nopush     on;//懶傳送 客戶端請求資料不會每次都時時相應 讓資料塞滿一次性傳送給客戶端(多用於下載、斷點 續傳)
      #tcp_nodelay on; // 預設開啟 與nopush互斥 提高實時請求響應效率

      keepalive_timeout  65;//超時時間是65秒

      #gzip  on;gzip壓縮

      include /etc/nginx/conf.d/*.conf;//包含的子配置檔案
  }
複製程式碼

日誌型別說明

型別 描述
access_log 訪問日誌
error.log 錯誤日誌
log_format 日誌格式

本身內建的一些變數

  • http請求相關變數
名稱 含義 例子
arg_PARAMETER 請求引數 $arg_name
http_HEADER 請求頭 $http_referer
sent_http_HEADER 響應頭 sent_http_cookie
  • 內建變數
名稱 含義
$remote_addr 客戶端地址
$remote_user 客戶端使用者名稱稱
$time_local 訪問時間和時區
$request 請求的URI和HTTP協議
$http_host 請求地址,即瀏覽器中你輸入的地址(IP或域名)
$status HTTP請求狀態
$body_bytes_sent 傳送給客戶端檔案內容大小

預設配置 /etc/default.conf

  server {
      listen       80;
      # 用域名方式訪問的地址
      server_name  localhost;  

      #charset koi8-r; //編碼
      #access_log  /var/log/nginx/host.access.log  main;  //訪問日誌檔案和名稱
      
      # 代理
      location / {
          proxy_pass http://localhost:3000
      }


      # 轉發請求靜態資源(js、css)規則
      location ~ .*\.(html|js|css)$ {
          # CORS
          add_header Access-Control-Allow-Origin *;
          add_header Access-Control-Allow-Methods GET,POST,DELETE;
          add_header Access-Control-Allow-Headers Content-Type;
          # 預設帶上客戶端cookie
          add_header Access-Control-Allow-Credentials true;
          # 快取1h
          expires 1h;
          # 開啟gzip
          gzip on;
          # gzip壓縮HTTP版本號 一般是1.1
          gzip_http_version 1.1;
          # gzip壓縮等級 越大壓縮率越高 1-9
          gzip_comp_level 2;
          # 預設不指定不會快取css資源 需要指定text/css型別
          gzip_types application/javascript text/css;
          # 資源目錄
          root /data/html;
      }

      # 設定圖片請求規則
      location ~ .*\.(gif|png|jpg|webp)$ {
          expires 1h;
          gzip on;
          gzip_http_version 1.1;
          gzip_comp_level 3;
          gzip_types image/jpeg image/png image/gif image/webp;
          ## 防盜鏈
          valid_referers none blocked xx.xxx.xxx.xx;
          if ($invalid_referer) {
              return 403;
          }
          # 資源目錄
          root /data/html;
      }

      location ~ ^/download {
          # 預設先查詢當前目錄下的字尾為.gz檔案 有直接返回給客戶端 不需要再壓縮
          # linux下執行gzip 檔名會生成壓縮gz檔案
          # url最直接訪問該檔案路徑就會自動啟動下載該資源
          gzip_static on; 
          tcp_nopush on;  
          root /data/download;
      }

      location / {
          root   /usr/share/nginx/html;  //靜態檔案根目錄
          index  index.html index.htm;  //首頁的索引檔案
      }

      #error_page  404              /404.html;  //指定錯誤頁面

      # redirect server error pages to the static page /50x.html
      # 把後臺錯誤重定向到靜態的50x.html頁面
      error_page   500 502 503 504  /50x.html; 
      location = /50x.html {
          root   /usr/share/nginx/html;
      }

      # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
      # 把PHP指令碼9000埠上監聽的FastCGI服務
      #location ~ \.php$ {
      #    root           html;
      #    fastcgi_pass   127.0.0.1:9000;
      #    fastcgi_index  index.php;
      #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
      #    include        fastcgi_params;
      #}

      # 不允許訪問.htaccess檔案 只允許指定的ip訪問
      location ~ /\.ht {
          allow 127.0.0.1
          deny  all;
      }
  }
複製程式碼

實現負載均衡

為了解決高併發、海量資料等問題
複製程式碼

分配選項:

型別 描述
輪詢(預設) 每個請求按照時間順序逐一分配不同的後端伺服器;
ip_hash 每個請求按訪問ip的hash結果分配,這樣每個訪客固定放一個後端伺服器,可以解決session的問題;
weight(加權輪詢) 指定輪詢策略,weight和訪問比率成正比,用於後端伺服器效能不均的情況;
least_conn 最小連線數,哪個連線少就分給誰。

叢集|後端伺服器除錯狀態:

狀態 描述
down 不參與負載均衡
backup 備份的伺服器
max_fails 允許請求失敗的次數
fail_timeout 經過max_fails失敗後,服務暫停的時間
max_conts 限制最大的接收的連線數

具體案例如下:

```shell
upstream test1 {
    ip_hsah;
    server http://localhost:3000 weight=2;
    server http://localhost:4000 weight=1;
    server http://localhost:5000 down;
}

server {
    # 訪問負載均衡構造的叢集
    location / {
        # 和upstrem的name對應
        proxy_pass http://test1;
    }
}
server {
    listen 80;
    server_name www.test1.com;
    location / {
        proxy_pass http://localhost:3000;
    }
}
server {
    listen 80;
    server_name www.test2.com;
    location / {
        proxy_pass http://localhost:4000;
    }
}
 server {
    listen 80;
    server_name www.test3.com;
    location / {
        proxy_pass http://localhost:5000;
    }
}

```

訪問www.test.com通過代理到訪問www.test1.com,而訪問test1的請求被負載均衡按照策略訪問test1或者test2
複製程式碼

代理

  • 反向代理

反向代理

對客戶端只有一個暴露的地址,內部對客戶端是一個黑盒。

location ~ ^/api {
      proxy_pass http://127.0.0.1:3000;
}
複製程式碼
  • 正向代理

正向代理

管理客戶端的發出請求,並代理客戶端去請求實際訪問地址。

location / {
    proxy_pass http://$http_host$request_uri;
}
複製程式碼

參考資料:

相關文章