1. 程式人生 > >nginx簡單配置上手

nginx簡單配置上手

nginx是一個開源且高效能、可靠的HTTP中介軟體和代理伺服器

學習環境

作業系統

CENTOS>=7.0,位數 X64 CENTOS 7.2

環境確認

關閉 iptables

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

功能 命令
停止防火牆 systemctl stop firewalld.service
永久關閉防火牆 systemctl disable firewalld.service

確認停用 selinux

  • 安全增強型 Linux(Security-Enhanced Linux)簡稱 SELinux,它是一個 Linux 核心模組,也是 Linux 的一個安全子系統。
  • SELinux 主要作用就是最大限度地減小系統中服務程序可訪問的資源(最小許可權原則)。 | 功能 | 命令 | | :------- | :---------------------------------------------------------- | | 檢查狀態 | getenforce | | 檢查狀態 | /usr/sbin/sestatus -v | | 臨時關閉 | setenforce 0 | | 永久關閉 | /etc/selinux/config SELINUX=enforcing改為SELINUX=disabled |

安裝依賴模組

yum  -y install gcc gcc-c++ autoconf pcre pcre-devel make automake
yum  -y install wget httpd-tools vim

nginx的優勢

  • IO多路複用 多個描述符的IO操作都能在一個執行緒裡併發交替順序完成,複用執行緒
    • select 線性遍歷檔案描述符列表 1. 效率低下 2.最多隻能有1024
    • epoll 每當fd就緒,採用系統回撥函式將fd放入 1.效率高 2.沒有1024限制
  • CPU親和 一種把CPU核心和Nginx工作程序繫結方式,把每個worker程序固定在一個CPU上執行,減少切換CPU和提交快取命中率,獲得更好的效能。
  • sendfile 零拷貝傳輸模式 ![usercore]

usercore

nginx安裝

版本分類

  • Mainline version 開發版
  • Stable version 穩定版
  • Legacy versions 歷史版本

下載地址

CentOS下YUM安裝

/etc/yum.repos.d/nginx.repo

// 新建檔案需要配置的內容
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

// 一下是執行命令
yum install nginx -y
nginx -v
nginx -V
// baseurl: centos 作業系統, 7 操走胸痛版本

目錄

安裝目錄

檢視配置檔案和目錄

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的日誌目錄

編譯引數

安裝目錄和路徑

--prefix=/etc/nginx  // 按照目錄
--sbin-path=/usr/sbin/nginx // 可執行檔案目錄
--modules-path=/usr/lib64/nginx/modules // 模組的存放路徑
--conf-path=/etc/nginx/nginx.conf // 配置檔案存放路徑
--error-log-path=/var/log/nginx/error.log // 錯誤日誌路徑
--http-log-path=/var/log/nginx/access.log // 訪問日誌路徑
--pid-path=/var/run/nginx.pid // pid路徑
--lock-path=/var/run/nginx.lock // 鎖檔案路徑

執行對應模組時,nginx所保留的臨時性檔案

--http-client-body-temp-path=/var/cache/nginx/client_temp // 
--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_temp 

設定nginx程序啟動的使用者和使用者組

--user=nginx 
--group=nginx 

設定額外的引數將被新增到CFLAGS變數

--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong 

設定附加的引數,連結系統庫

--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'

其它引數

--with-compat 
--with-file-aio 
--with-threads 
--with-http_addition_module 
--with-http_auth_request_module 
--with-http_dav_module 
--with-http_flv_module 
--with-http_gunzip_module 
--with-http_gzip_static_module 
--with-http_mp4_module 
--with-http_random_index_module 
--with-http_realip_module 
--with-http_secure_link_module 
--with-http_slice_module 
--with-http_ssl_module 
--with-http_stub_status_module 
--with-http_sub_module 
--with-http_v2_module 
--with-mail 
--with-mail_ssl_module 
--with-stream 
--with-stream_realip_module 
--with-stream_ssl_module 
--with-stream_ssl_preread_module 
--param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' 

配置檔案

  • /etc/nginx/nginx.conf
  • /etc/nginx/conf.d/*.conf /etc/nginx/conf.d/default.conf

全域性和服務配置

分類 配置項 作用
全域性 user 設定nginx服務的系統使用使用者
全域性 worker_processes 工作程序數,一般和CPU數量相同
全域性 error_log nginx的錯誤日誌
全域性 pid nginx服務啟動時的pid

全域性和服務配置

分類 配置項 作用
events worker_connections 每個程序允許的最大連線數 10000
events use 指定使用哪種模型(select/poll/epoll),建議讓nginx自動選擇,linux核心2.6以上一般能使用epoll,提高效能。

/etc/nginx/nginx.conf

$http_x_forwarded_for 代理無伺服器,可能會有多個

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;//預設訪問日誌

    sendfile        on;//啟用sendfile
    #tcp_nopush     on;//懶傳送

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

    #gzip  on;gzip壓縮

    include /etc/nginx/conf.d/*.conf;//包含的子配置檔案
}

default.conf

server {
    listen       80;  //監聽的埠號
    server_name  localhost;  //用域名方式訪問的地址

    #charset koi8-r; //編碼
    #access_log  /var/log/nginx/host.access.log  main;  //訪問日誌檔案和名稱

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

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    # 代理PHP指令碼到80埠上的apache伺服器
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

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

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    # 不允許訪問.htaccess檔案
    #location ~ /\.ht {
    #    deny  all;
    #}
}

啟動和重新載入

systemctl restart nginx.service
systemctl reload nginx.service
nginx -s reload

日誌型別

日誌型別

  • access_.log 訪問日誌
  • error.log 錯誤日誌

log_format

型別 用法
語法 log_format name [escape=default[json] string]
預設 log_format combined …
Context http

案例

 log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

 log_format  zfpx  '$arg_name $http_referer sent_http_date"';
 access_log  /var/log/nginx/access.log  main;    

 221.216.143.110 - - [09/Jun/2018:22:41:18 +0800] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36" "-"

HTTP請求變數

名稱 含義 例子
arg_PARAMETER 請求引數 $arg_name
http_HEADER 請求頭 $http_referer
sent_http_HEADER 響應頭 sent_http_cookie

內建變數

ngx_http_log_module log_format

名稱 含義
$remote_addr 客戶端地址
$remote_user 客戶端使用者名稱稱
$time_local 訪問時間和時區
$request 請求的URI和HTTP協議
$http_host 請求地址,即瀏覽器中你輸入的地址(IP或域名)
$status HTTP請求狀態
$body_bytes_sent 傳送給客戶端檔案內容大小

nginx實戰

靜態資源Web服務

  • 靜態資源:一般客戶端傳送請求到web伺服器,web伺服器從記憶體在取到相應的檔案,返回給客戶端,客戶端解析並渲染顯示出來。
  • 動態資源:一般客戶端請求的動態資源,先將請求交於web容器,web容器連線資料庫,資料庫處理資料之後,將內容交給web伺服器,web伺服器返回給客戶端解析渲染處理。
型別 種類
瀏覽器渲染 HTML、CSS、JS
圖片 JPEG、GIF、PNG
視訊 FLV、MPEG
下載檔案 Word、Excel

CDN

  • CDN的全稱是Content Delivery Network,即內容分發網路。
  • CDN系統能夠實時地根據網路流量和各節點的連線、負載狀況以及到使用者的距離和響應時間等綜合資訊將使用者的請求重新導向離使用者最近的服務節點上。其目的是使使用者可就近取得所需內容,解決 Internet網路擁擠的狀況,提高使用者訪問網站的響應速度。

cdn

配置語法

sendfile

不經過使用者核心傳送檔案

型別 種類
語法 sendfile on / off
預設 sendfile off;
上下文 http,server,location,if in location
tcp_nopush

在sendfile開啟的情況 下,提高網路包的傳輸效率

型別 種類
語法 tcp_nopush on / off
預設 tcp_nopush off;
上下文 http,server,location
tcp_nodelay

在keepalive連線下,提高網路包的傳輸實時性

型別 種類
語法 tcp_nodelay on / off
預設 tcp_nodelay on;
上下文 http,server,location
gzip

壓縮檔案可以節約頻寬和提高網路傳輸效率

型別 種類
語法 gzip on / off
預設 gzip off;
上下文 http,server,location
gzip_comp_level

壓縮比率越高,檔案被壓縮的體積越小

型別 種類
語法 gzip_comp_level level
預設 gzip_comp_level 1;
上下文 http,server,location
gzip_http_version

壓縮HTTP版本

型別 種類
語法 gzip_http_version 1.0/1.1
預設 gzip_http_version 1.1;
上下文 http,server,location
http_gzip-static_module

先找磁碟上找同名的.gz這個檔案是否存在,節約CPU的壓縮時間和效能損耗

型別 種類
語法 gzip_static on/off
預設 gzip_static off;
上下文 http,server,location
location ~ .*\.(jpg|png|gif)$ {
        gzip off;
        gzip_http_version 1.1;
       gzip_comp_level 3;
       gzip_types image/jpeg image/png image/gif;
        root /data/images;
    }

    location ~ .*\.(html|js|css)$ {
        gzip on;
        gzip_min_length 1k;
        gzip_http_version 1.1;
        gzip_comp_level 9;
        gzip_types  text/css application/javascript;
        root /data/html;
    }

    location ~ ^/download {
        gzip_static on;
        tcp_nopush on; 
        root /data/download;
    }

瀏覽器快取

校驗本地快取是否過期

型別 種類
檢驗是否過期 Expires、Cache-Control(max-age)
Etag Etag
Last-Modified Last-Modified

expires

新增Cache-Control、Expires頭

型別 種類
語法 expires time
預設 expires off;
上下文 http,server,location
location ~ .*\.(jpg|png|gif)$ {
        expires 24h;
}

跨域

型別 種類
語法 add_header name value
預設 add_header --;
上下文 http,server,location
location ~ .*\.json$ {
        add_header Access-Control-Allow-Origin http://localhost:3000;
        add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
        root /data/json;
    }
let xhr = new XMLHttpRequest();
        xhr.open('GET', 'http://47.104.184.134/users.json', true);
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4 && xhr.status == 200) {
                console.log(xhr.responseText);
            }
        }
xhr.send();

防盜鏈

  • 防止網站資源被盜用
  • 保證資訊保安
  • 防止流量過量
  • 區別哪些請求是非正常的使用者請求
  • 使用http_refer防盜鏈
型別 種類 不規則來源
語法 valid_referers none block server_names string…
預設 -
上下文 server,location
location ~ .*\.(jpg|png|gif)$ {
        expires 1h;
        gzip off;
        gzip_http_version 1.1;
        gzip_comp_level 3;
        gzip_types image/jpeg image/png image/gif;
+        valid_referers none blocked 47.104.184.134;
+        if ($invalid_referer) {
+           return 403;
+        }
        root /data/images;
    }

代理服務

配置

型別 種類
語法 proxy_pass URL
預設 -
上下文 server,location

反向代理

反向代理的物件的服務端 fanproxy

resolver 8.8.8.8;
location ~ ^/api {
      proxy_pass http://127.0.0.1:3000;
}

正向代理

正向代理的物件是客戶端 positiveproxy

location / {
        proxy_pass http://$http_host$request_uri;
    }
// $request_uri 請求的url
// $http_host 請求的域名

負載均衡

nginxbalance

  • 使用叢集是網站解決高併發、海量資料問題的常用手段。
  • 當一臺伺服器的處理能力、儲存空間不足時,不要企圖去換更強大的伺服器,對大型網站而言,不管多麼強大的伺服器,都滿足不了網站持續增長的業務需求。
  • 這種情況下,更恰當的做法是增加一臺伺服器分擔原有伺服器的訪問及儲存壓力。通過負載均衡排程伺服器,將來自瀏覽器的訪問請求分發到應用伺服器叢集中的任何一臺伺服器上,如果有更多的使用者,就在叢集中加入更多的應用伺服器,使應用伺服器的負載壓力不再成為整個網站的瓶頸。

upstream

型別 種類
語法 upstream name {}
預設 -
上下文 http
// 配置伺服器叢集
// 要放在server外邊
upstream serverGroup {
  ip_hash;
  server localhost:3000;
  server localhost:4000;
  server localhost:5000;
}

// serverGroup 叢集的名字
// 配置代理,讓serverGroup處理服務
server {
    location / {
        proxy_pass http://serverGroup;
    }

後端伺服器除錯狀態

狀態 描述
down 不參與負載均衡
backup 備份的伺服器
max_fails 允許請求失敗的次數
fail_timeout 經過max_fails失敗後,服務暫停的時間
max_conns 限制最大的接收的連線數
upstream zfpx {
  server localhost:3000 down;
  server localhost:4000 backup;
  server localhost:5000 max_fails=1 fail_timeout=10s;
}

分配方式

型別 種類
輪詢(預設) 每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
weight(加權輪詢) 指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。
ip_hash 每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
url_hash(第三方) 按訪問的URL地址來分配 請求,每個URL都定向到同一個後端 伺服器上(快取)
fair(第三方) 按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
least_conn 最小連線數,哪個連線少就分給誰
自定義hash hash自定義key

快取

nginx代理快取

proxy_cache

http{  
    proxy_cache_path /data/nginx/tmp-test levels=1:2 keys_zone=tmp-test:100m inactive=7d max_size=1000g;  
}  
  • proxy_cache_path 快取檔案路徑
  • levels 設定快取檔案目錄層次;levels=1:2 表示兩級目錄
  • keys_zone 設定快取名字和共享記憶體大小
  • inactive 在指定時間內沒人訪問則被刪除
  • max_size 最大快取空間,如果快取空間滿,預設覆蓋掉快取時間最長的資源。
location /tmp-test/ {  
  proxy_cache tmp-test;  
  proxy_cache_valid  200 206 304 301 302 10d;  
  proxy_cache_key $uri;  
  proxy_set_header Host $host:$server_port;  
  proxy_set_header X-Real-IP $remote_addr;  
  proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;  
  proxy_pass http://127.0.0.1:8081/media_store.php/tmp-test/;  
}
  • proxy_cache tmp-test 使用名為tmp-test的對應快取配置
  • proxy_cache_valid 200 206 304 301 302 10d; 對httpcode為200…的快取10天
  • proxy_cache_key $uri 定義快取唯一key,通過唯一key來進行hash存取
  • proxy_set_header 自定義http header頭,用於傳送給後端真實伺服器。
  • proxy_pass 指代理後轉發的路徑,注意是否需要最後的/