Nginx(1)-建立一個靜態 Web 站點

初識Nginx

Nginx 的三個主要應用場景:javascript

  • 靜態資源服務:經過本地文件系統提供服務
  • 反向代理服務:緩存加速與負載均衡
  • API服務:OpenResty

Nginx 背景和優勢:php

互聯網的數據量快速增加、摩爾定律的性能提高以及低效的 Apache(一個鏈接對應一個進程)促使 Nginx 的出現。css

目前 Nginx 佔有率已經排名第2位

Nginx 的優勢html

  • 高併發、高性能:32核64G 內存能夠處理數千萬併發鏈接
  • 可擴展性:得益於模塊化設計
  • 高可靠性:持續不間斷運行數年
  • 熱部署:不中止服務狀況下,升級 Nginx
  • BSD 許可證

Nginx 的組成java

  • Nginx 二進制可執行文件:由各模塊源碼編譯出的一個文件
  • Nginx.conf 配置文件:控制 nginx 的行爲
  • access.log 訪問日誌:記錄每一條 http 請求信息
  • error.log 錯誤日誌:定位問題

Nginx 的版本發佈nginx

開源版本的 Nginx 中,奇數版本的 Nginx 如1.15.x 是 Mainline 主幹版本,它會有新的功能,但可能並不穩定,偶數版本如1.14.x,是Stable 穩定版本。每一個版本的 CHANGES 中,包含三部分:Feature新增功能、Bugfix 修復 bug、Change重構。c++

編譯 Nginx

安裝 Nginx 的方法主要用兩種:編譯 Nginx 或者直接安裝二進制 nginx。二進制格式的 Nginx 中模塊已經編譯,但並非每個模塊(功能)都開啓(被編譯),一些第三方模塊,一樣包含強大的功能就沒法編譯到二進制 Nginx 中。自主編譯 nginx 能夠根據本身的需求合理開啓須要編譯的模塊。web

  1. 下載 Nginx正則表達式

    下載你須要的 Nginx 版本,並解壓縮。解壓縮 Nginx 的源碼包後,包含6個目錄和5個文件vim

    • auto:有四個子目錄,用於編譯的 cc、lib庫目錄 lib、判斷操做系統的 os、types 和19個文件用於輔助 configure判斷當前系統支持哪些模塊以及特性
    • conf:示例文件,安裝成功後,會將此目錄中的內容拷貝到安裝目錄
    • configure:執行編譯前的必備動做,生成中間文件
    • contrib:提供兩個 perl 腳本和一個vim 配置文件用於高亮顯示 nginx 的配置文件,文件放置於~/.vim/中:cp -r contrib/vim/* ~/.vim/
    • html:提供兩個標準 html 文件 index.html 和50X.html
    • src:源碼目錄
  2. Configure

    獲取支持的的參數使用./configure --help,編譯時支持的參數有三類:

    • 指定 Nginx 各類文件的安裝位置;
    • 肯定開啓和關閉的模塊。使用 with 開頭的須要手動開啓,使用 without 的默認會編譯到 nginx 中,指定便可取消編譯該模塊;
    • 指定 nginx 的安裝過程當中使用的特殊參數,如 c 編譯器的路徑等。

執行./configure --prefix=/usr/local/nginx檢查系統環境是否符合知足安裝要求,並將定義好的安裝配置信息和系統環境信息寫入Makefile文件中。 Makefile 文件包含了如何編譯、啓用哪些功能、安裝路徑等信息。

在預編譯過程當中,能夠出現的錯誤大部分是由於軟件包的缺失。編譯 Nginx 須要依賴的軟件包關係有:

yum install -y gcc gcc-c++ autoconf automake make /
yum install -y pcre pcre-devel /
yum install -y zlib zlib-devel

預編譯後,會生成 objs 目錄和 Makefile 文件編譯後生成的中間文件

  1. 編譯

    執行make命令進行編譯。make命令會根據Makefile文件進行編譯。編譯工做主要是調用編譯器(如gcc)將源碼編譯爲可執行文件,一般須要一些函數庫才能產生一個完整的可執行文件。

    編譯生成的二進制文件存在於 src 目錄中,若是使用了動態模塊,編譯產生的.so 文件,會存在於 objs 目錄中。

  2. 安裝

    上面之因此沒有使用 make && make install,是由於若是是升級 nginx,則須要將二進制文件拷貝到安裝目錄中。首次安裝 nginx時,可使用make install將編譯的文件複製到指定目錄中。 屏幕快照 2019-03-16 09.55.10

    建立軟連接:sudo ln -s /usr/nginx-1.14.2/sbin/nginx /usr/bin/nginx

Nginx 的配置文件

Nginx 的配置文件中,nginx.conf 爲主配置文件,配置文件中,以#開始的行,或者是前面有若干空格或者 TAB 鍵,而後再跟#的行,都會被認爲是註釋。

Nginx 的配置文件是以 block(塊)形式組織,每一個 block 都是以一個塊名稱和一對大括號「{}」組成。block 分爲幾個層級,整個配置文件爲 main 級別,即最大層級;在 main 級別之下會有 event、http、mail 等層級,而 http 中又會包含 server block,server block 中能夠包含 location block。即塊之間是能夠嵌套的,內層 block 繼承外層 block。最基本的配置項語法格式是「配置項名 配置項值1 配置項值2 配置項值3 ... 」;

每一個層級能夠有本身的指令(Directive),例如 worker_processes 是一個main層級指令,它指定 Nginx 服務的 Worker 進程數量。有的指令只能在一個層級中配置,如worker_processes 只能存在於 main 中,而有的指令能夠存在於多個層級,在這種狀況下,子 block 會繼承 父 block 的配置,同時若是子block配置了與父block不一樣的指令,則會覆蓋掉父 block 的配置。指令的格式是「指令名 參數1 參數2 … 參數N;」,注意參數間可用任意數量空格分隔,最後要加分號。

下圖是 Nginx 配置文件的通常結構:

總結一下 Nginx 的配置語法:

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

Nginx 中時間參數的單位

時間單位 描述
ms milliseconds
s seconds
m minutes
h hours
d days
w weeks
M months(30 days)
y years(365 days)

Nginx 中空間參數的單位

空間單位 描述
不加任何單位 bytes
k/K Kilobytes
m/M Meagbytes
g/G Gigabytes

Nginx 服務運行時,須要加載幾個核心模塊和一個事件模塊,這些模塊運行時所支持的配置項稱爲基本配置;基本配置項大概分爲四類:

  • 用於調試、定位的配置項
  • 正常運行的必備配置項
  • 優化性能的配置項
  • 事件類配置項

操做 Nginx 命令行

功能 命令行
通常格式 nginx -s reload
獲取幫助 -?-h
使用指定的配置文件 -c
指定配置指令 -g
執行運行的目錄 -p
發送信號 -s
馬上中止服務 stop
優雅中止服務 quit
重載配置文件 reload
從新開始記錄日誌文件 reopen
測試配置文件語法 -t -T
打印 nginx 的版本和編譯信息 -v -v

這裏須要說明的是:在修改配置文件後,使用nginx -s reload,在不中止服務的狀況下,運行修改後的配置文件。

熱部署 nginx(升級)

  1. 備份低版本的 nginx 二進制文件cp ngnx nginx.old
  2. 將編譯好的新版本 nginx 二進制文件拷貝替換正在運行的 nginx 進程所使用的二進制文件
  3. 發送信號給舊 nginx master 進程,讓其優雅關閉進程kill -WINCH [舊 ngix mater 進程號]。當前舊 nginx master還存在的緣由是,若是新版本 nginx有問題,能夠進行版本回退。

日誌切割

  1. 將當前的日誌文件複製到系統的另一個位置
  2. 執行命令nginx -s reopen,nginx 會從新生成同名的日誌文件

實際上日誌切割會按期進行,應該使用 bash 腳原本實現,並有 crond 定時執行。

#!/bin/bash
#Rotate the Nginx logs to prevent a single logfile from consuming too much disk space.

LOGS_PATH=/usr/local/nginx/logs/history
CUR_LOGS_PATH=/usr/local/nginx/logs
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
mv ${CUR_LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
mv ${CUR_LOGS_PATH}/error.log ${LOGS_PATH}/error_${YESTERDAY}.log
#向 Nginx 主進程發送 USR1 信號。USR1 信號試從新打開日誌文件
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)

使用 Nginx 搭建一個靜態服務器

將靜態網站部署在服務器中對外提供服務,在 nginx 安裝目錄中建立一個 dlib 目錄用於存放靜態網頁

配置 nginx,修改配置文件中的 server 中的監聽端口listen爲80或8080,location 後面定義的"/"表示全部請求,指定 url的後綴與服務端文件系統路徑一一對應,有兩種用法,一種是使用 root,一種是使用 alias,如使用 alias dlib/就表示 url/後面的路徑與 dlib/後面的路徑是一一對應的。

節選配置文件:

user  simon;
...
http{
    gzip on;
    ...
    server{
        listen 8080;
        ...
        location / {
            alias dlib/;
        }
    }
}

優化:開啓壓縮

gzip  on; #開啓 gzip 壓縮
gzip_min_length 1; #壓縮的最小單位,小於1字節不壓縮
gzip_comp_level 2; #壓縮級別
gzip_types text/plain application/x-javascript text/css application/xml text/javascript applicat
ion/x-httpd-php image/jpep image/gif image/png; #針對指定類型進行壓縮

壓縮前:

壓縮後:

功能:將文件系統經過web 網頁展現

經過 ngx_http_autoindex_module ,能夠將以「/」結尾的 url 對應到相應文件系統目錄中,並列出。在 location 塊中加入「autoindex on;」便可開啓。

這裏注意的是,當打開的是首頁依然是一個web 頁面,只有 url 中繼續定義了查看靜態網站文件系統目錄中的某一目錄時,纔會將文件列出。

優化:高併發時,限制大文件的傳輸速率

在 location 塊中,設置「set $limit_rate 1k(http 模塊的內置變量);」意思是限制 nginx 每秒傳輸1字節到瀏覽器中,

定義 nginx access 日誌格式

定義日誌格式須要命名,由於會根據不一樣的場景記錄不一樣的日誌信息,nginx 默認的日誌記錄名稱爲 main,記錄了諸如客戶端 IP、客戶端名稱、時間、狀態碼等。

定義日誌,在 http 配置塊下,使用 log_format,後面定義日誌的名稱,而後使用nginx 中指定的變量定義須要記錄的日誌格式。

定義日誌存儲位置,使用 access_log,定義 access_log的位置決定了記錄日誌的範圍,也就是說,當在 server 配置塊中定義了 access_log,那麼發往server 指定的端口或者域名的請求,都會使用 access_log定義的級別和位置進行記錄。

使用 goaccess 可使日誌可視化。

總結

  1. 如何編譯、安裝、升級 Nginx
  2. 部署一個靜態網站經常使用的流程,以及 Nginx 的配置文件中相關指令的配置

參考

  1. Nginx 配置文件
  2. NGINX systemd service file
  3. systemd 添加自定義系統服務

附錄

  1. 預編譯參數

    mkdir -p /var/cache/nginx
    
    ./configure \
    --prefix=/usr/local/nginx \
    --sbin-path=/usr/sbin/nginx \
    --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 \
    --lock-path=/var/run/nginx.lock \
    --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 \
    --user=nobody \
    --group=nobody \
    --with-pcre \
    --with-http_v2_module \
    --with-http_ssl_module \
    --with-http_realip_module \
    --with-http_addition_module \
    --with-http_sub_module \
    --with-http_dav_module \
    --with-http_flv_module \
    --with-http_mp4_module \
    --with-http_gunzip_module \
    --with-http_gzip_static_module \
    --with-http_random_index_module \
    --with-http_secure_link_module \
    --with-http_stub_status_module \
    --with-http_auth_request_module \
    --with-mail \
    --with-mail_ssl_module \
    --with-file-aio \
    --with-ipv6 \
    --with-http_v2_module \
    --with-threads \
    --with-stream \
    --with-stream_ssl_module
  2. NGINX systemd service file

    system 的有系統和用戶的區分:系統(/lib/systemd/system/)、用戶(/etc/lib/systemd/system/),通常系統管理員手工建立的單元文件建議存放在/etc/lib/systemd/system/目錄下。

    在/lib/systemd/system/目錄下建立服務文件nginx.service

    [Unit]
    Description=The NGINX HTTP and reverse proxy server #服務的簡單描述
    Documentation=http://nginx.org/en/docs/ #服務文檔,無關緊要
    After=syslog.target network.target remote-fs.target nss-lookup.target
    #定義啓動順序,After表示本服務在指定的服務以後啓動,另外相似的還有 Before、Requires本單元啓動,它須要的單元也會被啓動;它須要的單元中止了,這個單元也中止了、wants推薦使用,這個單元啓動了,它須要的單元也會被啓動;它須要的單元被中止了,對本單元無影響。
    
    [Service]
    Type=forking 
    #systemd認爲當該服務進程fork,且父進程退出後服務啓動成功。對於常規的守護進程(daemon),除非你肯定此啓動方式沒法知足需求,使用此類型啓動便可。使用此啓動類型應同時指定 PIDFile=,以便systemd可以跟蹤服務的主進程。
    PIDFile=/usr/nginx-1.14.2/logs/nginx.pid
    ExecStartPre=/usr/bin/nginx -t
    ExecStart=/usr/bin/nginx
    ExecReload=/usr/sbin/nginx -s reload
    ExecStop=/bin/kill -s QUIT $MAINPID
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user.target
相關文章
相關標籤/搜索