Nginx基本服務(wù)與upstream配置詳解
Nginx (“engine x”) 是一個(gè)高性能的HTTP 和反向代理 服務(wù)器,在大負(fù)載的情況下表現(xiàn)十分優(yōu)秀。本文簡(jiǎn)單介紹一下安裝、web服務(wù)和反向代理服務(wù)配置方法。
1. 安裝ngnix
yum -y install pcre-devel zlib-devel openssl-devel openssl gcc make
# 下載目前的stable版
wget http:///download/nginx-1.6.2.tar.gz
tar xvzf nginx-1.6.2.tar.gz
# nginx目錄為/opt/nginx/1.6.2,使用nginx用戶來(lái)啟動(dòng)
# 詳細(xì)的編譯配置信息請(qǐng)參考:http://www./install
./configure --prefix=/opt/nginx/1.6.2 --user=nginx --with-openssl=/usr/lib64/openssl
# 編譯安裝
make -j && make install
# 添加用戶和組
groupadd nginx
useradd -g nginx nginx
echo "nginx" | passwd --stdin nginx
# 創(chuàng)建符號(hào)鏈接
ln -s /opt/nginx/1.6.2/sbin/nginx /usr/local/bin/nginx
# 啟動(dòng)ngnix
ngnix
# 檢查端口80是否被監(jiān)聽,該端口在/opt/nginx/1.6.2/conf/nginx.conf中已經(jīng)有一個(gè)默認(rèn)的server中定義
lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 15050 root 6u IPv4 95462 0t0 TCP *:http (LISTEN)
nginx 15051 nginx 6u IPv4 95462 0t0 TCP *:http (LISTEN)
# 可以直接發(fā)送SIGKILL信號(hào)給nginx主進(jìn)程
pkill nginx
2. nginx常用命令
(1). 啟動(dòng)時(shí)指定配置文件
nginx -c /opt/nginx/1.6.2/conf/nginx.conf
(2). 運(yùn)行時(shí)重載配置文件
當(dāng)nginx主進(jìn)程接收到重載配置文件的命令后,它會(huì)先檢查新配置文件的合法性,然后將該配置文件應(yīng)用。然后,主進(jìn)程會(huì)啟動(dòng)一個(gè)新的工作進(jìn)程,并發(fā)送關(guān)閉請(qǐng)求給舊的工作進(jìn)程。舊的工作進(jìn)程接收到關(guān)閉請(qǐng)求后,會(huì)停止接受新的連接,并繼續(xù)服務(wù)舊的連接請(qǐng)求直到所有的請(qǐng)求完成后才退出。
nginx -s reload
(3). 運(yùn)行時(shí)快速關(guān)閉nginx
nginx -s stop
(4). 運(yùn)行時(shí)優(yōu)雅關(guān)閉nginx
所有的工作進(jìn)程會(huì)停止接受新的連接,并繼續(xù)服務(wù)舊的連接請(qǐng)求直到所有的請(qǐng)求完成后才退出。
nginx -s quit
(5). 運(yùn)行時(shí)重新打開日志文件
ngnix -s reopen
(6). 測(cè)試配置文件 yum -y install pcre-devel zlib-devel openssl-devel openssl gcc make
# 下載目前的stable版
wget http:///download/nginx-1.6.2.tar.gz
tar xvzf nginx-1.6.2.tar.gz
# nginx目錄為/opt/nginx/1.6.2,使用nginx用戶來(lái)啟動(dòng)
# 詳細(xì)的編譯配置信息請(qǐng)參考:http://www./install
./configure --prefix=/opt/nginx/1.6.2 --user=nginx --with-openssl=/usr/lib64/openssl
# 編譯安裝
make -j && make install
# 添加用戶和組
groupadd nginx
useradd -g nginx nginx
echo "nginx" | passwd --stdin nginx
# 創(chuàng)建符號(hào)鏈接
ln -s /opt/nginx/1.6.2/sbin/nginx /usr/local/bin/nginx
# 啟動(dòng)ngnix
ngnix
# 檢查端口80是否被監(jiān)聽,該端口在/opt/nginx/1.6.2/conf/nginx.conf中已經(jīng)有一個(gè)默認(rèn)的server中定義
lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 15050 root 6u IPv4 95462 0t0 TCP *:http (LISTEN)
nginx 15051 nginx 6u IPv4 95462 0t0 TCP *:http (LISTEN)
# 可以直接發(fā)送SIGKILL信號(hào)給nginx主進(jìn)程
pkill nginx
(7). 查看nginx版本 nginx -v
nginx version: nginx/1.6.2
3. 配置靜態(tài)內(nèi)容
在debugo03和debugo04上,打開配置文件,修改下面的內(nèi)容 worker_processes 1;
events {
worker_connections 1024;
}
http {
......
server {
listen 80;
server_name localhost;
location / {
root /var/www/html;
index index.html index.htm;
}
}
其中,啟動(dòng)了一個(gè)worker進(jìn)程,一般情況下純nginx的服務(wù)器可以將這個(gè)值配置為。在作為web服務(wù)器的情況下,nginx最大連接數(shù)為worker_connections * worker_processes.
listen監(jiān)聽本地所有地址端口80,也可以指定listen 192.168.111.10:80監(jiān)聽到某一地址上。
server_name指令主要用于配置基于名稱的虛擬主機(jī)。支持通配符*(例如*.domain.com)或正則表達(dá)式(例如~^(?.+)\.domain\.com$)。參考關(guān)于Nginx的server_name
location / 指的是URL中“/”路徑為下面的配置內(nèi)容。包括該URL位置的root目錄,并在該目錄下依次尋找 index.html index.htm兩個(gè)索引文件。一般的靜態(tài)站點(diǎn)可以配置多個(gè)location,例如: server {
location / {
root /data/www;
}
location /images/ {
root /data/images;
}
}
這里我們?cè)赿ebugo03和debugo04中“/”的index.html中配置一個(gè)簡(jiǎn)單的文本,僅包含主機(jī)名,用于后面的負(fù)載均衡測(cè)試。
4. 配置ngnix負(fù)載均衡
debugo01和debugo02作為兩臺(tái)負(fù)載均衡服務(wù)器,debugo03和debugo04作為兩臺(tái)web server
下面打開配置文件
vim nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
keepalive_timeout 65;
include upstream.conf;
}
vim upstream.conf
upstream debugo_servers {
server debugo03:80 weight=5;
server debugo04:80 weight=10;
}
server {
listen debugo01:80;
location / {
proxy_pass http://debugo_servers;
}
}
測(cè)試如下,驗(yàn)證了輪詢算法+權(quán)重的有效性??梢愿鶕?jù)機(jī)器性能和目標(biāo)設(shè)置不同的權(quán)重。 [root@debugo01 ~]# curl debugo01
debugo04
[root@debugo01 ~]# curl debugo01
debugo03
[root@debugo01 ~]# curl debugo01
debugo04
[root@debugo01 ~]# curl debugo01
debugo04
[root@debugo01 ~]# curl debugo01
debugo03
[root@debugo01 ~]# curl debugo01
debugo04
[root@debugo01 ~]# curl debugo01
debugo04
[root@debugo01 ~]# curl debugo01
debugo03
除了輪詢和權(quán)重輪詢以外,還包括下面三種算法:
IP Hash : 需要在upstream的配置中指定“ip_hash;”,每個(gè)請(qǐng)求按訪問(wèn)ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問(wèn)一個(gè)后端服務(wù)器,可以解決session的問(wèn)題。
fair:需要在upstream的配置中指定“fair;”按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。
URL hash:需要在upstream中配置指定:“hash $request_uri; hash_method crc32;”按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效。
另外,在nignx中可以為每個(gè) backend server 指定最大的重試次數(shù)和重試時(shí)間間隔。所使用的關(guān)鍵字是 max_fails 和 fail_timeout。而backup指的是僅當(dāng)其他serverdown或者忙時(shí)才會(huì)請(qǐng)求這臺(tái)server。例如:
upstream debugo_servers {
server debugo01:80 weight=5 backup;
server debugo02:80 weight=10 max_fails=3 fail_timeout=30s;
}
^^
|