Nginx 核心模塊與配置實踐

1、Nginx 簡介與安裝

一、Nginx 簡介

Nginx是一個高性能WEB服務器,除它以外Apache、Tomcat、Jetty、IIS,它們都是Web服務器,或者叫作WWW(World Wide Web)服務器,相應地也都具有Web服務器的基本功能。Nginx 相對基它WEB服務有什麼優點呢?css

(1)Tomcat、Jetty 面向java語言,先天就是重量級的WEB服務器,其性能與Nginx沒有可比性。html

(2)IIS只能在Windows操做系統上運行。Windows做爲服務器在穩定性與其餘一些性能上都不如類UNIX操做系統,所以,在須要高性能Web服務器的場合下IIS並不佔優。java

(3)Apache的發展時期很長,並且是目前毫無爭議的世界第一大Web服務器,其有許多優勢,如穩定、開源、跨平臺等,但它出現的時間太長了,在它興起的年代,互聯網的產業規模遠遠比不上今天,因此它被設計成了一個重量級的、不支持高併發的Web服務器。在Apache服務器上,若是有數以萬計的併發HTTP請求同時訪問,就會致使服務器上消耗大量內存,操做系統內核對成百上千的Apache進程作進程間切換也會消耗大量CPU資源,並致使HTTP請求的平均響應速度下降,這些都決定了Apache不可能成爲高性能Web服務器,這也促使了Lighttpd和Nginx的出現。 下圖能夠看出07年到18 年強勁增加勢頭。linux

二、編譯與安裝

安裝環境準備nginx

(1)Liunx 內核 2.6 及以上版本 : 只有 2.6 以後才支持了 epoll,在此以前使用 select 或 poll 多路複用的 IO 模型,沒法解決高併發壓力的問題。經過命令 uname -a 便可查看。c++

#查看 linux 內核
uname -a
複製代碼

(2)GCC編譯器 GCC(GNU Compiler Collection)可用來編譯C語言程序。Nginx不會直接提供二進制可執行程序,只能下載源碼進行編譯。web

(3)PCRE庫 PCRE(Perl Compatible Regular Expressions,Perl兼容正則表達式)是由Philip Hazel開發的函數庫,目前爲不少軟件所使用,該庫支持正則表達式。正則表達式

(4)zlib庫 zlib庫用於對HTTP包的內容作gzip格式的壓縮,若是咱們在nginx.conf裏配置了gzip on,並指定對於某些類型(content-type)的HTTP響應使用gzip來進行壓縮以減小網絡傳輸量。windows

(5)OpenSSL開發庫 若是咱們的服務器不僅是要支持HTTP,還須要在更安全的SSL協議上傳輸HTTP,那麼就須要擁有OpenSSL了。另外,若是咱們想使用MD五、SHA1等散列函數,那麼也須要安裝它。安全

上面幾個庫都是Nginx 基礎功能所必需的,爲簡單起見咱們能夠經過yum 命令統一安裝。

#yum 安裝nginx 環境
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel

源碼獲取:
nginx 下載頁:http://nginx.org/en/download.html 。
** # 下載nginx 最新穩定版本
wget http://nginx.org/download/nginx-1.15.9.tar.gz
#解壓
tar -zxvf nginx-1.15.9.tar.gz
最簡單的安裝:
# 所有采用默認安裝
./configure
make && make install 
執行完成以後 nginx 運行文件 就會被安裝在 /usr/local/nginx 下。

基於參數構建
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-debug

控制命令:
#默認方式啓動:
./sbin/nginx 
#指定配置文件啓動 
./sbing/nginx -c /tmp/nginx.conf 
#指定nginx程序目錄啓動
./sbin/nginx -p /usr/local/nginx/

#快速中止
./sbin/nginx -s stop
#優雅中止
./sbin/nginx -s quit

# 熱裝載配置文件 
./sbin/nginx -s reload
# 從新打開日誌文件
./sbin/nginx -s reopen
複製代碼

2、Nginx 架構說明

Nginx 架構圖:

架構說明:

(1)nginx啓動時,會生成兩種類型的進程,一個是主進程(Master),一個(windows版本的目前只有一個)和多個工做進程(Worker)。主進程並不處理網絡請求,主要負責調度工做進程,也就是圖示的三項:加載配置、啓動工做進程及非停升級。因此,nginx啓動之後,查看操做系統的進程列表,咱們就能看到至少有兩個nginx進程。

(2)服務器實際處理網絡請求及響應的是工做進程(worker),在類unix系統上,nginx能夠配置多個worker,而每一個worker進程均可以同時處理數以千計的網絡請求。

(3)模塊化設計。nginx的worker,包括核心和功能性模塊,核心模塊負責維持一個運行循環(run-loop),執行網絡請求處理的不一樣階段的模塊功能,如網絡讀寫、存儲讀寫、內容傳輸、外出過濾,以及將請求發往上游服務器等。而其代碼的模塊化設計,也使得咱們能夠根據須要對功能模塊進行適當的選擇和修改,編譯成具備特定功能的服務器。

(4)事件驅動、異步及非阻塞,能夠說是nginx得以得到高併發、高性能的關鍵因素,同時也得益於對Linux、Solaris及類BSD等操做系統內核中事件通知及I/O性能加強功能的採用,如kqueue、epoll及event ports。

Nginx 核心模塊:

3、Nginx 配置與使用

(1)配置文件語法格式

(2)配置第一個靜態WEB服務

(3)配置案例

a. 動靜分離實現
b. 防盜鏈
c. 多域名站點
d. 下載限速
e. IP 黑名單
f. 基於user-agent分流
複製代碼

(4)日誌配置

一、配置文件的語法格式: 先來看一個簡單的nginx 配置

worker_processes  1;
events {
    worker_connections 1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /nginx_status {
        stub_status on;
        access_log   off;
  	    }
    }
}
複製代碼

上述配置中的events、http、server、location、upstream等屬於配置項塊。而worker_processes 、worker_connections、include、listen 屬於配置項塊中的屬性。 /nginx_status 屬於配置塊的特定參數參數。其中server塊嵌套於http塊,其能夠直接繼承訪問Http塊當中的參數。

配置塊 名稱開頭用大口號包裹其對應屬性
屬性 基於空格切分屬性名與屬性值,屬性值可能有多個項 都以空格進行切分 如:access_log logs/host.access.log main
參數 其配置在 塊名稱與大括號間,其值若是有多個也是經過空格進行拆

注意 若是配置項值中包括語法符號,好比空格符,那麼須要使用單引號或雙引號括住配置項值,不然Nginx會報語法錯誤。例如:

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

二、配置第一個靜態WEB服務

基礎站點演示:

  • 建立站點目錄 mkdir -p /usr/www/luban
  • 編寫靜態文件
  • 配置 nginx.conf
  • 配置server
  • 配置location

基本配置介紹說明:

(1)監聽端口 語法:listen address: 默認:listen 80; 配置塊:server

(2)主機名稱 語法:server_name name[……]; 默認:server_name ""; 配置塊:server server_name後能夠跟多個主機名稱,如server_name www.testweb.comdownload.testweb.com;。 支持通配符與正則

(3)location 語法:location[=|~|~*|^~|@]/uri/{……} 配置塊:server

  • / 基於uri目錄匹配
  • =表示把URI做爲字符串,以便與參數中的uri作徹底匹配。
  • ~表示正則匹配URI時是字母大小寫敏感的。
  • ~*表示正則匹配URI時忽略字母大小寫問題。
  • ^~表示正則匹配URI時只須要其前半部分與uri參數匹配便可。

動靜分離演示:

  • 建立靜態站點
  • 配置 location /static
  • 配置 ~* \.(gif|png|css|js)$ 基於目錄動靜分離
   server {
        listen 80;
        server_name *.luban.com;
        root /usr/www/luban;
        location / {
                index luban.html;
        }
        location /static {
         alias /usr/www/static;
        }
 }
複製代碼

基於正則動靜分離

location ~* \.(gif|jpg|png|css|js)$ {
      root /usr/www/static;
}
複製代碼

防盜鏈配置演示: 加入至指定location 便可實現

valid_referers none blocked *.luban.com;
 if ($invalid_referer) {
       return 403;
}
複製代碼

下載限速:

location /download {
    limit_rate 1m;
    limit_rate_after 30m;
}
複製代碼

建立IP黑名單 建立黑名單文件

echo 'deny 192.168.0.132;' >> balck.ip
#http 配置塊中引入 黑名單文件
include       black.ip;
複製代碼

三、日誌配置: 日誌格式:

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  logs/access.log  main;
複製代碼

基於域名打印日誌

access_log logs/$host.access.log main;
複製代碼

error日誌的設置

語法:error_log /path/file level;

默認:error_log logs/error.log error;

level是日誌的輸出級別,取值範圍是debug、info、notice、warn、error、crit、alert、emerg,針對指定的客戶端輸出debug級別的日誌

語法:debug_connection[IP|CIDR]

events {
debug_connection 192.168.0.147; 
debug_connection 10.224.57.0/200;
}
複製代碼
相關文章
相關標籤/搜索