nginx反向代理缓存服务器

一.正向代理和反向代理

正向代理: 用于代理内部网络对 Internet 的连接请求(如 VPN/NAT),客户端指定代理服务器,并
将本来要直接发送给目标Web服务器的HTTP请求先发送到代理服务器上, 然后由代理服务
器去访问 Web 服务器, 并将 Web 服务器的 Response 回传给客户端。

反向代理: 与正向代理相反,如果局域网向Internet提供资源,并让Internet上的其他用户可以
访问局域网内资源, 也可以设置一个代理服务器,
它提供的服务就是反向代理. 反向代理服
务器接受来自 Internet 的连接,然后将请求转发给内部网络上的服务器,并将 Response 回传给
Internet 上请求连接的客户端。

简单理解,就是正向代理是为客户端做代理,代替客户去访问服务器,而反向代理是为服务器做代理,代替服务器接受客户的请求。

二.nginx反向代理服务器

反向代理服务器 192.168.1.61
web节点1 192.168.1.62
web节点2 192.168.1.63

所需包下载:baaj

1.安装nginx

[root@lb ~]# yum -y install gcc gcc-c++ make libtool zlib zlib-devel pcre pcre-devel openssl openssl-devel  //安装前提环境和软件

[root@lb ~]# useradd -s /sbin/nologin nginx
[root@lb ~]# cd /usr/src/
[root@lb src]# ls
debug                nginx-goodies-nginx-sticky-module-ng-08a395c66e42.tar.gz
kernels              ngx_cache_purge-2.3.tar.gz
nginx-1.12.0.tar.gz
[root@lb src]# tar zxf nginx-goodies-nginx-sticky-module-ng-08a395c66e42.tar.gz 
[root@lb src]# tar zxf ngx_cache_purge-2.3.tar.gz 
[root@lb src]# tar zxf nginx-1.12.0.tar.gz 
[root@lb src]# cd nginx-1.12.0/
[root@lb nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx \
> --with-http_stub_status_module --with-http_realip_module --with-http_ssl_module \
> --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client \
> --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fcgi \
> --with-pcre --add-module=../ngx_cache_purge-2.3 --with-http_flv_module \
> --add-module=../nginx-goodies-nginx-sticky-module-ng-08a395c66e42 \
> && make && make install 
 

模块解释:结合 proxy 和 upstream 模块实现后端 web 负载均衡
使用 proxy 模块实现静态文件缓存
结合 nginx 默认自带的 ngx_http_proxy_module 模块 和 ngx_http_upstream_module 模块实现后端服务器的健康检查,也可以使用第三方模块 nginx_upstream_check_module
使用 nginx-sticky-module 扩展模块实现 Cookie 会话黏贴(保持会话)
使用 ngx_cache_purge 实现更强大的缓存清除功能

 

添加nginx为系统服务

[root@lb nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@lb nginx-1.12.0]# mkdir -p /var/tmp/nginx/client
[root@lb nginx-1.12.0]# chown -R nginx:nginx /var/tmp/nginx/
[root@lb nginx-1.12.0]# vim /etc/init.d/nginx
//添加


#!/bin/bash
# chkconfig: 2345 99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
 start)
 netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
 if [ $? -eq 0 ]
 then
 echo "Nginx service already running."
 else
 $PROG -t &> /dev/null
 if [ $? -eq 0 ] ; then 
 $PROG
 echo "Nginx service start success."
 else
 $PROG -t
 fi
 fi
 ;;
 stop)
 netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
 if [ $? -eq 0 ]
 then
 kill -s QUIT $(cat $PIDF)
 echo "Nginx service stop success." 
 else
 echo "Nginx service already stop"
 fi
 ;;
 restart)
 $0 stop
 $0 start
 ;;
 status)
 netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
 if [ $? -eq 0 ]
 then
 echo "Nginx service is running."
 else
 echo "Nginx is stop."
 fi
 ;; 
 reload)
 netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
 if [ $? -eq 0 ]
 then
 $PROG -t &> /dev/null
 if [ $? -eq 0 ] ; then
 kill -s HUP $(cat $PIDF)
 echo "reload Nginx config success."
 else
 $PROG -t
 fi
 else
 echo "Nginx service is not run." 
 fi 
 ;;
 *)
 echo "Usage: $0 {start|stop|restart|reload}"
 exit 1
esac

[root@lb nginx-1.12.0]# chmod +x /etc/init.d/nginx 
[root@lb nginx-1.12.0]# chkconfig --add nginx
[root@lb nginx-1.12.0]# systemctl start nginx
[root@lb nginx-1.12.0]# netstat -anput | grep nginx

[root@lb ~]# nginx -v  //查看nginx版本号

[root@lb ~]# nginx -V //查看模块

2.在节点服务器上添加首页

web1

[root@web1 ~]# echo "1.62" >/usr/share/nginx/html/index.html 
[root@web1 ~]# cat /usr/share/nginx/html/index.html
1.62

web2

[root@web2 ~]# echo "1.63" >/usr/share/nginx/html/index.html
[root@web2 ~]# cat /usr/share/nginx/html/index.html
1.63

3.反向代理

[root@lb ~]# vim /usr/local/nginx/conf/nginx.conf
//找到http字段并在里面添加

http { 
       .............
   
upstream backend {
server 192.168.1.62:80 weight=1; //web节点
server 192.168.1.63:80 weight=1;

}

//添加web节点后找到server字段引用

server {
         ..................
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://backend;   //引用upstream
        }
[root@lb ~]# nginx -t
[root@lb ~]# systemctl restart nginx.service

4.测试

[root@lb ~]# curl 192.168.1.61
1.62
[root@lb ~]# curl 192.168.1.61
1.63

三.其他

1.nginx-sticky-module 模块

这个模块的作用是通过 cookie 黏贴的方式将来自同一个客户端(浏览器)的请求发送到同一个后端服务器上处理,这样一定程度上可以解决多个 backend servers 的 session 同步的问题 —— 因为不再需要同步,而 RR 轮询模式必须要运维人员自己考虑 session 同步的实现。
另外内置的 ip_hash 也可以实现根据客户端 IP 来分发请求,但它很容易造成负载不均衡的情况,而如果 nginx 前面有 CDN 网络或者来自同一局域网的访问,它接收的客户端 IP 是一样的,容易造成负载不均衡现象。nginx-sticky-module 的 cookie 过期时间,默认浏览器关闭就过期。

这个模块并不合适不支持 Cookie 或手动禁用了 cookie 的浏览器,此时默认 sticky 就会切换成 RR。它不能与 ip_hash 同时使用。

nginx-sticky-module 的作用就是保持会话的。

[root@lb ~]# vim /usr/local/nginx/conf/nginx.conf
  ............
upstream backend {
        server 192.168.1.62:80;
        server 192.168.1.63:80;
        sticky; //配置起来超级简单,一般来说一个 sticky 指令就够了
}

2.load-balance 其它调度方案:

  • 轮询(默认) : 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight 值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
  • ip_hash : 每个请求按访问 IP 的 hash 结果分配,这样来自同一个 IP 的访客固定访问一个后端服务器,有效解决了动态网页存在的 session 共享问题。当然如果这个节点不可用了,会发到下个节点,而此时没有 session 同步的话就注销掉了。
  • least_conn :请求被发送到当前活跃连接最少的 realserver 上。会考虑 weight 的值。
  • url_hash : 此方法按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx 本身是不支持 url_hash 的,如果需要使用这种调度算法,必须安装 Nginx 的 hash 软件包 nginx_upstream_hash 。
  • fair :这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx 本身是不支持 fair 的,如果需要使用这种调度算法,必须下载 Nginx 的upstream_fair 模块。

3. 负载均衡与健康检查

严格来说,nginx 自带是没有针对负载均衡后端节点的健康检查的,但是可以通过默认自带的 ngx_http_proxy_module 模块和 ngx_http_upstream_module 模块中的相关指令来完成当后端节点出现故障时,自动切换到下一个节点来提供访问。

[root@lb ~]# vim /usr/local/nginx/conf/nginx.conf

upstream backend {
sticky;
server 192.168.31.141:80 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.31.250:80 weight=1 max_fails=2 fail_timeout=10s;
}

 参数解释:

weight : 轮询权值也是可以用在 ip_hash 的,默认值为 1

max_fails : 允许请求失败的次数,默认为 1。当超过最大次数时,返回 proxy_next_upstream模块定义的错误。

fail_timeout : 有两层含义,一是在 10s 时间内最多容许 2 次失败;二是在经历了 2 次失败以后,10s 时间内不分配请求到这台服务器。

三. nginx 的 的 proxy 缓存使用

缓存也就是将 js、css、image 等静态文件从后端服务器缓存到 nginx 指定的缓存目录下,既可以减轻后端服务器负担,也可以加快访问速度,但这样缓存及时清理成为了一个问题,所以需要 ngx_cache_purge 这个模块来在过期时间未到之前,手动清理缓存。
proxy 模块中常用的指令时 proxy_pass 和 proxy_cache.
nginx 的 web 缓存功能的主要是由 proxy_cache、fastcgi_cache 指令集和相关指令集完成,proxy_cache 指令负责反向代理缓存后端服务器的静态内容,fastcgi_cache 主要用来处理FastCGI 动态进程缓存。

[root@lb ~]# vim /usr/local/nginx/conf/nginx.conf 
............   
 #access_log  logs/access.log  main;

proxy_buffering on;
proxy_temp_path /usr/local/nginx/proxy_temp;
proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=my-cache:100m
inactive=600m max_size=2g;


..............

location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://backend;
        proxy_redirect off;
        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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_cache my-cache;
        add_header Nginx-Cache $upstream_cache_status;
        proxy_cache_valid 200 304 301 302 8h;
        proxy_cache_valid 404 1m;
        proxy_cache_valid any 1d;
        proxy_cache_key $host$uri$is_args$args;
        expires 30d;
        }

相关选项说明:

proxy_buffering on; 代理的时候,开启或关闭缓冲后端服务器的响应。当开启缓冲时,nginx 尽可能快地从被代理的服务器接收响应,再将它存入缓冲区中。

proxy_temp_path 缓存临时目录。后端的响应并不直接返回客户端,而是先写到一个临时文件中,然后被 rename 一下当做缓存放在 proxy_cache_path 。0.8.9 版本以后允许 temp和 cache 两个目录在不同文件系统上(分区),然而为了减少性能损失还是建议把它们设成一个文件系统上。

proxy_cache_path设置缓存目录,目录里的文件名是 cache_key 的 MD5 值。

levels=1:2 keys_zone=my-cache:50m 表示采用 2 级目录结构,第一层目录只有一个字符,是由levels=1:2设置,总共二层目录,子目录名字由二个字符组成。Web缓存区名称为my-cache,内存缓存空间大小为 100MB,这个缓冲 zone 可以被多次使用。文件系统上看到的缓存文件名类似于 /usr/local/nginx/proxy_cache/c/29/b7f54b2df7773722d382f4809d65029c 。
inactive=600 max_size=2g 表示 600 分钟没有被访问的内容自动清除,硬盘最大缓存空间为2GB,超过这个大学将清除最近最少使用的数据。

proxy_cache : 引用前面定义的缓存区 my-cache

proxy_cache_key :定义如何生成缓存的键,设置 web 缓存的 key 值,nginx 根据 key 值 md5哈希存储缓存。

proxy_cache_valid : 为不同的响应状态码设置不同的缓存时间,比如 200、302 等正常结果可以缓存的时间长点,而 404、500 等缓存时间设置短一些,这个时间到了文件就会过期,而不论是否刚被访问过。

add_header: 指令来设置 response header, 语法: add_header name value;$upstream_cache_status 这个变量来显示缓存的状态,我们可以在配置中添加一个 http 头来显示这一状态$upstream_cache_status 包含以下几种状态:

  • ·MISS 未命中,请求被传送到后端
  • ·HIT 缓存命中
  • ·EXPIRED 缓存已经过期请求被传送到后端
  • ·UPDATING 正在更新缓存,将使用旧的应答
  • ·STALE 后端将得到过期的应答

expires : 在响应头里设置 Expires:或 Cache-Control:max-age,返回给客户端的浏览器缓存失效时间。

 

下面的 nginx.conf 实现 nginx 在前端做反向代理服务器的完整配置文件的例子,处理 js、png等静态文件,jsp/php 等动态请求转发到其它服务器 tomcat/apache。进行参考

user www www;
worker_processes 4;  #worker进程,可以设置为cup的核数
worker_cpu_affinity 0001 0010 0100 1000;
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
worker_rlimit_nofile 10240;  #worker 进程的最大打开文件数限制
pid logs/nginx.pid;
events {
use epoll;  #nginx 默认使用 epoll 事件模型
worker_connections 4096; #每一个 worker 进程能并发处理(发起)的最大连接数
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'"$upstream_cache_status"';
access_log logs/access.log main;
server_tokens off;  #隐藏 nginx 的版本号
sendfile on;   #开启高效文件传输模式。
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #长连接超时时间,单位是秒
#Compression Settings
gzip on;  #开启 gzip 压缩输出,减少网络传输。
gzip_comp_level 6;  #gzip 压缩比
gzip_http_version 1.1;  #用于识别 http 协议的版本
gzip_proxied any;       #根据某些请求和应答来决定是否在对代理请求的应答启用 gzip 压缩
gzip_min_length 1k;     #设置允许压缩的页面最小字节数
gzip_buffers 16 8k;     #设置系统获取几个单位的缓存用于存储 gzip 的压缩结果数据流。
gzip_types text/plain text/css text/javascript application/json #匹配 mime 类型进行压缩 application/javascript
application/x-javascript application/xml;
gzip_vary on;
#end gzip
# http_proxy Settings
client_max_body_size 10m;      #允许客户端请求的最大单文件字节数     
 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
proxy_connect_timeout 75;      #nginx 跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 75;         #定义从后端服务器读取响应的超时。此超时是指相邻两次读操作之间的最长时间间隔。
proxy_read_timeout 75;
proxy_buffer_size 4k;    #设置缓冲区的大小
proxy_buffers 4 32k;     #为每个连接设置缓冲区的数量为 number,每块缓冲区的大小为 size
proxy_busy_buffers_size 64k;     #高负荷下缓冲大小
proxy_temp_file_write_size 64k;  #当缓存被代理的服务器响应到临时文件时,这个选项限制每次写临时文件的大小
proxy_buffering on;
proxy_temp_path /usr/local/nginx1.10/proxy_temp;
proxy_cache_path /usr/local/nginx1.10/proxy_cache levels=1:2 keys_zone=my-cache:100m
max_size=1000m inactive=600m max_size=2g;
#load balance Settings
upstream backend {
sticky;
server 192.168.31.141:80 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.31.250:80 weight=1 max_fails=2 fail_timeout=10s;
}
#virtual host Settings
server {
listen 80;
server_name localhost;
charset utf-8;
location ~/purge(/.*) {
allow 127.0.0.1;
allow 192.168.31.0/24;
deny all;
proxy_cache_purge my-cache $host$1$is_args$args;
}
location / {
index index.php index.html index.htm;  #定义路径下默认访问的文件名
proxy_pass http://backend; #请求转向 backend 定义的服务器列表,对应 upstream 负载均衡器
proxy_redirect off; #指定是否修改被代理服务器返回的响应头中的 location 头域跟 refresh 头域数值
proxy_set_header Host $host; #允许重新定义或者添加发往后端服务器的请求头
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #后端的 Web服务器可以通过 X-Forwarded-For 获取用户真实 IP
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503
http_504;   #如果后端的服务器返回 502、504、执行超时等错误,自动将请求转发到
upstream 负载均衡池中的另一台服务器
}
location ~ .*\.(gif|jpg|png|html|htm|css|js|ico|swf|pdf)(.*) {
proxy_pass http://backend;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; #web 服务器端获得用户的真实 ip
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503
http_504;
proxy_cache my-cache;
add_header Nginx-Cache $upstream_cache_status;
proxy_cache_valid 200 304 301 302 8h;
proxy_cache_valid 404 1m;
proxy_cache_valid any 1d;
proxy_cache_key $host$uri$is_args$args;
expires 30d;
}
location /nginx_status {
stub_status on;
access_log off;
allow 192.168.31.0/24;
deny all;
}
}
}

参数解释:

main全局配置:

woker_processes 4

在配置文件的顶级 main 部分,worker 角色的工作进程的个数,master 进程是接收并分配请求给 worker 处理。这个数值简单一点可以设置为 cpu 的核数 grep ^processor /proc/cpuinfo |wc -l,也是 auto 值,如果开启了 ssl 和 gzip 更应该设置成与逻辑 CPU 数量一样甚至为 2 倍,可以减少 I/O 操作。如果 nginx 服务器还有其它服务,可以考虑适当减少。

worker_cpu_affinity
也是写在 main 部分。在高并发情况下,通过设置 cpu 粘性来降低由于多 CPU 核切换造成的寄存器等现场重建带来的性能损耗。如 worker_cpu_affinity 0001 0010 0100 1000;

0010 表示开
启第二个 cpu 内核,依次类推;有多少个核,就有几位数,1 表示该内核开启,0 表示该内核关闭。

例如:
1、2 核 CPU,开启 2 个进程
worker_processes 2;
worker_cpu_affinity 01 10;
2、2 核 CPU,开启 4 进程
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
3、2 核 CPU,开启 8 进程
worker_processes 8;
worker_cpu_affinity 01 10 01 10 01 10 01 10;
4、8 核 CPU,开启 2 进程
worker_processes 2;
worker_cpu_affinity 10101010 01010101;

worker_connections 4096
写在 events 部分。每一个 worker 进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数)。

worker_rlimit_nofile 10240
写在 main 部分。worker 进程的最大打开文件数限制。默认是没有设置,如果没设置的话,这个值为操作系统的限制(ulimit -n)。可以限制为操作系统最大的限制 65535。把这个值设高,这样 nginx 就不会有“too many open files”问题了

use epoll
写在 events 部分。在 Linux 操作系统下,nginx 默认使用 epoll 事件模型,得益于此,nginx在 Linux 操作系统下效率相当高。同时 Nginx 在 OpenBSD 或 FreeBSD 操作系统上采用类似于epoll 的高效事件模型 kqueue。

 http 服务器配置

sendfile on:开启高效文件传输模式

keepalive_timeout 65 : 长连接超时时间,单位是秒,长连接请求大量小文件的时候,可以减少重建连接的开销,如果设置时间过长,用户又多,长时间保持连接会占用大量资源。

client_max_body_size 10m:允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值。

client_body_buffer_size 128k:缓冲区代理缓冲用户端请求的最大字节数

server_tokens off:隐藏 nginx 的版本号

模块 http_proxy 配置
这个模块实现的是 nginx 作为反向代理服务器的功能,包括缓存功能proxy_connect_timeout 60nginx 跟后端服务器连接超时时间(代理连接超时)

 

proxy_connect_timeout 60:nginx 跟后端服务器连接超时时间(代理连接超时)

proxy_read_timeout 60:定义从后端服务器读取响应的超时。此超时是指相邻两次读操作之间的最长时间间隔,而不
是整个响应传输完成的最长时间。如果后端服务器在超时时间段内没有传输任何数据,连接将被关闭。

定义向后端服务器传输请求的超时。此超时是指相邻两次写操作之间的最长时间间隔,而不是整个请求传输完成的最长时间。如果后端服务器在超时时间段内没有接收到任何数据,连接将被关闭。

proxy_buffer_size 4k:
设置缓冲区的大小为 size。nginx 从被代理的服务器读取响应时,使用该缓冲区保存响应的开始部分。这部分通常包含着一个小小的响应头。该缓冲区大小默认等于 proxy_buffers 指令设置的一块缓冲区的大小,但它也可以被设置得更小。

proxy_buffers 8 4k
语法: proxy_buffers the_number is_size;
为每个连接设置缓冲区的数量为 number,每块缓冲区的大小为 size。这些缓冲区用于保存从被代理的服务器读取的响应。每块缓冲区默认等于一个内存页的大小。这个值是 4K 还是8K,取决于平台。

查看 Linux 内存页大小
[root@www ~]# getconf PAGESIZE
4096

proxy_busy_buffers_size 64k:高负荷下缓冲大小(默认大小是 proxy_buffers 指令设置单块缓冲大小的 2 倍)

proxy_max_temp_file_size:当 proxy_buffers 放不下后端服务器的响应内容时,会将一部分保存到硬盘的临时文件中,
这个值用来设置最大临时文件大小,默认 1024M。

proxy_temp_file_write_size 64k:当缓存被代理的服务器响应到临时文件时,这个选项限制每次写临时文件的大小。

模块 http_gzip 

gzip on : 开启 gzip 压缩输出,减少网络传输。

gzip_min_length 1k : 设置允许压缩的页面最小字节数,页面字节数从 header 头得content-length 中进行获取。建议设置成大于 1k 的字节数,小于 1k 可能会越压越大。

gzip_buffers 4 16k : 设置系统获取几个单位的缓存用于存储 gzip 的压缩结果数据流。4 16k代表以 16k 为单位,按照原始数据大小以 16k 为单位的 4 倍申请内存。如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储 gzip 压缩结果.

gzip_http_version 1.1 : 用于识别 http 协议的版本,早期的浏览器不支持 Gzip 压缩,用户就会看到乱码,所以为了支持前期版本加上了这个选项,如果你用了 Nginx 的反向代理并期望也启用 Gzip 压缩的话,由于末端通信是 http/1.1,故请设置为 1.1。

 gzip_comp_level 6 : gzip 压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理速度最慢(传输快但比较消耗 cpu)

gzip_types :匹配 mime 类型进行压缩,无论是否指定”text/html”类型总是会被压缩的。默认值: gzip_types text/html (默认不对 js/css 文件进行压缩)
# 压缩类型,匹配 MIME 类型进行压缩
# 不能用通配符 text/*
# (无论是否指定)text/html 默认已经压缩
# 设置哪压缩种文本文件可参考 conf/mime.types

gzip_proxied any : Nginx 作为反向代理的时候启用,根据某些请求和应答来决定是否在对代理请求的应答启用 gzip 压缩,是否压缩取决于请求头中的“Via”字段,指令中可以同时指定多个不同的参数,意义如下:
off – 关闭所有的代理结果数据的压缩
expired – 启用压缩,如果 header 头中包含 “Expires” 头信息
no-cache – 启用压缩,如果 header 头中包含 “Cache-Control:no-cache” 头信息
no-store – 启用压缩,如果 header 头中包含 “Cache-Control:no-store” 头信息
private – 启用压缩,如果 header 头中包含 “Cache-Control:private” 头信息
no_last_modified – 启用压缩,如果 header 头中不包含 “Last-Modified” 头信息
no_etag – 启用压缩 ,如果 header 头中不包含 “ETag” 头信息
auth – 启用压缩 , 如果 header 头中包含 “Authorization” 头信息
any – 无条件启用压缩

gzip_vary on :和 http 头有关系,加个 vary 头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的 HTTP 头来判断,是否需要压缩。

 模块 http_stream:
这个模块通过一个简单的调度算法来实现客户端 IP 到后端服务器的负载均衡,upstream 后接负载均衡器的名字,后端 realserver 以 host:port options; 方式组织在 {} 中。如果后端被代理的只有一台,也可以直接写在 proxy_pass 。

location:
root /var/www/html:定义服务器的默认网站根目录位置。如果 locationURL 匹配的是子目录或文件,root 没什么作用,一般放在 server 指令里面或/下。

index index.jsp index.html index.htm:定义路径下默认访问的文件名,一般跟着 root 放

proxy_pass http:/backend:请求转向 backend 定义的服务器列表,即反向代理,对应 upstream 负载均衡器。也可以
proxy_pass http://ip:port

proxy_redirect off:指定是否修改被代理服务器返回的响应头中的 location 头域跟 refresh 头域数值
例如:
设置后端服务器“Location”响应头和“Refresh”响应头的替换文本。 假设后端服务器返回的响
应头是 “Location: http://localhost:8000/two/some/uri/”,那么指令
proxy_redirect http://localhost:8000/two/ http://frontend/one/;
将把字符串改写为 “Location: http://frontend/one/some/uri/”。

proxy_set_header Host $host;允许重新定义或者添加发往后端服务器的请求头。Host 的含义是表明请求的主机名,nginx 反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段重写为proxy_pass指令设置的服务器。因为nginx作为反向代理使用,而如果后端真实的服务器设置有类似防盗链或者根据 http 请求头中的 host 字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败。

 

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;后端的 Web服务器可以通过 X-Forwarded-For 获取用户真实 IPX_Forward_For 字段表示该条 http 请求是有谁发起的?如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。因此,在配置用作反向代理的 nginx 中一般会增加两条配置,修改 http 的请求头:proxy_set_header Host $host; proxy_set_header X-Forward-For $remote_addr;

proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;增加故障转移,如果后端的服务器返回 502、504、执行超时等错误,自动将请求转发到upstream 负载均衡池中的另一台服务器,实现故障转移。


proxy_set_header X-Real-IP $remote_addr;web 服务器端获得用户的真实 ip 但是,实际上要获得用户的真实 ip,也可以通过
X-Forward-For

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章