nginx基本原理與配置

1、選用Nginx的理由css

1)支持高併發鏈接html

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

2)內存消耗低nginx

3)成本低後端

4)配置簡單瀏覽器

5)支持Rewrite重寫規則,可以根據域名、URL的不一樣將http請求分發到不一樣的後端服務器羣組。緩存

6)內置健康檢查功能,若是Nginx proxy後端的某臺服務器宕機了,不會影響前端訪問bash

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

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

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

 

2、Nginx的啓停

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

一、啓動

nginx [-c path]

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

 

二、中止

通常經過發送系統信號給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

 

三、平滑重啓

若是修改了配置文件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信號後,當前工做進程會關閉監聽套接字,並繼續爲當前鏈接的客戶端服務,當全部客戶端服務完成後,舊的工做進程關閉。

 

四、其餘信號

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

 

3、Nginx基本配置

一、虛擬主機配置

虛擬主機提供了同一臺服務器,同一個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;
          }
    }
}

 

二、日誌文件配置與切割

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

 

三、壓縮配置

gzip壓縮後,頁面大小可變爲原來的30%甚至更小,這樣用戶瀏覽頁面時速度會快不少。

 

四、自動列目錄

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

五、瀏覽器本地緩存設置

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

瀏覽器緩存經過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;
 }
相關文章
相關標籤/搜索