Nginx簡介: Nginx(發音engine x)專為性能優化而開發的開源軟體,是HTTP、反向代理、郵件代理、TCP/UDP協議代理軟體,由俄羅斯的作者Igor Sysoev開發,其最知名的優點是它的穩定性和低系統資源消耗(硬體資源占用較低),以及對HTTP併發連接的高處理能力(單台物理伺服器可 ...
Nginx簡介:
Nginx(發音engine x)專為性能優化而開發的開源軟體,是HTTP、反向代理、郵件代理、TCP/UDP協議代理軟體,由俄羅斯的作者Igor Sysoev開發,其最知名的優點是它的穩定性和低系統資源消耗(硬體資源占用較低),以及對HTTP併發連接的高處理能力(單台物理伺服器可支持30000~50000個併發請求),是一個輕量級WEB伺服器軟體。正因為如此,大量提供社交網站、新聞資訊、電子商務以及虛擬主機等服務的企業紛紛選擇Ngnix來提供WEB服務。如新浪,淘寶(Tengine),京東,金山,網易,騰訊,百度文庫,51cto,人人網等。
Nginx版本:
社區版 www.nginx.org
企業版 www.nginx.com(被F5收購)
tengine tengine.taobao.org
Nginx官方站點
最新的穩定版:1.16.1
最新的開發板:1.17.3
===================================================================
部署Nginx軟體:
1)安裝支持軟體:
Nginx的配置及運行需要pcre、zlib等軟體包的支持,因此應預先安裝這些軟體的開發包(devel),以便提供相應的庫和頭文件,確保Nginx的安裝順利完成。
首先我們先關閉系統安全機制:
[root@nginx~]#systemctl stop firewalld
[root@nginx~]#iptables-F
[root@nginx~]#setenforce 0
安裝nginx所需的軟體包
[root@nginx~]# yum -y install pcre-devel zlib-devel openssl-devel
2) 創建運行用戶,組
[root@nginx~]# useradd -M -s /sbin/nologinnginx
3)編譯安裝nginx:
wget http://nginx.org/download/nginx-1.16.1.tar.gz (下載1.16.1版本nginx, wget命令需要安裝,也可去官網下載源碼包)
釋放 nginx源碼包:
tar xf nginx-1.16.1.tar.gz -C /usr/src
4)配置編譯:
[root@nginx~]# cd /usr/src/nginx-1.16.1/
[[email protected]]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module && make && make install
註:配置前可以參考:./configure --help給出說明
--prefix 設定Nginx的安裝目錄
--user和--group 指定Nginx運行用戶和組
--with-http_stub_status_module 啟用http_stub_status_module模塊以支持狀態統計
--with-http_ssl_module 啟用SSL模塊
--with-http_flv_module 啟用FLV模塊,提供尋求記憶體使用基於時間的偏移量文件
為了使Nginx伺服器的運行更加方便,可以為主程式nginx創建鏈接文件,以便管理員直接執行nginx命令就可以調用Nginx的主程式。
[[email protected]]# ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
[[email protected]]# ll /usr/local/bin/nginx //查看軟連接是否創建成功
5)Nginx 的運行控制:
與Apache的主程式httpd類似,Nginx的主程式也提供了"-t"選項用來對配置文件進行檢查,以便找出不當或錯誤的配置。配置文件nginx.conf預設位於安裝目錄/usr/local/nginx/conf/目錄中。若要檢查位於其他位置的配置文件,可使用"-c"選項來指定路徑。
[root@nginxconf]#nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
6)啟動,停止 Nginx:
直接運行nginx即可啟動Nginx伺服器,這種方式將使用預設的配置文件,若要改用其他配置文件,需添加"-c 配置文件路徑"選項來指定路徑。需要註意的是,若伺服器中已安裝有httpd等其他WEB服務軟體,應採取措施(修改埠,停用或卸載其他軟體)避免部突。
[root@nginxconf]# netstat -anpt |grep :80
[root@nginxconf]#nginx
主程式Nginx支持標準的進程信號,通過kill或者killall命令傳送
HUP 重載配置 等同於-1
QUIT 退出進程 等同於-3
KILL 殺死進程 等同於-9
[root@nginx~]#killall -s HUP nginx
[root@nginx~]#killall -s QUIT nginx
[root@nginx~]# netstat -anpt |grep :80
當Nginx進程運行時,PID號預設存放在/usr/local/nginx/logs/目錄下的nginx.pid文件中,因此若改用kill命令,也可以根據nginx.pid文件中的PID號來進行控制。
為了使Nginx服務的啟動、停止、重載等操作更加方便,可以編寫Nginx服務腳本,並使用chkconfig和systemctl工具來進行管理,也更加符合RHEL系統的管理習慣。
[root@nginx~]# vim /etc/init.d/nginx
#!/bin/bash
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$PROG
;;
stop)
kill -s QUIT $(cat $PIDF)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PIDF)
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
[root@nginx~]#chmod +x /etc/init.d/nginx
[root@nginx~]#chkconfig --add nginx
[root@nginx~]#chkconfignginx on
[root@nginx~]#chkconfig --list nginx
nginx 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉
nginx.conf文件結構
在Nginx伺服器的主配置文件nginx.conf中,包括全局配置、I/O事件配置、HTTP配置這三大塊內容,配置語句的格式為"關鍵字 值;"(末尾以分號表示結束),以"#"開始的部分表示註釋。
1)全局配置
由各種配置語句組成,不使用特定的界定標記。全局配置部分包括運行用戶、工作進程數、錯誤日誌、PID存放位置等基本設置。
常用配置項:
user nginx [nginx]; //運行用戶,Nginx的運行用戶實際是編譯時指定的nginx,若編譯時未指定則預設為nobody。
worker_processes 2;//指定nginx啟動的工作進程數量,建議按照cpu數目來指定,一般和CPU核心數相等。
worker_cpu_affinity 00000001 00000010; //為每個進程分配cpu核心,上例中將2個進程分配到兩個cpu,當然可以寫多個,或者將一個進程分配到多個cpu
worker_rlimit_nofile 102400; //這個指令是指當一個nginx進程打開的最多文件數目,理論值應該是最多打開文件數(ulimit-n)與nginx進程數相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit -n的值保持一致。(通過"ulimit–n 數值"可以修改打開的最多文件數目)
error_log logs/error.log; //全局錯誤日誌文件的位置
pid logs/nginx.pid; //PID文件的位置
2)I/O事件配置:
使用"events {}"界定標記,用來指定Nginx進程的I/O響應模型,每個進程的連接數等設置
events {
//使用epoll模型,對於2.6以上的內核,建議使用epoll模型以提高性能
worker_connections 4096; //每個進程允許的最多連接數(預設為1024),每個進程的連接數應根據實際需要來定,一般在10000以下,理論上每台nginx伺服器的最大連接數為worker_processes*worker_connections,具體還要看伺服器的硬體、帶寬等。
}
3)HTTP配置
使用"http{}"界定標記,包括訪問日誌、HTTP埠、網頁目錄、預設字元集、連接保持、以
及虛擬主機、PHP解析等一系列設置。其中大部分配置語句包含在子界定標記"server {}"內。
http {
include mime.types;
default_type application/octet-stream;
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; //訪問日誌位
sendfile on; //支持文件發送(下載)
keepalive_timeout 65; //連接保持超時
server { //web服務的監聽配置
listen 80; //監聽地址及埠(IP:PORT)
server_name www.crushlinux.com; //網站名稱(FQDN)
charset utf-8; //網頁的預設字元集
location / { //跟目錄配置
root html; //網站根目錄的位置安裝位置的html中
index index.html index.htm; //預設首頁(索引頁)
}
error_page 500 502 503 504 /50x.html; //內部錯誤的反饋頁面
location = /50x.html { //錯誤頁面配置
root html;
}
}
}
狀態統計模塊
Nginx內置了HTTP_STUB_STATUS狀態統計模塊,用來反饋當前的WEB訪問情況。配置
編譯參數時可添加--with-http_stub_stastus_module來啟用此模塊。要使用Nginx的狀態統計功能,除了啟用內建模塊以外,還需要修改nginx.conf文件,指定訪問位置並打開stub_status配置。在http{}配置的server{}子配置內添加如下配置項
[root@nginx~]# vim /usr/local/nginx/conf/nginx.conf
location /status {
stub_status on; //打開狀態統計功能
access_log off; //關閉此位置的日誌記錄
}
[root@nginxconf]#systemctl restart nginx
瀏覽器訪問 http://192.168.200.111/status
Active connections 表示當前活躍的連接數,
第三行的三個數字表示Nginx當前總共處理了3個連接,成功創建3次握手,總共處理了12個請求。
Reading表示Nginx讀取到客戶端Header信息數,
Writing表示Nginx返回給客戶端的Header信息數
Waiting表示Nginx已經處理完,正在等候下一次請求指令時的駐留連接數。
虛擬主機應用:
使用Nginx搭建虛擬主機伺服器時,每個虛擬WEB站點擁有獨立的"server {}"配置段,各自監聽的IP地址、埠號可以單獨指定,當然網站名稱也是不同的。
例如:要創建兩個站點www.canflyfish.com和www.fish.com
為兩個虛擬WEB主機分別建立根目錄,並準備測試首頁
[root@nginx~]#mkdir /usr/local/nginx/html/canflyfish
[root@nginx~]#mkdir /usr/local/nginx/html/fish
[root@nginx~]#echo "<h1>www.canflyfish.com</h1>"
>/usr/local/nginx/html/canflyfish/index.html
[root@nginx~]# echo "<h1>www.fish.com</h1>" > /usr/local/nginx/html/fish/index.html
[root@nginx~]# vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
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;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.crushlinux.com;
charset utf-8;
access_log logs/crushlinux.access.log main;
location / {
root html/crushlinux;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.cloud.com;
charset utf-8;
access_log logs/cloud.access.log main;
location / {
root html/cloud;
index index.html index.htm;
}
}
}
[root@nginx~]# /etc/init.d/restart nginx
[root@nginx~]# vim /etc/hosts
192.168.200.111 www.canflyfish.com
192.168.200.111 www.fish.com
虛擬主機訪問測試:
[root@nginx~]#elinks --dump http://www.canflyfish.com
www.canflyfish.com
[root@nginx~]#elinks --dump http://www.fish.com
www.fish.com