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