Nginx(三):反向代理相关配置
2016-03-15 01:57
776 查看
Nginx(三):反向代理相关配置
注意:以下实验域名解析通过客户端hosts文件实现;Nginx通过proxy模块实现反向代理功能。在作为web反向代理服务器时,nginx负责接收客户请求,并能够根据URI、客户端参数或其它的处理逻辑将用户请求调度至上游服务器上(upstream server)。nginx在实现反向代理功能时的最重要指令为proxy_pass,它能够将location定义的某URI代理至指定的上游服务器(组)上。如下面的示例中,location的/uri将被替换为上游服务器上的/newuri。
反向代理:
[root@node0 ~]# vim /etc/nginx/nginx.conf server { listen 80; server_name www.chencer.org; add_header X-Via $server_addr; location / { root /web/www; index index.html index.htm; } location /port { proxy_pass http://localhost:8080/; } }
访问测试:
缓冲区设定
nginx在默认情况下在将其响应给客户端之前会尽可能地接收来upstream服务器的响应报文,它会将这些响应报文存暂存于本地并尽量一次性地响应给客户端。然而,在来自于客户端的请求或来自upsteam服务器的响应过多时,nginx会试图将之存储于本地磁盘中,这将大大降低nginx的性能。因此,在有着更多可用内存的场景中,应该将用于暂存这些报文的缓冲区调大至一个合理的值。proxy_buffer_size size:设定用于暂存来自于upsteam服务器的第一个响应报文的缓冲区大小; proxy_buffering on|off:启用缓冲upstream服务器的响应报文,否则,如果proxy_max_temp_file_size指令的值为0,来自upstream服务器的响应报文在接收到的那一刻将同步发送至客户端;一般情况下,启用proxy_buffering并将proxy_max_temp_file_size设定为0能够启用缓存响应报文的功能,并能够避免将其缓存至磁盘中; proxy_buffers 8 4k|8k:用于缓冲来自upstream服务器的响应报文的缓冲区大小;
缓存:
nginx做为反向代理时,能够将来自upstream的响应缓存至本地,并在后续的客户端请求同样内容时直接从本地构造响应报文。proxy_cache zone|off:定义一个用于缓存的共享内存区域,其可被多个地方调用;缓存将遵从upstream服务器的响应报文首部中关于缓存的设定,如 "Expires"、"Cache-Control: no-cache"、 "Cache-Control: max-age=XXX"、"private"和"no-store" 等,但nginx在缓存时不会考虑响应报文的"Vary"首部。为了确保私有信息不被缓存,所有关于用户的私有信息可以upstream上通过"no-cache" or "max-age=0"来实现,也可在nginx设定proxy_cache_key必须包含用户特有数据如$cookie_xxx的方式实现,但最后这种方式在公共缓存上使用可能会有风险。因此,在响应报文中含有以下首部或指定标志的报文将不会被缓存。 Set-Cookie Cache-Control containing "no-cache", "no-store", "private", or a "max-age" with a non-numeric or 0 value Expires with a time in the past X-Accel-Expires: 0 proxy_cache_key:$uri设定在存储及检索缓存时用于“键”的字符串,可以使用变量为其值,但使用不当时有可能会为同一个内容缓存多次;另外,将用户私有信息用于键可以避免将用户的私有信息返回给其它用户; proxy_cache_lock:启用此项,可在缓存未命令中阻止多个相同的请求同时发往upstream,其生效范围为worker级别; proxy_cache_lock_timeout:proxy_cache_lock功能的锁定时长; proxy_cache_min_uses:某响应报文被缓存之前至少应该被请求的次数; proxy_cache_path:定义一个用记保存缓存响应报文的目录,及一个保存缓存对象的键及响应元数据的共享内存区域(keys_zone=name:size),其可选参数有: levels:每级子目录名称的长度,有效值为1或2,每级之间使用冒号分隔,最多为3级; inactive:非活动缓存项从缓存中剔除之前的最大缓存时长; max_size:缓存空间大小的上限,当需要缓存的对象超出此空间限定时,缓存管理器将基于LRU算法对其进行清理; loader_files:缓存加载器(cache_loader)的每次工作过程最多为多少个文件加载元数据; loader_sleep:缓存加载器的每次迭代工作之后的睡眠时长; loader_threashold:缓存加载器的最大睡眠时长; proxy_cache_use_stale:在无法联系到upstream服务器时的哪种情形下(如error、timeout或http_500等)让nginx使用本地缓存的过期的缓存对象直接响应客户端请求;其格式为: proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_404 | off proxy_cache_valid [ code ...] time:用于为不同的响应设定不同时长的有效缓存时长,例如:proxy_cache_valid 200 302 10m; proxy_cache_methods [GET HEAD POST]:为哪些请求方法启用缓存功能; proxy_cache_bypass string:设定在哪种情形下,nginx将不从缓存中取数据;
配置示例:
[root@node0 ~]# vim /etc/nginx/nginx.conf http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; proxy_cache_path /nginx/cache/first levels=1:2 keys_zone=first:10m max_size=512m; server { listen 80; server_name www.chencer.org; location / { root /web/www; index index.html index.htm; proxy_pass http://192.168.1.5; proxy_set_header Host $host; proxy_cache first; proxy_cache_valid 200 1d; proxy_cache_valid 301 302 10m; proxy_cache_valid any 1m; } } }
重启服务,访问测试:
首次访问:
缓存后访问:
upstream模块:
与proxy模块结合使用的模块中,最常用的当属upstream模块。pstream模块可定义一个新的上下文,它包含了一组宝岛upstream服务器,这些服务器可能被赋予了不同的权重、不同的类型甚至可以基于维护等原因被标记为down。负载均衡:upstream模块的负载均衡算法主要有三种,轮调(round-robin)、ip哈希(ip_hash)和最少连接(least_conn)三种。
upstream使用注意:
1、只能用于http上下文;
2、各server只能直接使用IP或主机名,不要加协议;
server address [parameters]; 常用的指令: ip_hash:基于客户端IP地址完成请求的分发,它可以保证来自于同一个客户端的请求始终被转发至同一个upstream服务器; keepalive:每个worker进程为发送到upstream服务器的连接所缓存的个数; least_conn:最少连接调度算法; server:定义一个upstream服务器的地址,还可包括一系列可选参数,如: weight=#:设定权重; max_fails=#:最大失败连接次数,默认为1; fail_timeout=TIME:等待请求的目标服务器发送响应的时长;默认为10秒 backup:用于fallback的目的,所有服务均故障时才启动此服务器; down:手动标记其不再处理任何请求; 健康状态检测:用于location中; health_check [interval=TIME] [fails=NUMBER] [passes=NUMBER] [uri=URI] [match=NAME];
配置示例:
[root@node0 ~]# vim /etc/nginx/nginx.conf upstream websrc { server 192.168.1.5:80; server 192.168.1.6:80; server 127.0.0.1:8080 backup; } server { listen 80; server_name www.chencer.org; add_header X-via $server_addr location / { root /web/www; index index.html index.htm; proxy_pass http://websrc; } } server { listen 8080; server_name 127.0.0.1; location / { root /web/ backup; index index.html index.htm; } } [root@node0 ~]# mkdir /web/backup [root@node0 ~]# echo "Sorry" > /web/backup/index.html
重启服务后,访问测试:
关闭两台上有服务器后,访问测试:
lnmp:
之前的博文中介绍过LAMP架构:Linux(操作系统),Apache(Web服务器),MySQL/MariaDB(数据库),PHP/Perl/Python(程序语言),而今天介绍的LNMP和LAMP类似,只是作为Web服务器的不再是Apache而是高性能的Nginx;lnmp有两种实现方式:
Nginx服务器自己提供静态内容服务,对php的请求通过FastCGI模块代理至php-fpm服务器;
Nginx将服务请求反向代理至上游Apache服务器,php作为Apache服务器的模块;
编译安装php-fpm服务器:
安装编译环境,并解决软件依赖关系:
[root@node2 ~]# yum groupinstall "Server Platform Development" "Development tools" "Desktop Platform Development" [root@node2 ~]# yum install bzip2-devel libmcrypt-devel mhash-devel # 注意:libmcrypt-devel和mhash-devel来自于epel源
编译安装php:
[root@node2 ~]# tar xf php-5.4.45.tar.bz2 [root@node2 ~]# cd php-5.4.45/ [root@node2 php-5.4.45]# ./configure --prefix=/usr/local/php --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-openssl --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --enable-xml --with-libxml-dir=/usr --enable-sockets --enable-fpm --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 [root@node2 php-5.4.45]# make && make install
导出头文件、库文件:
[root@node2 ~]# ln -sv /usr/local/php/include /usr/include/php "/usr/include/php" -> "/usr/local/php/include" [root@node2 ~]# vim /etc/ld.so.conf.d/php.conf /usr/local/php/lib [root@node2 ~]# ldconfig
添加并重读环境变量:
[root@node2 ~]# vim /etc/profile.d/php.sh export PATH=/usr/local/php/bin:/usr/local/php/sbin:$PATH [root@node2 ~]# source /etc/profile.d/php.sh
提供php和php-fpm配置文件:
[root@node2 ~]# cp ./php-5.4.45/php.ini-production /etc/php.ini [root@node2 ~]# cd /usr/local/php/etc/ [root@node2 etc]# cp php-fpm.conf.default php-fpm.conf [root@node2 etc]# vim php-fpm.conf listen = 192.168.1.6:9000 pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 2 pm.max_spare_servers = 8 pid = /usr/local/php/var/run/php-fpm.pid
为php-fpm提供服务启动脚本:
[root@node2 ~]# cp ./php-5.4.45/sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm [root@node2 ~]# chmod +x /etc/rc.d/init.d/php-fpm
提供网页文件:
[root@node2 ~]# mkdir -p /web/php [root@node2 ~]# vim /web/php/index.php 192.168.1.6 <?php phpinfo(); ?>
添加并启动服务:
[root@node2 ~]# chkconfig php-fpm --add [root@node2 ~]# chkconfig php-fpm on [root@node2 ~]# service php-fpm start
Nginx服务器配置:
[root@node0 ~]# vim /etc/nginx/nginx.conf server { listen 80; server_name www.chencer.org; add_header X-via $server_addr; location / { root /web/www; index index.php index.html index.hml; } location ~ \.php$ { root /web/www; fastcgi_pass 192.168.1.5:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
重启服务后访问测试:
相关文章推荐
- Nginx反向代理中文域名
- Nginx反向代理和负载均衡部署指南
- Nginx反向代理设置总结
- squid 介绍
- Tomcat(二):Nginx反向代理实现Tomcat动静分离
- Tomcat(三):Apache反向代理实现Tomcat负载均衡
- CDN缓存服务器现状,squid、nginx、trafficserver、ATS性能测试
- nginx反向代理配置
- 五、Nginx多Server反向代理配置
- Jetty反向代理
- 使用nginx来完成反向代理及处理静态文件请求
- 在IIS7中使用ARR(Application Request Routing)反向代理虚拟目录到Nodejs站点
- 正向代理 和 反向代理
- CentOS 7中nginx反向代理因为selinux出现错误的解决办法
- apache反向代理
- nginx(六)反向代理(proxy)与负载均衡(upstream)以及健康状态监测。
- 如何在CentOS或RHEL上搭建Squid透明Web代理系统?
- nginx反向代理tomcat
- Nginx+Tomcat 反向代理负载均衡 配置 学习(1)
- 在ubuntu上面配置nginx实现反向代理和负载均衡