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

代理服务可简单的分为正向代理和反向代理:

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

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

一、nginx 反向代理:Web 服务器的调度器

1、反向代理(Reverse Proxy)方式是指以代理服务器来接受客户端的连接请求,然后将请 求转发给网络上的 web 服务器(可能是 apache、nginx、tomcat、iis 等),并将从 web 服务 器上得到的结果返回给请求连接的客户端,此时代理服务器对外就表现为一个服务器。

从上图可以看出:反向代理服务器代理网站 Web 服务器接收 Http 请求,对请求进行转发。

而且nginx作为反向代理服务器可以根据用户请求的内容把请求转发给后端不同的web服务 器,例如静动分离,再例如在 nginx 上创建多个虚拟主机,这样就成功的做到了在浏览器中 输入不同域名(url)的时候访问后端的不同 web 服务器或 web 群集。

2、反向代理的作用

①保护网站安全:任何来自 Internet 的请求都必须先经过代理服务器

②通过配置缓存功能加速 Web 请求:可以缓存真实 Web 服务器上的某些静态资源,减轻真 实 Web 服务器的负载压力;

③实现负载均衡:充当负载均衡服务器均衡地分发请求,平衡集群中各个服务器的负载压力;

二、什么是 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 服务器的健康状况。

1、安装 nginx

环境:

OS:centos7.2

nginx:192.168.31.83

apache1:192.168.31.141

apache2:192.168.31.250

安装 zlib-devel、pcre-devel 等依赖包

[root@www ~]# yum -y install gcc gcc-c++ make libtool zlib zlib-devel pcre pcre-devel openssl openssl-devel

注: 结合 proxy 和 upstream 模块实现后端 web 负载均衡

使用 proxy 模块实现静态文件缓存

结合 nginx 默认自带的 ngx_http_proxy_module 模块 和 ngx_http_upstream_module 模块 实现后端服务器的健康检查,也可以使用第三方模块 nginx_upstream_check_module 使用 nginx-sticky-module 扩展模块实现 Cookie 会话黏贴(保持会话) 使用 ngx_cache_purge 实现更强大的缓存清除功能 上面提到的 2 个模块都属于第三方扩展模块,需要提前下好源码,然后编译时通过 --add-moudle=src_path 一起安装。

安装 nginx

[root@www ~]# groupadd www #添加 www 组

[root@www ~]# useradd -g www www -s /sbin/nologin #创建nginx运行账户www并加入到 www 组,不允许 www 用户直接登录系统

#tar zxf nginx-1.10.2.tar.gz

#tar zxf ngx_cache_purge-2.3.tar.gz

#tar zxf master.tar.gz # cd nginx-1.10.2/

[root@www nginx-1.10.2]#  ./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-goodies-nginx-sticky-module-ng-08a395c66e42

[root@www nginx-1.10.2]# make && make install

注:nginx 的所有模块必须在编译的时候添加,不能再运行的时候动态加载。 优化 nginx 程序的执行路径

[root@www nginx-1.10.2]# ln -s /usr/local/nginx1.14/sbin/nginx /usr/local/sbin/

[root@www nginx-1.10.2]# nginx -t(会提示报错,因为之前装的少个目录

[root@www nginx-1.10.2]# mkdir -p /var/tmp/nginx/client

[root@www nginx-1.10.2]# chown -R www:www /var/tmp/nginx/

[root@www nginx-1.10.2]# nginx -t

nginx: the configuration file /usr/local/nginx1.10/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx1.10/conf/nginx.conf test is successful

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

cd  /usr/local/nginx1.14/conf 下会有nginx.conf把他拷贝下

然后把主配rz上来

user www www;
worker_processes 2;   (cat /proc/cpuinfo 查看有几块看实际情况
worker_cpu_affinity 01 10;   (然后写如图
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
worker_rlimit_nofile 10240;
pid logs/nginx.pid;
events {
  use epoll;
  worker_connections 4096;
}
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;
  sendfile on;
  #tcp_nopush on;
  #keepalive_timeout 0;
  keepalive_timeout 65;
  #Compression Settings
  gzip on;
  gzip_comp_level 6;
  gzip_http_version 1.1;
  gzip_proxied any;
  gzip_min_length 1k;
  gzip_buffers 16 8k;
  gzip_types text/plain text/css text/javascript application/json 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;
  proxy_send_timeout 75;
  proxy_read_timeout 75;
  proxy_buffer_size 4k;
  proxy_buffers 4 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;
  proxy_buffering on;
  proxy_temp_path /usr/local/nginx1.14/proxy_temp;
  proxy_cache_path /usr/local/nginx1.14/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.254.130:80 weight=1 max_fails=2 fail_timeout=10s; (apache1主机)
    server 192.168.254.131:80 weight=1 max_fails=2 fail_timeout=10s; (apache2主机)
  }
  #virtual host Settings
  server {
    listen 80;
    server_name localhost;
    charset utf-8;  
    location ~/purge(/.*) {
      allow 127.0.0.1;
      allow 192.168.254.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;
    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;
  }
  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;
    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.254.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; (四核)。

附: CPU 工作状况:(输入 top 后,按 1 查看)

上面的配置表示:4 核 CPU,开启 4 个进程。0001 表示开启第一个 cpu 内核, 0010 表示开 启第二个 cpu 内核,依次类推;有多少个核,就有几位数,1 表示该内核开启,0 表示该内 核关闭。

然后重启服务

nginx -s reload

另外两台yum安装apache(apache1、apache2)

然后各放一张照片 /var/www/html

然后就可以访问 按F12审查元素:

 (进配置文件

在50行添加nginx官网如下代码,51行是nginx ip

systemctl  restart nginx 重启下

(访问如下页面是对的)

    在apache上

原文地址:https://www.cnblogs.com/ljl1366136/p/9510609.html