代理服务可简单的分为正向代理和反向代理:
正向代理:
用于代理内部网络对 Internet
的连接请求(如 VPN/NAT),客户端指定代理服务器,并
将本来要直接发送给目标 Web
服务器的 HTTP
请求先发送到代理服务器上,
然后由代理服务
器去访问 Web
服务器,
并将 Web
服务器的 Response
回传给客户端:
反向代理:
与正向代理相反,如果局域网向 Internet
提供资源,并让 Internet 上的其他用户可以
访问局域网内资源,
也可以设置一个代理服务器,
它提供的服务就是反向代理.
反向代理服
务器接受来自 Internet
的连接,然后将请求转发给内部网络上的服务器,并将 Response 回传给
Internet 上请求连接的客户端:
二、
什么是 nginx
1、 nginx
简介
Nginx 是一款轻量级的网页服务器、反向代理器以及电子邮件代理服务器。因它的稳定性、
丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
Nginx(发音同 engine x),它是
由俄罗斯程序员 Igor
Sysoev 所开发的。起初是供俄国大型的门户网站及搜索引擎
Rambler
(俄语:Рамблер)使用。此软件 BSD-like 协议下发行,可以在 UNIX、 GNU/Linux、
BSD、
Mac OS X、 Solaris,以及 Microsoft Windows 等操作系统中运行。
Nginx 的应用现状
Nginx 已经在俄罗斯最大的门户网站── Rambler
Media(www.rambler.ru)上运行,同时俄
罗斯超过 20%的虚拟主机平台采用 Nginx
作为反向代理服务器。
在国内,已经有 淘宝、新浪博客、新浪播客、网易新闻、六间房、
56.com、 Discuz!、水木
社区、豆瓣、 YUPOO、海内、迅雷在线 等多家网站使用 Nginx
作为 Web
服务器或反向代
理服务器。
2、
Nginx 的核心特点
(1) 跨平台: Nginx
可以在大多数 OS
编译运行,而且也有 Windows
的版本;
(2) 配置异常简单: 非常容易上手。
(3) 非阻塞、高并发连接: 官方测试能够支撑 5
万并发连接,在实际生产环境中跑到
2~3
万并发连接数。(这得益于 Nginx
使用了最新的 epoll
模型);
注:
对于一个 Web
服务器来说,首先看一个请求的基本过程:建立连接—接收数据—发送数据,
在系统底层看来 :上述过程(建立连接—接收数据—发送数据)在系统底层就是读写事件。
如果采用阻塞调用的方式,当读写事件没有准备好时,那么就只能等待,当前线程被挂起,
等事件准备好了,才能进行读写事件。
如果采用非阻塞调用的方式:事件马上返回,告诉你事件还没准备好呢,过会再来吧。过一
会,再来检查一下事件,直到事件准备好了为止,在这期间,你就可以先去做其它事情,然
后再来看看事件好了没。虽然不阻塞了,但你得不时地过来检查一下事件的状态,你可以做
更多的事情了,但带来的开销也是不小的。
非阻塞调用指在不能立刻得到结果之前,该调用
不会阻塞当前线程
(4) 事件驱动: 通信机制采用 epoll 模型,支持更大的并发连接。
非阻塞通过不断检查事件的状态来判断是否进行读写操作,这样带来的开销很大,因此就有
了异步非阻塞的事件处理机制。这种机制让你可以同时监控多个事件,调用他们是非阻塞的,
但可以设置超时时间,在超时时间之内,如果有事件准备好了,就返回。这种机制解决了上
面阻塞调用与非阻塞调用的两个问题。
以 epoll
模型为例:当事件没有准备好时,就放入
epoll(队列)里面。如果有事件准备好了,
那么就去处理;当事件没有准备好时,才在
epoll 里面等着。这样,我们就可以并发处理大
量的并发了,当然,这里的并发请求,是指未处理完的请求。
线程只有一个,所以同时能处
理的请求当然只有一个了,只是在请求之间进行不断地切换而已,切换也是因为异步事件未
准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的
事件。
多线程方式相比,这种事件处理方式是有很大的优势的,
不需要创建线程,每个请求占用的
内存也很少, 没有上下文切换,
事件处理非常的轻量级,并发数再多也不会导致无谓的资
源浪费(上下文切换)。对于 apache
服务器,每个请求会独占一个工作线程,当并发数上到
几千时,就同时有几千的线程在处理请求了。这对操作系统来说,是个不小的挑战:因为线
程带来的内存占用非常大,线程的上下文切换带来的
cpu 开销很大,自然性能就上不 去,
从而导致在高并发场景下性能下降严重。
总结: 通过异步非阻塞的事件处理机制, Nginx
实现由进程循环处理多个准备好的事件,从
而实现高并发和轻量级。
(5) Master/Worker
结构:一个 master
进程,生成一个或多个 worker
进程。
注: Master-Worker
设计模式主要包含两个主要组件
Master 和 Worker, Master 维护着 Worker
队列, 将请求下发到多个 Worker
并行执行, Worker
主要进行实际逻辑计算,并将结果返回
给 Master。
nginx 采用这种进程模型有什么好处?采用独立的进程,可以让互相之间不会影响,一个进
程退出后,其它进程还在工作,服务不会中断,
Master 进程则很快重新启动新的 Worker
进程。当然, Worker
进程的异常退出,肯定是程序有
bug 了,异常退出,会导致当前 Worker
上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
(6) 内存消耗小: 处理大并发的请求内存消耗非常小。在 3
万并发连接下,开启的 10
个
Nginx 进程才消耗 150M 内存(15M*10=150M)。
(7) 内置的健康检查功能: 如果 Nginx
代理的后端的某台 Web
服务器宕机了,不会影响
前端访问。
(8) 节省带宽: 支持 GZIP
压缩,可以添加浏览器本地缓存的
Header 头。
(9) 稳定性高: 用于反向代理,宕机的概率微乎其微。
三、 Nginx+apache
构筑 Web
服务器集群的负载均衡
nginx 配置反向代理
配置 nginx
作为反向代理和负载均衡,同时利用其缓存功能,将静态页面在
nginx 缓存,以
达到降低后端服务器连接数的目的并检查后端
web 服务器的健康状况。
一、
Nginx 的优化
1、
编译安装前优化
安装依赖包
yum -y install pcre-devel openssl-devel
导入nginx和模块
nginx-1.14.0.tar.gz
nginx-sticky-module.zip
ngx_cache_purge-2.3.tar.gz
解压刚刚导入的包
tar zxf nginx-1.14.0.tar.gz
tar zxf ngx_cache_purge-2.3.tar.gz
unzip nginx-sticky-module.zip
编译安装nginx
./configure --prefix=/usr/local/nginx1.14 --user=www --group=www --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
make && make install
链接nginx命令
ln -s /usr/local/nginx1.14/sbin/nginx /usr/local/sbin/
创建用户和组
useradd www -s /sbin/nologin -M
创建所需的目录
mkdir -p /var/tmp/nginx/client
开启nginx
nginx
查看端口
[root@localhost nginx-1.14.0]# netstat -anpt | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 43174/nginx: master
编写 nginx 服务脚本
vim /etc/init.d/nginx
#!/bin/bash |
# chkconfig: 2345
99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx1.10/sbin/nginx"
PIDF="/usr/local/nginx1.10/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
添加x可执行权限
chmod +x /etc/init.d/nginx
把nginx添加到chkconfig服务
chkconfig --add nginx
把nginx的服务启动
chkconfig nginx on
启动nginx
service nginx start
添加第三方模块
ngx_brotli.tar.gz
重新编译nginx
./configure --prefix=/usr/local/nginx1.14 --user=www --group=www --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-sticky-module
Make && make install
负载均衡与健康检查:
修改nginx.conf
测试
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 动态进程缓存。
添加
测试
下面的
nginx.conf 实现 nginx 在前端做反向代理服务器的完整配置文件的例子,处理 js、 png
等静态文件, jsp/php
等动态请求转发到其它服务器 tomcat/apache
brotli on;
brotli_types text/plain text/css text/xml application/xml application/json;
brotli_static off;
brotli_comp_level 11;
brotli_buffers 16 8k;
brotli_window 512k;
brotli_min_length 20;