Nginx("engine x")是一个高性能的HTTP和反向代理服务器,在大负载的情况下表现十分优秀。本文简单介绍一下安装、web服务和反向代理服务配置方法。
1、安装Nginx
yum -y install pcre-devel zlib-devel openssl-devel openssl gxx make
# 下载目前的stable版
tar xvzf nginx-1.6.2.tar.gz
#nginx目录为/opt/nginx/1.6.2,使用Nginx用户来启动
#详细的编译配置信息请参考:
http://www.nginx.cn/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
#创建符号链接
ln -s /opt/nginx/1.6.2/sbin/nginx /usr/local/bin/nginx
#启动Nginx
nginx
#检查端口80是否被监听,该端口在/opt/nginx/1.6.2/conf/nginx.conf 中已经有一个默认的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
)
#可以直接发送sigkill信号给Nginx主进程
pkill nginx
2、nginx常用命令
1)启动时指定配置文件
nginx -c /opt/nginx/1.6.2/conf/nginx.conf
2)运行时重载配置文件
当nginx主进程接收到重载配置文件的命令后,它会先检查新配置文件的合法性,然后将该配置文件应用。然后,主进程会启动一个新的工作进程,并发送关闭请求给旧的
工作进程。旧的工作进程收到关闭请求后,会停止接受新的连接,并继续服务旧的连接请求直到所有的请求完成后才退出。
nginx -s reload
3)运行时快速关闭nginx
nginx -s stop
4)运行时优雅的关闭nginx
所有的工作进程会停止接受新的连接,并继续服务旧的连接请求直到所有的请求完成后才退出。
nginx -s quit
5)运行时重新打开日志文件
nginx -s reopen
6)查看nginx版本
nginx -v
nginx version: nginx/1.6.2
3、配置静态内容
在debugo03和debugo04上,打开配置文件,修改下面的内容
worker_processes 1;
events {
worker_connections 1024;
}
http {
......
server {
listen 80;
server_name localhost;
location / {
root /var/www/html;
index index.html index.htm;
}
}
其中,启动了一个worker进程,一般情况下纯nginx的服务器可以将这个值配置为1。在作为web服务器的情况下,nginx的最多链接数为worker_connections*worder_processes。
listen监听本地所有地址端口80,也可以指定listen 192.168.111.10:80监听某一地址上。
server_name指令主要用于配置基于名称的虚拟主机。支持通配符*(例如;*.domain.com)或正则表达式(例:~^(?.+)\.domain\.com$)。参考 关于nginx的server_name
location / 指的是URL中“/”路径为下面的配置内容。包括URL位置的root目录,并在该目录下依次寻找index.html inde.htm 两个索引文件。一般的静态站点可以配置多个location,例如:
server {
location / {
root /data/www;
}
location /images/ {
root /data/images;
}
}
这里我们在debugo03和debugo04中"/"的index.html中配置一个简单的文本,仅包含主机名,用后面的负载均衡测试。
4、配置nginx负载均衡
debugo01和debugo02作为两台负载均衡服务器,debugo03和debugo04作为两台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;
}
}
测试如下,验证了轮询算法+权重的有效性。可以根据机器性能和模板设置不同的权重。
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
除了轮询和权重轮询以外,还包含下面三种算法:
IP Hash: 需要在upstream的配置中知道“ip_hash;”,每个请求按访问的ip的hash结果分配,这样每个放歌固定访问一个后端服务器,可以解决session的问题。
fair:需要在upstream的配置中指定"fair;",按后端服务器的响应时间来分配请求,响应时间短的优先分配。
URL hash:需要在upstream中配置指定:"hash $request_uri;hash_method crc32;"按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
另外,在niginx中可以为每个backend server 指定最大的重试次数和重试时间间隔。所有使用的关键字是max_fails和fail_timeout。而backup值的是仅当其他serverdown或者忙时才会请求这台server。例如:
upstream debugo_servers{
server debugo01:80 weight=5 backup;
server debugo02:80 weight=10 max_fails=3 fail_timeout=30s;
}