Nginx反向代理缓存服务器构建

試著忘記壹切 提交于 2019-12-01 23:16:45

代理服务可简单的分为正向代理和反向代理:
正向代理: 用于代理内部网络对 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;

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!