nginx基本原理與配置


一、選用Nginx的理由

1)支持高並發連接

得益於Nginx使用最新的epoll(Linux 2.6內核)和 kqueue(FreeBSD)網絡I/O模型,官方測試Nginx可最高支持5萬的並發連接,在實際的生產環境中,可實際支持2~4萬的並發連接數。

2)內存消耗低

3)成本低

4)配置簡單

5)支持Rewrite重寫規則,能夠根據域名、URL的不同將http請求分發到不同的后端服務器群組。

6)內置健康檢查功能,如果Nginx proxy后端的某台服務器宕機了,不會影響前端訪問

7)節省帶寬,支持GZIP壓縮,可添加瀏覽器本地緩存的header

8)穩定性高,用於反向代理,宕機概率極低

9)支持熱部署,啟動容易,幾乎可以7x24小時不間斷運行,且支持不間斷服務的情況下,對軟件進行升級。

 

二、Nginx的啟停

運行環境:max os, Nginx通過brew install安裝,路徑為:/usr/local/Cellar/nginx/1.10.2_1/

1、啟動

nginx [-c path]

-c 選項可用來指定配置文件路徑, 如 nginx -c /usr/local/etc/nginx.conf

 

2、停止

一般通過發送系統信號給Nginx主進程的方式來停止。可通過 ps -ef | grep nginx查看進程號

$ ps -ef | grep nginx
  501  3709     1   0  3:10下午 ??         0:00.00 nginx: master process nginx
  501  3710  3709   0  3:10下午 ??         0:00.00 nginx: worker process
  501  3711  3709   0  3:10下午 ??         0:00.01 nginx: worker process
  501  3712  3709   0  3:10下午 ??         0:00.01 nginx: worker process
  501  3713  3709   0  3:10下午 ??         0:00.01 nginx: worker process
  501  3724   686   0  3:11下午 ttys001    0:00.00 grep nginx

如上所示,3709為主進程,3710 ~ 3713為工作子進程。nginx.conf配置文件中指定了pid文件的存放路徑, 如/usr/local/var/run/nginx.pid, 其中存放了當前Nginx運行的主進程號,可通過該進程號,來平滑停止Nginx服務。

1)  平滑停止

$ kill -QUIT 3709
$ ps -ef | grep nginx
  501  3989   686   0  3:49下午 ttys001    0:00.00 grep nginx

# 或者,通過pid文件獲取主進程號來停止
$ kill -QUIT `cat /usr/local/var/run/nginx.pid`

2)快速停止

$ kill -TERM 3709
$ ps -ef | grep nginx
  501  3989   686   0  3:49下午 ttys001    0:00.00 grep nginx

# 或者,通過pid文件獲取主進程號來停止
$ kill -TERM `cat /usr/local/var/run/nginx.pid`

# 另一種方式
$ kill -INT 3709
$ ps -ef | grep nginx
  501  3989   686   0  3:49下午 ttys001    0:00.00 grep nginx

# 或者,通過pid文件獲取主進程號來停止
$ kill -INT `cat /usr/local/var/run/nginx.pid`

 

3)強制停止

$ pkill -9 nginx
$ ps -ef | grep nginx
  501  4081   686   0  3:57下午 ttys001    0:00.00 grep nginx

 

3、平滑重啟

如果修改了配置文件nginx.conf,想重啟Nginx,需要發送信號給Nginx主進程來實現。

$ ps -ef | grep nginx
  501  4188     1   0  4:13下午 ??         0:00.00 nginx: master process nginx
  501  4189  4188   0  4:13下午 ??         0:00.00 nginx: worker process
  501  4190  4188   0  4:13下午 ??         0:00.00 nginx: worker process
  501  4191  4188   0  4:13下午 ??         0:00.00 nginx: worker process
  501  4192  4188   0  4:13下午 ??         0:00.00 nginx: worker process
  501  4195   686   0  4:13下午 ttys001    0:00.00 grep nginx

$ kill -HUP `cat /usr/local/var/run/nginx.pid`

$ ps -ef | grep nginx
  501  4188     1   0  4:13下午 ??         0:00.01 nginx: master process nginx
  501  4201  4188   0  4:13下午 ??         0:00.00 nginx: worker process
  501  4202  4188   0  4:13下午 ??         0:00.00 nginx: worker process
  501  4203  4188   0  4:13下午 ??         0:00.00 nginx: worker process
  501  4204  4188   0  4:13下午 ??         0:00.00 nginx: worker process
  501  4206   686   0  4:13下午 ttys001    0:00.00 grep nginx

可以看出,重啟的只是工作進程,當接收到HUP信號后,當前工作進程會關閉監聽套接字,並繼續為當前連接的客戶端服務,當所有客戶端服務完成后,舊的工作進程關閉。

 

4、其他信號

USR1: 重新打開日志文件,切割日志文件時有用

USR2: 平滑升級可執行程序

WINCTH: 從容關閉工作進程

$ kill -WINCH `cat /usr/local/var/run/nginx.pid`
$ ps -ef | grep nginx
  501  4188     1   0  4:13下午 ??         0:00.01 nginx: master process nginx
  501  4258   686   0  4:21下午 ttys001    0:00.00 grep nginx

 

三、Nginx基本配置

1、虛擬主機配置

虛擬主機提供了同一台服務器,同一個Nginx進程上運行多個網站的功能,Nginx支持配置多種類型的虛擬主機: 基於IP的, 基於域名的, 基於端口號的。

在nginx.conf中,一台簡化的虛擬主機配置如下:

http {

    server {
        listen       8080;
        server_name  localhost;
        
        access_log  logs/host.access.log  main;
        
        location / {
            root   html;
            index  index.html index.htm;
          }
    }
}

基於IP的虛擬主機配置

通過ifconfig和route命令為當前服務器主機添加IP別名,如下:

$ ifconfig eth0:1 192.168.1.102 broadcast 192.168.1.255 netmask 255.255.255.0 up

$ route add -host 192.168.1.102 dev eth0:1

接下來分別對192.168.1.101和192.168.1.102配置虛擬主機

http {
    # 第一個虛擬主機
    server {
        # 監聽的IP和端口
        listen      192.168.1.101:8080;
        # 主機名稱
        server_name  192.168.1.101;
        # 訪問日志文件存放路徑
        access_log  logs/host.access.log  main;
        
        location / {
            # html網頁文件存放目錄
            root   /data0/htmldoc/server1;
            # 默認首頁文件,從左至右,找不到index.html,就查找index.htm,都查找不到則報錯
            index  index.html index.htm;
          }
    }
    
    # 第二個虛擬主機
    server {
        listen       192.168.1.102:8080;
        server_name  192.168.1.102;
        
        access_log  logs/host.access.log  main;
        
        location / {
            root   /data0/htmldoc/server2;
            index  index.html index.htm;
          }
    }
}

 

基於域名的虛擬主機配置

配置你的DNS服務器,將你的IP映射到不同的域名即可實現,可以有效解決IP地址不足的問題。

http {
    # 第一個虛擬主機
    server {
        # 監聽的IP和端口
        listen      8080;
        # 主機名稱
        server_name  aaa.ssl.com;
        # 訪問日志文件存放路徑
        access_log  logs/host.access.log  main;
        
        location / {
            # html網頁文件存放目錄
            root   /data0/htmldoc/server1;
            # 默認首頁文件,從左至右,找不到index.html,就查找index.htm,都查找不到則報錯
            index  index.html index.htm;
          }
    }
    
    # 第二個虛擬主機
    server {
        listen       8080;
        server_name  bbb.ssl.com;
        
        access_log  logs/host.access.log  main;
        
        location / {
            root   /data0/htmldoc/server2;
            index  index.html index.htm;
          }
    }
}

 

2、日志文件配置與切割

1)配置log_format日志格式 log_format name format [format..]

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

name用來指定日志格式的名稱,保持唯一性。

$remote_addr用於記錄遠程客戶端IP地址, 還有另外一個變量$http_x_forwarded_for用來記錄用戶的X-Forwarded-For IP地址。

2)配置日志文件存放路徑

access_log path [format [ buffer=size | off ]]

path: 存放路徑

format: 日志格式名稱,log_format中設置的name

buffer: 內存緩沖區大小

off: 表示關閉日志記錄

如: access_log /data0/logs/log1 combined buffer=32k;

3) 日志切割

a) 重命名原日志文件,然后向Nginx主進程發送USR1信號,讓Nginx重新生成一個新的日志文件。

mv /data0/logs/access.log /data0/logs/20170716.log

kill -USR1 `cat /usr/local/var/run/nginx.pid`

b)按天定時切割日志文件的方式

# !/bin/bash
# 這個腳本須在每天的00:00運行, 保存為cut_nginx.log.sh

# Nginx日志文件的存放路徑
logs_path="/data0/logs"

mkdir -p ${logs_path}$(date -d "yesterday"+"%Y")/$(date -d "yesterday"+"%m")/

mv ${logs_path}access.log ${logs_path}$(date -d "yesterday"+"%Y")/$(date -d "yesterday"+"%m")/access_$(date -d "yesterday"+"%Y%m%d").log
kill -USR1 `cat /usr/local/var/nginx/nginx.pid`

配置crontab每天凌晨00:00定時執行該腳本

crontab -e

輸入:

00 00 * * * /bin/bash /usr/local/var/nginx/sbin/cut_nginx.log.sh

 

3、壓縮配置

gzip壓縮后,頁面大小可變為原來的30%甚至更小,這樣用戶瀏覽頁面時速度會快很多。

 

4、自動列目錄

location / {
            # html網頁文件存放目錄
            root   /Users/qwe/Desktop;
            # 自動列出目錄
            autoindex on;
          }

5、瀏覽器本地緩存設置

瀏覽器將用戶最近請求過的頁面存儲到本地磁盤,當用戶再次訪問時,可以直接從本地磁盤顯示文檔,加速頁面瀏覽速度,節約網絡資源。

瀏覽器緩存通過expires指令輸出header頭來實現 。

語法: expires [time | epoch | max | off]

默認值: expires off

作用域:http, server, location

用途: 使用本指令可以控制HTTP應答中的“Expires”和“Cache-Control”

epoch 指定 Expires值為 1 January,1970,00:00:01 GMT

max 指定 Expires值為 31 December,2037 23:59:59 GMT, Cache-Control值為10年

-1 指定"Expires"值為服務器當前時間,即永遠過期。

Cache-Control的值由你指定的時間來決定, 負數表示no-cache, 正數或零為你指定時間的秒數。

”off“表示不修改“Expires”和”Cache-Control“的值。

一般對常見格式的圖片、Flash文件緩存30天,對js、css文件緩存1小時。如下:

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
         expires 30d;
 }

location ~ .*\.(js|css)${
         expires 1h;
 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM