当前位置:首页 > 技术文章 > 正文内容

Centos7学习笔记(二十)- nginx代理与负载均衡

ivker_lee4年前 (2021-10-17)技术文章387

一、代理类型

正向代理:-----------为访问客户端服务,dns解析,是在代理端。如科学上网。

反向代理:------------为服务器回应请求服务,dns解析,是在客户端本地完成。如多域名反代指向同一IP地址。


二、nginx代理支持的协议

http--------代理超文本传输协议   -----------http server

https--------代理http/https协议 ------------https server

tcp -----------代理tcp/udp协议   ------------ TCP server

websocket-----------代理http1.1长连接通讯协议----------websocket server

grpc-------------代理go语言远程过程调用 ----------grpc server

pop/imap---------代理邮件收发协议----------------mail server

rtmp--------------代理流媒体、直播、点播------------media server

上述不同代理所涉及的模块:

http/https访问方面——

ngx_http_proxy_module——指令:proxy_pass

ngx_http_fastcgi_module——指令:fastcgi_pass                                ##php代理

ngx_http_uwsgi_module——指令: uwsgi_pass                                ##说明:这个uwsgi是代理python的

websocket和grpc访问方面——

ngx_http_proxy_module——指令:proxy_pass                    ##此处代理socket

ngx_http_v2_module——此处无对应指令,grpc调用依赖该模块


三、代理的语法

1、反向代理配置的语法

syntax: proxy_pass URL;

Default: -

context:    location,if in location,limit_except

一个实例:

server {

        listen    80;

        server_name    web.example.com;

        location / {

                proxy_pass    http://100.10.1.7:80;

                proxy_set_header    Host    $http_host;                                    《===========这一行的作用是将代理请求的header头中主机信息,传递到后端主机,使后端识别具体请求的是哪个网站。

        }

}

2、代理相关参数:

简单来说,代理的相关参数,都是为了解决代理过程中产生的相关问题而设置的。

proxy_set_header    Host    $http_host;                                      《===========为了解决把header头中的host信息传递到后端的问题

proxy_http_version    1.1;                                                    《============代理和后端主机之间,默认是用http1.0协议进行短连接的。

proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;                    《==========解决代理过程中,把客户端(也可能是上一级代理)的真实IP地址,由代理主机传递给后端主机的问题

proxy_set_header    X-Real-IP    $remote_addr;                                    《==========在只有一层代理关系下,X-Real-IP和上面X-Forwarder-For作用是一样的,都是传递客户端的真实IP。区别是,后者能把多层代理过程中的不同代理主机的IP地址,一起传递向后端主机。如果需要在access_log日志文件中记录,则log_format调用的变量为$http_x_real_ip

proxy_connect_timeout    time;             《===========代理与后端连接的超时时间,超过该时间值,那么nginx代理给客户端响应504错误,默认值60s,可修改短。

proxy_read_timeout    time;                    《==========代理等待后端服务器的响应时间,默认值60s,可适当修改。

proxy_send_timeout    time;                    《==========后端服务器数据回传给nginx代理的超时时间,默认值60s,可根据回传数据量适当加大。


proxy_buffering    on|off;                        《==========nginx代理会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传,而不是全部接收完再传给客户端

————补充:   如果proxy_buffering开启,nginx假定被代理的后端服务器会以最快速度响应,并把内容保存在由指令 proxy_buffer_size 和 proxy_buffers 指定的缓冲区里边.
    如果响应body无法放在内存里边,那么部分内容会被写到磁盘上。
    如果proxy_buffering被关闭了,那么响应body会按照获取body的多少立刻同步传送到客户端。nginx不尝试计算被代理服务器整个响应body的大小,nginx能从服务器接受的最大数据,是由指令 proxy_buffer_size指定的。
    对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作。
    但是无论proxy_buffering是否开启,proxy_buffer_size都是生效的

proxy_buffer_size    size;                        《==========设置nginx代理用于保存用户头信息的缓冲区大小,默认值4K或者8K。

————通俗一点解释:这个值是用于存储后端响应的header头信息的,一般而言,header头信息不超过该值大小,但是如果超过了,会报错的。——Nginx使用该大小申请read_buf,即大小指定了 upstream header 最大长度,如果响应头超过了这个长度,Nginx会报upstream sent too big header错误,然后client收到的是502。——还有最重要的一点,这个proxy_buffer_size大小,在proxy_buffering设定为off时,也是生效的。

proxy_buffers        number    size;            《==========nginx代理用于存储后端主机响应的内容主体(body),定义了其数量(最大数量)大小。一个缓冲区的大小,默认值可能是4K或者8K。具体要看系统平台。

—————进一步补充:在ngixn处理时,并不是一下就开辟最大数量的缓冲区个数的,而是根据body大小,逐步增加个数直至达到最大大小。

proxy_busy_buffers_size    size;                    《===========proxy_busy_buffers_size不是独立的空间,他是proxy_buffers和proxy_buffer_size的一部分。

—————补充:nginx会在没有完全读完后端响应就开始向客户端传送数据,所以它会划出一部分busy状态的buffer来专门向客户端传送数据(建议为proxy_buffers中单个缓冲区的2倍),然后它继续从后端取数据。

                               proxy_busy_buffers_size参数用来设置处于busy状态的buffer有多大。

                            1)如果完整数据大小小于busy_buffers大小,当数据传输完成后,马上传给客户端;

                            2)如果完整数据大小不小于busy_buffers大小,则装满busy_buffers后,马上传给客户端。


proxy_temp_path    path    [level1  [level2 [level3]]];                        《==========定义proxy的临时文件存在目录以及目录的层级。默认目录名是proxy_temp。通常,yum安装并启动的nginx的话,绝对路径是/var/cache/nginx/proxy_temp

——————补充:官方文档中的例子是这样的:

                        proxy_temp_path    /spool/nginx/proxy_temp    1 2;

                        那么意思就是在proxy_temp目录下,可以支持有三层子目录结构。实际生成效果可能是这样的

                        proxy_temp_path    /spool/nginx/proxy_temp/7/45/00000123457                                《=========最后的00000123457是文件名

                        这里的level1、2、3,如果有值,就代表有一级、二级、三级子目录。而目录名完全是数字命名,这里的具体的值就是代表目录名的数字位数。

proxy_max_temp_file_size    size;                    《=======临时文件的总大小。默认值1024m

proxy_temp_file_write_size    size;                        《=========设置同时写入临时文件的数据量的总大小。通常设置为8k或者16k。默认是proxy_buffer_size和proxy_buffers中设置的缓冲区大小的2倍,Linux下一般是8k


fastcgi_buffers    number    size;                    《=========类似proxy_buffers,基于php解析

fastcgi_buffer_size    size;                               《=========类似proxy_buffer_size

(proxy_buffers、proxy_busy_buffers_size、proxy_buffer_size、proxy_buffering的作用域都是http、server、location。)

通常的做法中,把上面这些参数,统一写到/etc/nginx/proxy_params文件中

示例:

proxy_set_header        Host    $http_host;
proxy_http_version      1.1;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_connect_timeout   30s;
proxy_read_timeout      60s;
proxy_send_timeout      100s;

proxy_buffering on;
proxy_buffer_size       32k;
proxy_buffers   8       128k;
proxy_busy_buffers_size 256k;


四、nginx的负载均衡

nginx要实现负载均衡需要使用到proxy_pass代理模块配置

nginx负载均衡与nginx代理不同地方在于,nginx代理一个location只能代理一台服务器,而nginx负载均衡则是将客户端请求代理转发至一组upstream虚拟服务池

具体体现是使用upstream指令,它的写法如下:

upstream    name    {...}

其作用域是http。

upstream  web {

        server  172.16.1.7:80;

        server  172.16.1.8:80;

        server  172.16.1.9:80;

        server  172.16.1.10:80;

        }

server {

        listen  80;

        server_name     test.hcrbbs.top;

        location / {

                proxy_pass      http://web;

                include proxy_params;                                        《=======这里引用了上面的proxy_params文件中的所有代理参数。

                }

        }

多段upstream,需要多段server去对应使用。


案例:

使用nginx负载均衡时,如何将后端请求超时的服务器流量平滑的切换到另一台上。

如果后台服务连接超时,Nginx是本身是有机制的,如果出现一个节点down掉的时候,Nginx会更据你具体负载均衡的设置,将请求转移到其他的节点上,但是,如果后台服务连接没有down掉,但是返回错误异常码了如:504、502、500,这个时候你需要加一个负载均衡的设置,如下:

proxy_next_upstream error timeout http_500 http_502 http_503 http_504;


nginx负载均衡的调度算法:

轮询按时间顺序逐一分配到不同的后端服务器
weight
加权轮询,weight值越大,被分配到的几率越高
ip_hash
每个请求按访问IP的hash结果分配,这样来自同一个IP的固定访问一个后端服务器
url_hash
按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器
least_conn
最少连接,哪个机器连接数少就分发

weight调度算法用在后端服务器性能不一的情况,性能高,则可以赋予更高的加权值。默认的weight值是1。

weight调度示例:

upstream  web {

        server  172.16.1.7:80    weight=10;

        server  172.16.1.8:80    weight=3;

        server  172.16.1.9:80    weight=5;

        server  172.16.1.10:80    weight=1;

        }


ip_hash调度算法不能和weight加权轮询算法一起用。前者在使用时,又容易带来问题,比如,一个有大量的电脑的内网,他们都是NAT转发到同一个公网IP地址去访问web服务器,那么在负载均衡后端的某一主机,就会负载过大。

ip_hash调度示例:

upstream  web {

        ip_hash;

        server  172.16.1.7:80;

        server  172.16.1.8:80;

        server  172.16.1.9:80;

        server  172.16.1.10:80;

        }


nginx负载均衡后端状态:

对于nginx负载均衡来说,其后端主机,可以有几种状态来表述,不同的状态,有不同的用途或者处理方法。

down当前服务器暂时不参与负载均衡
backup
预留的备份服务器
max_fails
允许请求失败的次数
fail_timeout经过max_fails失败后,服务暂停的时间
max_conns限制最大的接收连接数

down状态一般用于停机维护:

upstream  web {

        server  172.16.1.7:80        down;

        server  172.16.1.8:80;

        server  172.16.1.9:80;

        server  172.16.1.10:80;

        }

backup用于指定某后端主机做备份机器,当服务池中其他服务器都不可用时,才会启用backup。

upstream  web {

        server  172.16.1.7:80        down;

        server  172.16.1.8:80;

        server  172.16.1.9:80;

        server  172.16.1.10:80        backup;

        }

max_fails和fail_timeout是一起使用,用于后端主机状态检查。但其实无法直观的查看后端主机的状态指标,属于允许过程检测机制。

upstream  web {

        server  172.16.1.7:80;

        server  172.16.1.8:80        max_fails=2    fail_timeout=5s;                    《=========表示fail_timeout超时失败5秒后,记一次fail,最大允许fail次数max_fails是2次,2次后标记该主机down。

        server  172.16.1.9:80        max_fails=2    fail_timeout=5s;

        server  172.16.1.10:80 ;

        }


使用第三方模块来监测nginx负载均衡后端的主机状态,有一个叫nginx_upstream_check_module的模块。但这里涉及一个问题,由于nginx是yum方式安装,需要重新编译安装来集成这个第三方模块。执行如下:

yum install -y gcc glibc gcc-c++    pcre  pcre-devel openssl-devel  patch                           《=======安装编译依赖环境

nginx -v                                                《==========获取当前的nginx版本

wget https://nginx.org/download/nginx-1.20.1.tar.gz                        《==========下载对应版本的源码包

wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/refs/heads/master.zip                            《======下载当前最新的nginx_upstream_check_module模块的源码包

tar xf  nginx-1.20.1.tar.gz                《=====解压nginx源码

unzip master.zip                            《======解压模块源码

pwd                                            《======获取当前目录,以便给后面编译添加绝对路径,此时为/hom/study。

nginx -V                            《=========获取当前的yum安装的nginx所使用的参数,参数部分全部复制出来

cd nginx-1.20.1                    《========进入nginx源码目录

patch     -p1    <../nginx_upstream_check_module-master/check_1.20.1+.patch                    《=========用p1表示当前在ningx源码目录下,p0表示不在。此处是给源码打补丁,附加模块功能。


sudo ./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-compat --with-debug --with-file-aio --with-google_perftools_module --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_degradation_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_perl_module=dynamic --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-threads --add-module=/home/study/nginx_upstream_check_module-master/ --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'


然后是漫长排错期。如下安装了N多依赖软件

sudo yum -y install openssl-devel  libxml2 libxslt libxml2-devel libxslt-devel gd gd-devel perl-devel perl-ExtUtils-Embed gperftools-devel

最后(如果sudo报错,需用root用户执行)

make && make install


然后是健康监测模块的调用,示例:

upstream  web {

        server  172.16.1.7:80    max_fails=2    fail_timeout=5s;

        server  172.16.1.8:80        max_fails=2    fail_timeout=5s;

        server  172.16.1.9:80        max_fails=2    fail_timeout=5s;

        server  172.16.1.10:80    max_fails=2    fail_timeout=5s ;

        check interval=3000    rise=2    fall=3    timeout=1000    type=tcp;                                    《===========这里的3000和1000都是毫秒,rise表示成功次数,表示up,fail表示失败次数,然后标记down

        check_http_send "HEAD HTTP/1.0\r\n\r\n";

        check_http_expect_alive http_2xx http_3xx;

        }

server {

        listen  80;

        server_name     test.hcrbbs.top;

        location / {

                proxy_pass      http://web;

                include proxy_params;                                        

                }

        location  /status {

                check_status;

                access_log off;

                allow 10.0.0.0/24;

                deny all;

                }

        }

上述示例中涉及的指令的具体解释:

interval:向后端发送的健康检查包的间隔,单位为毫秒。

fall(fall_count): 如果连续失败次数达到fall_count,服务器就被认为是down。

rise(rise_count): 如果连续成功次数达到rise_count,服务器就被认为是up。

timeout: 后端健康请求的超时时间,单位毫秒。

default_down: 设定初始时服务器的状态,如果是true,就说明默认是down的,如果是false,就是up的。默认值是true,也就是一开始服务器认为是不可用,要等健康检查包达到一定成功次数以后才会被认为是健康的。

type:健康检查包的类型,现在支持以下多种类型:

tcp:简单的tcp连接,如果连接成功,就说明后端正常。

ssl_hello:发送一个初始的SSL hello包并接受服务器的SSL hello包。

http:发送HTTP请求,通过后端的回复包的状态来判断后端是否存活。

mysql: 向mysql服务器连接,通过接收服务器的greeting包来判断后端是否存活。

ajp:向后端发送AJP协议的Cping包,通过接收Cpong包来判断后端是否存活。

port: 指定后端服务器的检查端口。你可以指定不同于真实服务的后端服务器的端口,比如后端提供的是443端口的应用,你可以去检查80端口的状态来判断后端健康状况。默认是0,表示跟后端server提供真实服务的端口一样。该选项出现于Tengine-1.4.0。

指令完整语法:

Syntax:  check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [default_down=true|false] [type=tcp|http|ssl_hello|mysql|ajp] [port=check_port]

Default: 如果没有配置参数,默认值是:interval=30000 fall=5 rise=2 timeout=1000 default_down=true type=tcp

Context: upstream


Syntax: check_http_send http_packet

Default: GET / HTTP/1.0\r\n\r\n

Context: upstream

该指令可以配置http健康检查包发送的请求内容。为了减少传输数据量,推荐采用&quot;HEAD&quot;方法。

当采用长连接进行健康检查时,需在该指令中添加keep-alive请求头,如:&quot;HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n&quot;。 同时,在采用&quot;GET&quot;方法的情况下,请求uri的size不宜过大,确保可以在1个interval内传输完成,否则会被健康检查模块视为后端服务器或网络异常。


Syntax: check_http_expect_alive [ http_2xx | http_3xx | http_4xx | http_5xx ]

Default: http_2xx | http_3xx

Context: upstream

该指令指定HTTP回复的成功状态,默认认为2XX和3XX的状态是健康的。

image.png

status页面解释:

server number是后端服务器的数量

generation是Nginx reload的次数

Index是服务器的索引

Upstream是在配置中upstream的名称

Name是服务器IP

Status是服务器的状态

Rise是服务器连续检查成功的次数

Fall是连续检查失败的次数

Check type是检查的方式

Check port是后端专门为健康检查设置的端口


五、redis解决缓存问题

1、准备一台或多台redis服务器,安装redis

yum -y install redis

2、设置redis,使其监听在内网的网段。

sed -i '/^bind/c bind 127.0.0.1 172.16.1.61'  /etc/redis.conf                                    《=========这里172.16.1.61是redis服务器自身的内网IP地址

3、启动redis

systemctl enable redis

systemctl start redis

4、web服务器端,补充安装php71w-pecl-redis模块

yum -y install php71w-pecl-redis

(PS:一定要检查一下这个依赖模块是否已经安装,否则,会出现“session_start(): Cannot find save handler 'redis' - session startup failed”的错误)

5、修改/etc/php.ini文件中session的配置

这里,可以参考/etc/php-zts.d/redis.ini文件中的示例,来修改/etc/php.ini文件

示例内容为:

; phpredis can be used to store PHP sessions. 
; To do this, uncomment and configure below
;session.save_handler = redis
;session.save_path = "tcp://host1:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2"

php.ini文件内容修改有三处。

修改前修改后
session.save_handler = filessession.save_handler = redis
;session.save_path = "/tmp"session.save_path = "tcp://172.16.1.61:6379"                       《======此处根据需求修改
session.auto_start = 0

session.auto_start = 1

6、注释掉/etc/php-fpm.d/www.conf文件中相关行

;php_value[session.save_handler] = files                                                        《=======提醒:该文件用“;”进行注释

;php_value[session.save_path]    = /var/lib/php/session                                《=======提醒:该文件用“;”进行注释

7、重启php-fpm服务

systemctl restart php-fpm

8、将配置好的php.ini文件和www.conf文件,推送到其他web服务器端

scp -r -P52113 /etc/php.ini root@172.16.1.8:/etc/php.ini

scp -r -P52113 /etc/php-fpm.d/www.conf  root@172.16.1.8:/etc/php-fpm.d/www.conf

9、将所有web端服务器的php-fpm服务重启并检查

systemctl restart php-fpm

systemctl status php-fpm


六、nginx的四层负载均衡

1、四层负载均衡仅能做TCP/IP、UDP协议的转发,通常是用来做端口转发。

2、四层负载均衡可以用来解决七层负载均衡中的端口限制问题。(七层负载均衡中,最大使用的端口数量是65535)所以四层负载均衡通常用来解决大规模集群、高并发连接的情形。

3、四层负载均衡可以解决七层负载均衡的高可用问题。(四层负载均衡在七层负载均衡前端,能实现七层负载均衡的高可用)

4、四层负载均衡的转发效率比七层高很多,但仅支持tcp/ip协议,不支持http和https协议。后2者是七层协议。

nginx四层负载均衡示例:

1、准备两台七层负载均衡lb01、lb02,IP地址分别是172.16.1.5和172.16.1.6,并均配置使用nginx_upstream_check_module模块。 并对后端172.16.1.17-20的web服务器做负载均衡。示例配置:

upstream  php {
        server  172.16.1.17:80;
        server  172.16.1.18:80;
        server  172.16.1.19:80;
        server  172.16.1.20:80;
        check interval=3000    rise=2    fall=3    timeout=1000    type=tcp;
        }
server {
        listen  80;
        server_name     php.hcrbbs.top;
        location / {
                proxy_pass      http://php;
                include proxy_params;
                proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
                }
         location  /status {
                check_status;
                access_log off;
                allow 10.0.0.0/24;
                deny all;
                }
        }

proxy_next_upstream的作用:如果后台服务连接超时,Nginx是本身是有机制的,如果出现一个节点down掉的时候,Nginx会更据你具体负载均衡的设置,将请求转移到其他的节点上,但是,如果后台服务连接没有down掉,但是返回错误异常码了如:504、502、500,这个时候你需要加一个负载均衡的设置,如下:
proxy_next_upstream http_500 | http_502 | http_503 | http_504 |http_404;
意思是,当其中一台返回错误码404,500...等错误时,可以分配到下一台服务器程序继续处理,提高平台访问成功率。

2、准备一台四层负载均衡proxy4_01,IP地址为172.16.1.3和10.0.0.3,按照官方方法,yum安装好nginx。并确定nginx是否带有--with-stream模块。

yum -y install nginx

nginx -V                                                《============此处,查看结果中是否有--with-stream参数。如果没有此参数,或者是--with-stream=dynamic,都要重新编译nginx,添加该模块。

3、四层负载均衡配置

先看nginx.conf文件配置:

include /etc/nginx/conf.c/*.conf;

conf.c目录下的proxy4_domain.conf文件内容:

stream {
        upstream lb {
                server 172.16.1.5:80;
                server 172.16.1.6:80;
        }
        server {
                listen 80;
                proxy_connect_timeout 3s;
                proxy_pass      lb;
        }
}

注意:如果nginx.conf文件中server段是配置监听在80端口的,需要改掉80端口为其他端口或者把server段注释掉。

4、四层负载均衡的日志配置

server {
        log_format      proxy   '$remote_addr - $remote_port - [$time_local] - $server_addr - $server_port  $protocol '
                                 '"$status" "$bytes_received" "$upstream_addr" "$upstream_bytes_sent" "upstream_connec_time"';
        access_log      /var/log/nginx/proxy.log  proxy;
        upstream xxx {
        }  
        ......
}


七、nginx实现动静分离

动静分离的实现分为两类,一类是单台web实现动静分离。一类是基于web架构,通过七层负载均衡来实现动态资源和静态资源请求的分离。

单台web的动静分离——比如对一些纯静态资源,如js文件、jgp文件、css文件、gif文件、mp4文件等的请求,直接用location来处理定位。示例配置如下:

     location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
             expires max;
             log_not_found off;
     }
     location ~* /robots.txt {
             deny all;
     }

基于web架构的动静分离

基于web架构的动静分离,一般都是根据实际应用程序场景,决定动静分离是在七层负载均衡端实现,还是后端web服务器上去实现。由于演示代码环境不太好搭建,以下,仅抄录网上的一些配置实例,提供动静分离处理的思路。

user www;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
pid /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 102400;
events
{
use epoll;
worker_connections 102400;
}
http
{
  include       mime.types;
  default_type  application/octet-stream;
  fastcgi_intercept_errors on;
  charset  utf-8;
  server_names_hash_bucket_size 128;
  client_header_buffer_size 4k;
  large_client_header_buffers 4 32k;
  client_max_body_size 300m;
  sendfile on;
  tcp_nopush     on;
  keepalive_timeout 60;
  tcp_nodelay on;
  client_body_buffer_size  512k;
  proxy_connect_timeout    5;
  proxy_read_timeout       60;
  proxy_send_timeout       5;
  proxy_buffer_size        16k;
  proxy_buffers            4 64k;
  proxy_busy_buffers_size 128k;
  proxy_temp_file_write_size 128k;
  gzip on;
  gzip_min_length  1k;
  gzip_buffers     4 16k;
  gzip_http_version 1.1;
  gzip_comp_level 2;
  gzip_types       text/plain application/x-javascript text/css application/xml;
  gzip_vary on;
###2012-12-19 change nginx logs
log_format  main  '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent"  $request_time $remote_addr';
#这里为后端服务器wugk应用集群配置,根据后端实际情况修改即可,tdt_wugk为负载均衡名称,可以任意指定
#但必须跟vhosts.conf虚拟主机的pass段一致,否则不能转发后端的请求。
upstream tdt_wugk {
    server   10.10.141.30:8080 weight=1max_fails=2fail_timeout=30s;
    server   10.10.141.30:8081 weight=1max_fails=2fail_timeout=30s;
    server   10.10.141.31:8080 weight=1max_fails=2fail_timeout=30s;
    server   10.10.141.31:8081 weight=1max_fails=2fail_timeout=30s;
    server   10.10.141.32:8080 weight=1max_fails=2fail_timeout=30s;
    server   10.10.141.32:8081 weight=1max_fails=2fail_timeout=30s;
}
#这里为后端APP应用负载均衡配置,根据后端实际情况修改即可。tdt_app为负载均衡名称,可以任意指定
upstream tdt_app {
    server   10.10.141.40:8080 weight=1max_fails=2fail_timeout=30s;
    server   10.10.141.40:8081 weight=1max_fails=2fail_timeout=30s;
    server   10.10.141.41:8080 weight=1max_fails=2fail_timeout=30s;
    server   10.10.141.41:8081 weight=1max_fails=2fail_timeout=30s;
    server   10.10.141.42:8080 weight=1max_fails=2fail_timeout=30s;
    server   10.10.141.42:8081 weight=1max_fails=2fail_timeout=30s;
}
#include引用vhosts.conf,该文件主要用于配置Nginx 虚拟主机
include vhosts.conf;
}

vhosts.conf文件内容:

####www.wuguangke.cn
server
  {
    listen       80;
    server_name  www.wuguangke.cn;
    index index.html index.htm;
#配置发布目录为/data/www/wugk
    root  /data/www/wugk;
    location /
    {
         proxy_next_upstream http_502 http_504 error timeout invalid_header;
         proxy_set_header Host  $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_pass http://tdt_wugk;
         expires      3d;
    }
#动态页面交给http://tdt_wugk,也即我们之前在nginx.conf定义的upstream tdt_wugk 均衡
    location ~ .*\.(php|jsp|cgi)?$
    {
         proxy_set_header Host  $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_pass http://tdt_wugk;
    }
#配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
    {
    root /data/www/wugk;
    #expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
    expires      3d;
    }
#定义Nginx输出日志的路径
    access_log  /data/logs/nginx_wugk/access.log main;
    error_log   /data/logs/nginx_wugk/error.log  crit;
}
##########chinaapp.sinaapp.com 2012-12-19
  server
  {
    listen       80;
    server_name  chinaapp.sinaapp.com;
    index index.html index.htm;
    root  /data/www;
    location /
    {
         proxy_next_upstream http_502 http_504 error timeout invalid_header;
         proxy_set_header Host  $host;
         proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_pass http://tdt_app;
         expires      3d;
    }
    location ~ .*\.(php|jsp|cgi)?$
    {
         proxy_set_header Host  $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_pass http://tdt_app;
    }
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
    {
    root /data/www/app;
    expires      3d;
    }
    access_log  /data/logs/nginx_app/access.log main;
    error_log   /data/logs/nginx_app/error.log  crit;
}




分享给朋友:

相关文章

Centos7学习笔记(四)——grep、sed、awk

Centos7学习笔记(四)——grep、sed、awk

1、grep——print lines matching a pattern打印匹配内容的行(多行)命令格式:grep [参数] 过滤匹配内容 [文件名]或者grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]常用参数:-v 取反过滤 ◆◆-i 忽略大小写  ◆◆(find 命令可以用-iname)-n 对过滤后的内容,显示源文件行号  ◆◆-w 按单词为单位过滤。◆◆-o只输出匹配的内容。◆◆-E使用扩展规则-r...

Centos7学习笔记(八)-基础命令(三)

Centos7学习笔记(八)-基础命令(三)

1、rsync作为一个同步(备份,增量备份)命令,它的选项非常的多,常用的组合是avz,当然,如果需要建立备份服务,那么-n必然是用的多的参数选项。关于rsync的用法详细说明,参考网上的这篇原文链接:https://www.cnblogs.com/f-ck-need-u/p/7220009.html#blog21,文章写的非常好,有大量的通俗易懂的例子及解释。以下关于rsync参数选项的说明,就抄录自该文章。v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细...

 Centos7学习笔记(十一)- nfs服务器搭建

Centos7学习笔记(十一)- nfs服务器搭建

nfs服务本质上是通过rpc调用提供服务的,所以,其依赖rpcbind程序相关组件运行。而且,rpc服务必须先启动,nfs服务才能正常使用。以下是安装配置:1、服务端a)安装软件yum -y install nfs-utils rpcbind                                    &nb...

Centos7学习笔记(二十一)- nginx的rewrite

Centos7学习笔记(二十一)- nginx的rewrite

一、什么是rewriterewirte就是实现Url地址重写,以及重定向,就是把传入的web请求重定向到其他URL的过程。二、rewrite的使用场景a、url地址的跳转。比如访问www.example.com/test,重定向到test.example.com网址。b、协议的跳转,主要的就是实现http协议跳转到https页面去。c、实现网站的伪静态。伪静态就是将网站动态页面的诸多参数,显示为一种静态页面的方式,以便于搜索引擎记录,减少URL地址暴露过多参数,提高安全性。d、通过上述伪静态,产...

Linux新学

Linux新学

[TOC]基础命令find与lsls1 .只显示目录ls -F | grep "/$"-F 文件类型(File type)。在每一个列举项目之后添加一个符号。这些符号包括: / 表明是一个目录; @ 表明是到其它文件的符号链接; * 表明是一个可执行文件ls -al | grep "^d"2.只显示文件ls -al | grep &quo...

phpldapadmin之config.php过滤

phpldapadmin之config.php过滤

完全过滤掉/*--------*/"和空行,以及”//“开头、”#“开头的行,sed  -e '/\/\*/,/\*\//d' config.php|grep -Ev "(^$)|(^(\/\/))|(^#)"sed  -e '/\/\*/,/\*\//d' -e '/^\/\//d' -e ...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。