1. nginx 的简单原理
nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。其特点是占用内存少,并发能力强。
如果使用nginx作为web服务器,那么nginx收到请求后将请求内容响应到客户端。如果使用nginx作为代理服务器,那么nginx收到请求后将请求转发到应用服务器(如tomcat),应用服务器处理完请求后将请求发送给nginx,然后nginx再将响应内容发送给客户端。
nginx是多进程架构,有一个主进程和若干个工作进程。主进程主要用来读取并检测配置文件,管理工作进程。工作进程用来处理客户端请求。nginx采用基于事件的模型和独立于操作系统的机制来高效地将请求分发到工作进程。

2. nginx 的安装
nginx可以使用yum源安装或者直接下载安装包,这里采用最简便的yum源安装,直接执行如下指令:

yum install nginx -y

安装完成后,打开nginx,使用yum源安装nginx,会自动将nginx配置乘service,执行以下指令即可打开nginx:

service nginx start

访问远程服务器的域名或IP即可看到nginx欢迎页面

CentOS6.7使用nginx提供静态资源服务,反向代理和负载均衡

3. nginx提供静态资源服务
nginx的一大经典使用场景就是提供静态资源服务,假设/var/www/html是静态资源所在的文件夹,那么可以通过修改配置文件来通过nginx处理这些静态资源。
nginx的默认配置文件在/etc/nginx/nginx.conf:

 # For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections  1024;
}

http {
    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  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
}

通过最后一行代码可以看到nginx.conf还导入了/etc/nginx/conf.d/*.conf里面的配置,可以在/etc/nginx/conf.d/default.conf中找到server配置代码(windows的配置文件路径是“nginx文件夹/conf/nginx.conf”):

server {
    listen       80;
    #listen       [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

然后开始配置静态资源服务器,在location / {}后面新增一个location配置:

location / {
}

location /html {
    root /var/www;
    index index.html;
}

保存文件后运行以下指令重新加载nginx以使配置生效:

service nginx reload

因为nginx是通过绝对路径访问静态资源的,所以访问http://www.test.cn/html (www.test.cn是远程服务器的域名或IP,后文会一直用来代替)会指向文件夹/var/www/html。
如果希望打开/var/www/html/test/index.html,则可以访问http://www.test.cn/html/test,不需要在路径上加上index.html,因为location中配置了index index.html。

CentOS6.7使用nginx提供静态资源服务,反向代理和负载均衡

location还支持正则表达式,我们可以用正则表达式来匹配html、css、js、png、jpg、gif、ico这些为扩展名的请求:

location ~* \.(html|css|js|png|jpg|gif|ico)$ {
    root /var/www;
} 

4. nginx反向代理
nginx的另一大经典使用场景就是作为反向代理服务器将对应的请求转发到应用服务器处理然后将应用服务器的响应内容返回给客户端。
通过配置location可以将客户端请求转发到配置的地址,先将tomcat的端口设置为8080(默认),然后打开tomcat。访问http://www.test.cn:8080可以打开tomcat欢迎页,然后配置nginx:

location / {
    #转发的应用服务器路径
    proxy_pass http://localhost:8080;
}

location /html {
    root /var/www;
    index index.html;
}

执行重新加载nginx指令后再次访问http://www.test.cn ,发现nginx的欢迎页面变成了tomcat的欢迎页面。
CentOS6.7使用nginx提供静态资源服务,反向代理和负载均衡

这就是最简单的反向代理。
**

  1. nginx负载均衡**
    上面演示了如何反向代理,但是如果请求量过大的时候,一台应用服务器显然是不能满足需求的,所以就需要多台服务器来实现负载均衡。
    首先将apache的端口设置为8082,然后执行打开apache指令(没有的请自行安装,这里不再赘述):

service httpd start

然后修改nginx配置:

upstream local_servers {
    server localhost:8080 weight=1;
    server localhost:8082 weight=1;
}

location / {
    #转发的应用服务器路径
    proxy_pass http://local_servers;
}

location /html {
    root /var/www;
    index index.html;
}

upstream是nginx的Http Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指定了一个负载均衡器的名称local_servers,这个名称可以任意指定,在后面需要用到的时候直接调用就可以了。
重新加载nginx后再多次访问http://www.test.cn ,发现tomcat和apache的欢迎页面都会出现,出现的频率大概是1:1。这就是upstream中weight的作用,表示weight表示权重,权重越大,请求转发到这个地址的概率就越大。

nginx的负载均衡目前支持4种调度算法,其中后两项属于第三方调度算法:

  • 轮询(默认)。每个请求按时间顺序分别分配到不同的后端服务器,如果一个后端服务器宕机,会被自动剔除,使用户访问不受影响。weight代表轮询权值,值越大,表示被访问的概率越高,通常用于多台后端服务器性能不均的情况下。
  • ip_hash。每个请求按IP的hash结果分配,这样同一个IP固定访问同一个后端服务器。貌似可以解决集群情况下session共享的问题,但个人认为不是理想的解决方式,当一台后端服务器宕机时,当前访客并不能无缝切换到其他后端服务器。
  • fair。这是比上面两个负载均衡算法更加智能的算法,此算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。nginx本身是不支持fair的,如果需要使用fair算法,需要先下载nginx的upstream_fair模块。
  • url_hash。此方法按访问url的hash结果来分配请求,使同一个url定位到同一个后端服务器,可以进一步提高后端缓存服务器的效率。nginx本身是不支持url_hash的,如果需要使用该算法,需要先下载nginx的hash软件包。

在Http Upstream模块中,可以通过server指令指定参与负载均衡的后端服务器的IP和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:

  • down,表示当前的server暂时不参与负载均衡。
  • backup,预留的备用机器,当所有的非backup机器都故障或者正忙时才调用这台机器,因此这台机器的压力最轻。
  • max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream模块定义的错误。
  • fail_timeout,在经历了max_fails次失败后,暂停服务fail_timeout秒,max_fails和fail_timeout一起使用。
    当负载均衡算法为ip_hash时,后端服务器在负载均衡调度中的状态不能为weight和backup。