Nginx 浅析
1-Nginx
Nginx
Nginx(engine x)是 HTTP 和反向代理服务器,邮件代理服务器,TCP/UDP 代理服务器。
Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个 BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好。
Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 rambler.ru 站点开发的,于 2004 年发布了第一版
其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
中国大陆使用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx 扩展能力非常强,可以整合许多的开发模块,实现更多的功能。
特点
Nginx 是一个高性能的 Web 和反向代理服务器,它具有有很多非常优越的特性。
作为 Web 服务器
相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
作为负载均衡服务器
Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP 代理服务器对外进行服务。Nginx 用 C 编写,不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
作为邮件代理服务器
Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
Nginx 安装非常的简单,配置文件非常简洁(还能够支持 perl 语法),Bugs 非常少的服务器
Nginx 启动特别容易,并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动。还能够在不间断服务的情况下进行软件版本的升级。
2-Nginx 编译与安装
Nginx 编译与安装前准备
1、安装 gcc g++开发库
ububtu 平台编译环境可以使用以下指令
apt-get install build-essential
apt-get install libtool
centos 平台编译环境使用如下指令
安装 make
yum -y install gcc automake autoconf libtool make
安装 g++
yum install gcc gcc-c++
2、安装 pcre,目的为了重写 rewrite
选定源码目录
cd /usr/local/src
下载最新 pcre 源码包,进行解压、配置、编译以及安装
cd /usr/local/src
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.37.tar.gz
tar -zxvf pcre-8.37.tar.gz
cd pcre-8.34
./configure
make
make install
2、安装 pcre,目的为了重写 rewrite
选定源码目录
cd /usr/local/src
下载最新 pcre 源码包,进行解压、配置、编译以及安装
cd /usr/local/src
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.37.tar.gz
tar -zxvf pcre-8.37.tar.gz
cd pcre-8.34
./configure
make
make install
3、安装 zlib,目的为了 gzip 压缩
选定源码目录
cd /usr/local/src
下载最新源码包,进行解压、配置、编译以及安装
cd /usr/local/src
wget http://zlib.net/zlib-1.2.8.tar.gz
tar -zxvf zlib-1.2.8.tar.gz
cd zlib-1.2.8
./configure
make
make install
4、安装 ssl(某些 vps 默认没装 ssl)
cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.0.1t.tar.gz
tar -zxvf openssl-1.0.1t.tar.gz
Ubuntu
apt-get install openssl
apt-get install libssl-dev
centos
yum -y install openssl openssl-devel
Nginx 编译与安装
1、下载核心 Nginx 支持包
程序源代码:nginx-1.11.3.tar.gz
信息输出模块:echo-nginx-module-0.59.tar.gz
清除缓存模块:ngx_cache_purge-2.3.tar.gz
负载均衡模块:gnosek-nginx-upstream-fair-a18b409.tar.gz
2、将以上压缩包解压至制定目录下
tar xzvf /src/nginx-1.11.3.tar.gz -C /app/
tar xzvf /src/echo-nginx-module-0.59.tar.gz -C /app/
tar xzvf /src/ngx_cache_purge-2.3.tar.gz -C /app/
tar xzvf /src/gnosek-nginx-upstream-fair-a18b409.tar.gz -C /app/
3、创建新目录
Nginx 编译完成之后默认保存在源代码目录中,不方便管理,故新建目录保存 Nginx 的相关配置信息。建立目录如下:
mkdir -p /app/nginx/{conf,sbin,logs,fastcgi_temp,client_body_temp,proxy_temp,uwsgi_temp,scgi_temp}
4、进入 Nginx 源代码目录
cd /app/nginx-1.11.3/
5、编译 Nginx 前,配置输出目录以及模块信息
configure 命令是用来检测你的安装平台的目标特征的。它定义了系统的各个方面,包括 nginx 的被允许使用的连接处理的方法,比如它会检测你是不是有 CC 或 GCC,并不是需要 CC 或 GCC,它是个 shell 脚本,执行结束时,它会创建一个 Makefile 文件。
以下命令可以按照需要进行文件目录的调整,执行编译命令如下:
问题一:
执行之后,报出未发现 PCRE 库,因此,还需要给系统安装 PCRE 库
问题二:
编译 PCRE 库过程中,又出现了缺乏 c++编译器,故去安装 c++编译器
问题三:
PCRE 库和 c++编译器安装好后,重新编译 Nginx,出现了 OpenSSL 库未找到问题,因此,再去安装 OpenSSL 库。经过安装好后,配置了以下信息:
# add openssl home
export OPENSSL=/usr/local/openssl/bin
export PATH=$OPENSSL:$PATH:$HOME/bin
但是重新编译,不起作用,因此我在编译命令里加了--with-openssl=/usr/local/openssl \,重新编译后不再报出此错误。
查看 openssl 信息:
ldd /usr/local/openssl/bin/openssl
问题四:
编译 Nginx 报出 zlib 库未被发现,因此,再去安装 zlib 库
解决以上库的问题,重新编译之后,编译成功,编译成功结果如下:
6、执行编译:make
make 是用来编译的,它从 Makefile 中读取指令,然后编译。
问题一:
编译之后,报出以下错误:
7、执行安装:make install
make install 是用来安装的,它也从 Makefile 中读取指令,安装到指定的位置。
注意:
nginx 下的可执行命令 sbin 目录,应该建立在可执行程序的目录下。
安装 nginx 的开发包和各个组件,需要注意版本和版本之间的兼容问题。
注意 openssl 版本的问题,这可是一个坑,不要太新的版本。
启动 nginx
1、确保系统的 80 端口没被其他程序占用
nginx 默认占用 80 端口,需要避免端口冲突。
netstat -ano|grep 80
netstat -tunlp|grep 80
lsof -i:80
2、启动 nginx 程序
执行 sbin 目录命令:/app/nginx/sbin/nginx 或者./nginx
nginx 启动后,使用浏览器进行地址访问,地址:http://192.168.6.128
图 2 nginx 欢迎首页
问题:
执行启动命令,报出:
/app/nginx/sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
使用以下指令查看 nginx 启动命令:
ldd /app/nginx/sbin/nginx
返回信息为:
查看是否具有文件 libpcre.so.1,使用指令:whereis libpcre.so.1,结果显示有文件,所以,使用接下来的办法即可。
whereis libpcre.so.1
总结:
Nginx 使用多个模块,需要在编译前进行相应的配置。
Nginx 服务器的所有配置信息存在/app/nginx/conf/nginx.conf 下。
3-Nginx 与 Tomcat 整合
Nginx 与 Tomcat 整合
对于 Nginx 与 Tomcat 的整合,基本的运行程序,这里就不多说了,至少需要准备一个 Nginx 服务器和一个 Tomcat 服务器,最好是部署在不同的 ip 地址上。
1、修改 Nginx 配置文件信息
要通过 Nginx 代理 Tomcat 服务器,则需要修改 Nginx 下的配置文件 nginx.conf。
配置文件 nginx.conf 下的核心配置内容如下:
配置示例如下:
2、检测配置的信息语法是否正确
进行该项步骤,并不表明实际环境一定能够运行,使用如下指令:
/app/nginx/sbin/nginx -t
返回正确结果如下:
nginx: the configuration file /app/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /app/nginx/conf/nginx.conf test is successful
3、启动或者重启 Nginx 服务器
指令如下:
重启:/app/nginx/sbin/nginx -s reload
启动:/app/nginx/sbin/nginx
4、通过浏览器访问 Nginx 地址
直接通过浏览器直接访问 Nginx 地址,看是否进行 Tomcat 服务器代理。当前情况下只能将普通 HTML 信息进行传递,并不能将所有的 JS、CSS、图片等信息进行接收。
4-负载均衡安装
负载均衡
负载均衡的本质就是一个 Nginx 服务器可以代理多台 Tomcat 服务器,实现服务器集群。为了进行测试,至少需要准备一个 Nginx 服务器和两个 Tomcat 服务器。Nginx 负载均衡可以实现动态配置,不需要关闭服务的情况下,动态加载启动。
1、修改 Nginx 配置文件
追加参与负载均衡的服务器内容,并配置各个服务器的权重,与 server 配置内容平行,需注意配置的格式。
upstream proxy-server{
server 192.168.6.128:8080;
server 192.168.6.1:8080;
}
2、修改代理服务器地址
修改代理服务地址,让其跳转到配置的服务器上。
proxy_pass http://proxy-server;
3、为了实现负载均衡,对各个服务进行权重配置
upstream proxy-server{
server 192.168.6.128:8080 weight=2;
server 192.168.6.1:8080 weight=3;
}
4、配置服务器为宕机或者备份服务器
为了实现更好的服务器集群服务,可以增加宕机、备份服务器配置。
donw(宕机),表示服务器不参与服务了:
server 192.168.6.128:8080 weight=3 down;
backup(备份),表示该服务器正常访问中不使用,如果所有的服务器性能都不够使用的时候自动启动该备份服务器:
server 192.168.6.128:8080 weight=3 backup;
负载均衡策略
1、round robin(默认方式)
轮询方式,依次将请求分配到各个后台服务器中,默认的负载均衡方式,适用于后台机器性能一致的情况,挂掉的机器可以自动从服务列表中剔除。
2、weight
根据权重来分发请求到不同的机器中,指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
upstream bakend{
server 192.168.0.14 weight=5;
server 192.168.0.15 weight=6;
}
3、IP_hash
根据请求者 ip 的 hash 值将请求发送到后台服务器中,可以保证来自同一 ip 的请求被放到固定的机器上,可以解决 session 问题。
upstream bakend{
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
4、url_hash(第三方)
根据请求的 url 的 hash 值将请求分到不同的机器中,当后台服务器为缓存的时候效率高。
在 upstream 中加入 hash 语句,server 语句中不能写入 weight 等其他的参数,hash_method 是使用的 hash 算法。
upstream backend{
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
建议
#定义负载均衡设备的 Ip 及设备状态
upstream bakend{
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
每个设备的状态设置为:
1、down 表示当前的 server 不参与负载,进入宕机状态;
2、weight 默认为 1,weight 越大,负载的权重就越大。
3、max_fails:允许请求失败的次数默认为 1,当超过最大次数时,返回 proxy_next_upstream 模块定义的错误;
4、fail_timeout:max_fails 次失败后,暂停的时间。
5、backup:其它所有的非 backup 机器 down 或者忙的时候,请求 backup 机器。所以这台机器压力会最轻。
nginx 支持同时设置多组的负载均衡,用来给不用的 server 来使用。
client_body_in_file_only 设置为 On 可以讲 client post 过来的数据记录到文件中用来做 debug
client_body_temp_path 设置记录文件的目录,可以设置最多 3 层目录
location 对 URL 进行匹配,可以进行重定向或者进行新的代理,负载均衡
5. fair(第三方)
根据后台响应时间来分发请求,响应时间短的分发的请求多。
upstream backend{
server server1;
server server2;
fair;
}
正向代理
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
反向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
5-数据缓存
数据缓存
Nginx 服务器管理多台 Tomcat 服务器时,应该具有一定的算法,判断出哪台 Tomcat 繁忙,哪台 Tomcat 空闲,从而合理分配正确的资源。但是也会碰到一个问题,对于一些不会频繁变更的资源,每次都需要去重新加载,这样是非常消耗网络资源的。因此,Nginx 服务器提供了对于不需要频繁变更的资源进行缓存的机制,同时也提供了缓存的清除功能,最重提高集群效率。
1、建立缓存目录
mkdir -p /data/nginx/{temp,cache}
2、修改 Nginx 配置文件
修改 nginx.conf 文件,核心配置信息如下。
http 节点下设置缓存存储信息和压缩信息
server 节点下设置代理服务器信息
server 节点下设置清空缓存信息
server 节点下设置缓存文件类型
3、清空缓存
清空的文件从根目录下开始寻找。
http://192.168.6.128/purge/asf-logo.png
6-IP_HASH
集群 Session 管理之 IP_HASH
一台 Tomcat 服务器针对一个客户端,存储有对应的 session。但是,现在是通过 Nginx 进行反向代理,那么,就会出现此时的客户端 session 访问到另一台 Tomcat 容器,而另一台 Tomcat 容器则认为是新的 session,所以,又会重新生成一个新的 session,这样会导致数据丢失。
Nginx 提供了 ip_hash,将客户端用户绑定到其最初访问的 Tomcat 上,不让其跳转到其他的容器上。修改配置文件即可实现。
upstream proxy-server{
ip_hash;
server 192.168.6.128:8080 weight=3;
server 192.168.6.1:8080 weight=3;
}
7-序列化 session
集群 Sessin 管理之序列化 session
从实际环境中,不可能将访问用户绑定到一台容器上,因此,会出现用户在多台服务器之间跳转的问题。那么,此时,对于 session 而言,就不应该交由 Tomcat 来进行管理,而是交给公共的 Redis 数据库进行管理。
管理所有的 session 信息使用 Redis 数据库,只需要修改 Tomcat 即可,与 Nginx 无关。
1、下载 Redis 与 tomcat 管理 session 的开发包
tomcat-redis-session-0.8.jar
commons-pool2-2.5.0.jar
jedis-2.9.0.jar
2、将开发包拷贝到集群 tomcat 的 lib 下
使用 scp 指令进行文件的远程发送。
cp -a /src/commons-pool2-2.5.0.jar /app/apache-tomcat-8.5.24/lib/
cp -a /src/jedis-2.9.0.jar /app/apache-tomcat-8.5.24/lib/
cp -a /src/tomcat-redis-session-0.8.jar /app/apache-tomcat-8.5.24/lib/
3、修改集群下所有 tomcat 的 server.xml 文件,追加 session 管理
4、启动 Redis 和 Tomcat 服务
可以进入 Redis 客户端,查看所有存储的 key。
8-HA 机制的 Nginx 配置
单台 Nginx 问题
Nginx 利用反向代理和负载均衡机制,对多个 Tomcat 进行管理。但是,如果一旦 Nginx 出现了问题,那么,就会造成无法访问 Tomcat 服务器。因此,现实环境中,这样的事情是不允许发生的。
为了解决以上问题,一旦其中一台 Nginx 出现了问题而中断服务,就应该有另一台 Nginx 机器补充上去。这两台机器的所有配置信息相同。当其中一台服务器使用时,另一台则处于挂起状态,停止提供服务。只有服务的 Nginx 出现了问题而中断,另一台就开始提供服务。这也就是 HA(High Available)机制。
keepalived
对于 Nginx 的 HA 机制,可使用 keepalived 组件实现。keepalived 是一个免费的开源组件,最大的功能就是:采用一个虚拟路由的算法,虚拟出一个新的 ip 地址,使用这个 ip 地址代理多个服务器。
疑问,是否可以直接使用 tomcat 进行?
keepalived 是一个基于 VRRP 协议来实现的服务高可用方案,利用其避免静态路由 IP 单点故障问题,类似的工具有 heartbeat、corosync、pacemaker。但是其不会单独出现,而是与其他负载均衡技术(如 Ivs、haproxy、nginx)一起工作来达到集群的高可用。
VRRP(Virtual Router Redundanc Protocol),虚拟路由冗余协议。其可实现路由器高可用的容错协议,即将 N 台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个 master 和多个 backup,但在外界看来就像一台一样,构成虚拟路由器。又有一个虚拟 IP,在 master 宕机之后其他的 backup 主机可以自动恢复使用。
Keepalived 高可用故障切换转移原理
Keepalived 高可用服务对之间的故障切换转移,是通过 VRRP 来实现的。在 keepalived 服务工作时,主 Master 节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备 Backup 节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。于是就会调用自身的接管程序,接管主节点的 IP 资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的 IP 资源和服务,恢复到原来的备用角色。
keepalived 配置
keepalived 官网提供的是一个开放的源代码,需要进行相应的编译和配置才可使用。
1、下载、解压文件
tar -zxvf keepalived-1.3.6.tar.gz -C /app/
2、进入 keepalived 目录,配置保存信息
cd /app/keepalived-1.3.6/
./configure --prefix=/usr
问题:
执行过程报出一下错误:
configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files. !!!
之前我已经安装了 openssl 库,但是说明相关的文件仍然没有安装完全,故又重新再次安装,使用指令:yum install openssl*
3、进行编译:make
4、程序安装:make install
安装成功之后,会在/usr/etc 目录中出现相关的配置信息,以及/usr/sbin 作为服务启动的命令。
5、修改 keepalived 配置文件,增加 VRRP 配置信息
vim /usr/etc/keepalived/keepalived.conf
5、修改 keepalived 配置文件,增加 VRRP 配置信息
vim /usr/etc/keepalived/keepalived.conf
获取网卡名字:ifconfig、cat /proc/net/dev
配置信息:
6、建立目录,拷贝配置文件至指定目录下
mkdir -p /etc/keepalived
cp /usr/etc/keepalived/keepalived.conf /etc/keepalived/
cp /app/keepalived-1.3.6/keepalived/etc/keepalived/keepalived.conf /etc/sysconfig/
cp -a /app/keepalived-1.3.6/keepalived/etc/init.d/keepalived /etc/init.d/
7、keepalived 服务指令
启动:service keepalived start
查看状态:service keepalived status
停止:service keepalived stop
9-NFS
NFS
Nginx 可以管理多台服务器,但是现在仍然要面临的问题便是多台服务器的代码怎么进行管理,如果是较少,还可以一台一台的部署,但是,如果服务器多了之后,怎么处理呢?
对于 Java 项目,有一种文件类型,其形式为*.war 文件,可以放置到 webapps 目录下,进行热部署,自动解压文件。因而,可以采用一种叫做 NFS 的组件进行文件的自动同步管理。
NFS(Network File System),网络文件系统。一种使用于分散式文件系统的协定,由 Sun 公司开发,于 1984 年对外公布。功能是通过网络协议让不同的机器,不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类 Unix 系统间实现磁盘文件共享的一种方法。
配置
1、下载并安装 NFS 软件包
yum install nfs-kernel-server
2、新建共享目录
mkdir -p /share/tomcat
3、配置新建共享目录,编辑 NFS 配置文件
vim /etc/exports
4、文件添加如下内容
/share/tomcat *(rw,sync,no_root_squash,no_subtree_check)
含义如下:
“*”:表示所有网段都可以访问,也可设置固定的 ip;
“rw”:表示共享目录下的数据,所有客户端可以进行读写操作;
“sync”:表示数据需要同步(内存和磁盘);
“no_root_squash”:使用 root 权限将具备完全的控制能力;
“no_subtree_check”:不受父目录的权限影响。
图 1 NFS 常用参数
5、启动服务器端的 nfs 服务,也就是 rpc 端口的服务绑定。
/etc/init.d/rpcbind restart
6、随后需要在客户端进行挂载配置,此时所有的其他目录都需要跟 nfs 目录中的内容同步,需要执行一个挂载操作处理,在客户端执行如下命令:
mount -t nfs 192.168.6.128:/share/tomcat /app/apache-tomcat-8.5.24/webapps
192.168.6.128:/share/tomcat:远程服务器目录
/app/apache-tomcat-8.5.24/webapps:本地要挂载的目录
unmount /app/apache-tomcat-8.5.24/webapps:取消挂载
评论