nginx解决方案
1.方案场景
现有多台应用服务器,要实现所有的访问先访问到反向代理服务器上再转内部对应的应用。
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简而言之就是隐藏所有的服务器,与之相对的是正向代理,如我们常用的vpn,目的是隐藏访问客户端。
我们在这里打算采用Nginx作为方向代理的服务器
2.什么是nginx
Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
在高连接并发的情况下,Nginx是Apache服务器不错的替代品。
3.nginx安装
在/usr/local/src下进行,否则后面会编译错误
3.1 安装编译工具和库文件
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
3.2 安装PCRE
PCRE 作用是让 Nginx 支持 Rewrite 功能。
下载 PCRE 安装包,下载地址: http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
解压安装包
tar zxvf pcre-8.35.tar.gz
进入安装包目录
cd pcre-8.35
编译安装
./configure
make && make install
查看pcre版本
pcre-config --version
若有版本显示,表明安装成功
3.3 安装Nginx
下载 Nginx,下载地址:http://nginx.org/download/nginx-1.6.2.tar.gz
wget http://nginx.org/download/nginx-1.6.2.tar.gz
解压安装包
tar zxvf nginx-1.6.2.tar.gz
进入安装包目录
cd nginx-1.6.2
编译安装
./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
make
make isntall
注意,编译安装的路径要按照实际安装的路径来,本次是在/usr/local/src下
查看nginx版本
/usr/local/webserver/nginx/sbin/nginx -v
若有版本显示,表明安装成功
4.nginx的配置
nginx的配置文件在/usr/local/webserver/nginx/conf/nginx.conf下,我们只要修改nginx.conf的内容就可以修改Nginx的配置
配置文件的格式如下
main # 全局设置
events { # Nginx工作模式
....
}
http { # http设置
....
upstream myproject { # 负载均衡服务器设置
.....
}
server { # 主机设置
....
location { # URL匹配
....
}
}
server {
....
location {
....
}
}
....
}
4.1 main模块
main区域是一个全局设置
#user 来指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。
user nobody;
#指定了Nginx要开启的子进程数。每个Nginx进程平均耗费10M~12M内存。根据经验,一般指定1个进程就足够了,如果是多核CPU,建议指定和CPU的数量一样的进程数即可。我这里写2,那么就会开启2个子进程,总共3个进程。
worker_processes 1;
#error_log 来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
#pid 来指定进程id的存储文件位置。
pid logs/nginx.pid;
4.2 events模块
events模块来用指定nginx的工作模式和工作模式及连接数上限,一般是这样
events {
use kqueue; #用来指定Nginx的工作模式
#指定Nginx的单个进程的最大连接数,即接收到的前端的最大请求数,默认为1024
worker_connections 1024;
}
4.3 http模块
http是Nginx的核心模块,它负责http服务器相关属性的配置,里面的server和upstream子模块至关重要,我们在设置方向代理、负债均衡以及虚拟目录等的时候,就是依赖于这两个模块的配置
http {
#设定mime类型,类型由mime.type文件定义
include /etc/nginx/mime.types;
#设定了默认的类型为二进制流,也就是当文件类型未定义时使用这种方式
default_type application/octet-stream;
#用于设置日志的格式,和记录哪些参数,这里设置为main,刚好用于access_log来纪录这种类型。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#设定日志文件,后面的main是日志的格式样式,对应于log_format的main。
access_log /var/log/nginx/access.log main;
#用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞。
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。
keepalive_timeout 10;
#设定负载均衡的服务器列表
upstream load_balance_server {
......
}
#HTTP服务器
server {
......
}
}
4.3.1 upstream模块
upstream主要负责负载均衡,通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。
upstream test.com{
ip_hash;
server 123.206.117.62:80;
server 123.206.117.62:80 down;
server 123.206.117.62:8080 max_fails=3 fail_timeout=20s;
server 123.206.117.62:8080;
}
-
上面的代码,test.com是upstream指定的负载均衡器的名称,这个名称可以任意指定,在后面需要的地方直接调用即可。
-
ip_hash这是其中的一种负载均衡调度算法,Nginx的负载均衡模块目前支持4种调度算法:
weight 轮询(默认)。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。weight。指定轮询权值,weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
ip_hash。每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。
fair(第三方)。比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
url_hash(第三方)。按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx的hash软件包。
- server指定的是各种服务器,包括服务器的ip、端口以及每个后端服务器在负载均衡中的状态,常用的状态有:
- down,表示当前的server暂时不参与负载均衡。
- backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
- max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
- fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
注意:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。其它情况可以是weight,表示负载的权重,默认为1,weight越大,权重越大。
4.3.2 server模块
server模块是http的子模块,它用来定一个虚拟主机,它的基本配置如下
server {
#指定虚拟主机的服务端口
listen 8080;
#用来指定IP地址或者域名,多个域名之间用空格分开。
server_name localhost 123.206.117.62 www.test.com;
# 全局定义,如果都是这一个目录,这样定义最简单。
root /Users/marscheng/www; #示在这整个server虚拟主机内,全部的root web根目录。注意要和locate {}下面定义的区分开来。
index index.php index.html index.htm; #全局定义访问的默认首页地址。注意要和locate {}下面定义的区分开来。
charset utf-8;#网页的默认编码格式
#用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式
access_log usr/local/var/log/host.access.log main;
#错误日志文件
error_log usr/local/var/log/host.error.log error;
#用于定位的配置
location / {
....
}
}
location模块
location模块一般是在server中定义的,它在Nginx中用的最多,无论是负载均衡、反向代理还是虚拟域名,都跟它的配置有关。
location是用来定位,解析url,定位URL,所以,它也提供了强大的正则匹配功能,也支持条件判断匹配,用户可以通过location指令实现Nginx对动态、静态网页进行过滤处理。
- 设定默认首页和虚拟机目录
location / {
#指令用于指定访问根目录时,虚拟主机的web目录,这个目录可以是相对路径(相对路径是相对于nginx的安装目录)。也可以是绝对路径。
root /Users/marscheng/www;
#用于设定我们只输入域名后访问的默认首页地址,有个先后顺序:index.php index.html index.htm,如果没有开启目录浏览权限,又找不到这些默认首页,就会报403错误。
index index.jsp index.html index.htm;
}
- 用正则表达式匹配
location ~ \.html$ { #匹配.html结尾的URL,用来解析html文件。里面的root也是一样,用来表示虚拟主机的根目录。
root /Users/marscheng/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.html;
include fastcgi.conf;
}
这里只是简单介绍,详细的配置可以参考这篇文章:
http://seanlook.com/2015/05/17/nginx-location-rewrite/
网上还有一篇介绍Nginx比较好的,文章,地址如下:
http://www.jianshu.com/p/bed000e1830b
5.方案设计
根据场景设计了如下的配置方案:
http {
#此处省略一些基本配置
upstream product_server{
server 9.236.2.35:8081;
}
upstream admin_server{
server 9.236.2.36:8082;
}
upstream finance_server{
server 9.236.2.37:8083;
}
server {
#此处省略一些基本配置
#根据不同正则匹配默认指向不同的的server
location / {
proxy_pass http://product_server;
}
location /product/{
proxy_pass http://product_server;
}
location /admin/ {
proxy_pass http://admin_server;
}
location /finance/ {
proxy_pass http://finance_server;
}
}
}