关于nginx的那点事儿(反向代理、负载均衡、动静分离)

1,710 阅读6分钟

常常会听到一些关于反向代理和负载均衡的话题,但是具体如何实现呢?

nginx 是什么

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、PHP等,但是不支持java,java 程序只能通过 tomcat 配合完成,nginx 专为性能优化而开发,非常注重效率,能经受高负载的考验,最高可以承受5万并发数。

nginx 基本概念

反向代理

正向代理

我们常说的代理指的是正向代理,正向代理的过程,它隐藏了真实的请求客户端,服务器并不知道真实的客户端是谁,客户端请求的服务都被代理服务器来代替请求。

nginx 不仅可以做反向代理,还能用作正向代理来进行上网。

如果把局域网外的 Internet 想像成一个资源库,局域网中的客户端想要访问 Internet ,则需要代理服务器来访问,这个代理服务器就是所谓的正向代理。

在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。

image.png

反向代理

客户端对反向代理是无感知的,因为客户端不需要配置就可以访问,反向代理隐藏了真实的服务端。客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后返回给客户端,此时反向代理服务器和目标服务器对外就是一台服务器,暴露的是代理服务器地址,隐藏了真实服务器的IP地址。

image.png

负载均衡

一个简单的请求如下图,但是往往实际情况并不是如此,如果大量请求同时发送,就会导致服务器崩溃的情况,可以通过提高服务器的配置来解决问题,但是并不能从根本上解决问题。

未命名文件.jpg

单个服务器解决不了,我们可以增加服务器的数量,然后请求分发到各个服务器上,将负载分发到不同的服务器,也就是我们说的负载均衡。

未命名文件.jpg

公司会建立很多的服务器,这些服务器组成了服务器集群,当用户访问网站的时候,先访问一个中间服务器,再让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入选择的服务器。用户每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。

动静分离

静态资源: CSS HTML JS 、、、

动态资源: JSP servelet、、、

单服务: 把动态资源和静态资源都部署到tomcat里面。

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。

未命名文件 (1).png

nginx 安装

也可以直接在官网下载,并且安装一些依赖。因为我用的mac,下面是我比较推荐的方式。

安装homebrew

Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷。

如果之前尝试过其他脚本安装,请移除Homebrew后再安装

将脚本复制到终端 enter

/bin/bash -c "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh)"

如果页面出现下面的卡顿

==> Tapping homebrew/core
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core'...

ctrol + c 中断,然后执行下面的命令

cd "$(brew --repo)/Library/Taps/"

mkdir homebrew && cd homebrew

git clone git://mirrors.ustc.edu.cn/homebrew-core.git

安装cask 同样也有安装失败或者卡住的问题,解决方法也是一样

cd "$(brew --repo)/Library/Taps/"
cd homebrew
git clone https://mirrors.ustc.edu.cn/homebrew-cask.git

安装成功后会有下图提示

image.png

homebrew更新

brew update

设置镜像

中科大源

git -C "$(brew --repo)" remote set-url origin https://mirrors.ustc.edu.cn/brew.git

git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git

git -C "$(brew --repo homebrew/cask)" remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git

brew update

清华大学源

git -C "$(brew --repo)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git

git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git

git -C "$(brew --repo homebrew/cask)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask.git

brew update

恢复默认源

git -C "$(brew --repo)" remote set-url origin https://github.com/Homebrew/brew.git

git -C "$(brew --repo homebrew/core)" remote set-url origin https://github.com/Homebrew/homebrew-core.git

git -C "$(brew --repo homebrew/cask)" remote set-url origin https://github.com/Homebrew/homebrew-cask.git

brew update

卸载 Homebrew

使用官方脚本同样会遇到uninstall地址无法访问问题,可以使用下面脚本

/bin/bash -c "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/uninstall.sh)"

安装nginx

brew install nginx    安装nginx

nginx -v即可查看版本

image.png

nginx 常用命令

使用 nginx 操作命令前提条件,必须进入到 nginx 的目录

进入到nginx文件夹

cd /usr/local/etc/nginx

image.png

启动nginx

nginx

image.png

在浏览器输入 http://localhost:8080/

image.png

这样nginx就启动好了

关闭nginx

nginx -s stop

重启nginx

nginx -s reload

检查配置

nginx -t

image.png


进入到 nginx 文件后在终端输入 ls 即可查看 nginx 的目录文件,其中nginx.conf就是配置文件/

image.png

image.png

配置文件组成:

执行下面的命令打开nginx配置文件

vim Nginx.conf

image.png

可以看到大部分就是井号注释掉的内容。

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


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"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       8080;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

上面是我复制出来的 nginx.conf 文件,可以看出来由三部分组成。

全局块

从配置文件开始,到 events 块之间的内容,只要会设置一些影响 nginx 服务器整体运行的配置指令,只要包括配置运行 Nginx 服务器的用户组,允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入。

image.png

比如

worker_processes  1;

这是 nginx 服务器并发处理的关键配置,worker_processes的值越大,可以支持的并发数量也越多,但是也会受到硬件、软件的影响。

events 块

events 块涉及的指令主要影响 nginx 服务器与用户的网络连接,常用的设置包括是否开启对 worker_processes 下的网络连接进行序列化,是否允许同时接受多个网络连接,选取哪种事件驱动模型来处理连接请求,多个 worker_processes 可以同时支持的最大连接数等。

image.png

1024表示 worker_processes 的最大连接数是1024,这部分的配置对 nginx 的性能影响比较大,在实际中应该灵活配置。

http块

nginx 配置中最频繁的一部分,代理,缓存,日志等绝大部分功能和第三方模块的配置都在这里。http块也可以包括http全局块,server块。

http 全局块

http 全局块配置的指令包括文件引入、MIME- TYPE 定义,日志自定义,连接超时时间,单链接请求数上限等。

image.png

serve 块

与虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,技术产生是为了节约更多的互联网服务器硬件成本。

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。

每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块。

image.png

监听端口

listen       8080;

主机名称

 server_name  localhost;

nginx 反向代理

nginx反向代理主要通过配置proxy_pass

 server {
        listen  9001;
        server_name  localhost;

        location ~ /oss/ {
              proxy_pass http://localhost:8001;
        }

nginx 负载均衡

通过 upstream 实现负载均衡

upstream test{ 
      server 11.22.333.11:6666 weight=1; 
      server 11.22.333.44:5555 weight=2; 
}

配置完成后保存文件,重启nginx即可。

nginx 动静分离

nginx 配置高可用集群

nginx 原理