Linux环境下Nginx及负载均衡

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
云解析 DNS,旗舰版 1个月
简介: Nginx 简介Nginx 是一个高性能的 HTTP 和反向代理 Web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。前向代理作为客户端的代理,服务端只知道代理的 IP 地址而不知道客户端的 IP 地址。

Nginx 简介

Nginx 是一个高性能的 HTTP 和反向代理 Web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。

前向代理作为客户端的代理,服务端只知道代理的 IP 地址而不知道客户端的 IP 地址。

1557749097576

Nginx 安装

推荐使用 LNMP 一键安装包,Ubuntu/CentOS 等各平台都有提供,省去自己配置的过程。

如果需要单独安装 Nginx,可以去找各平台的安装包名称。以 Ubuntu Desktop 19.04 为例,单独安装 Nginx 的命令如下:

sudo apt install nginx

1557750229828

Nginx 安装后默认启动,打开浏览器输入 http://127.0.0.1 检查是否安装成功。

1557750269605

练习 1

使用 tail -f /path/to/nginx/log/access.log 实时监控文件变化,再分别本地访问 127.0.01 和远程访问服务器 IP 地址,比较两次访问的日志有什么不同?

Tips: Ubuntu Server 版默认没有桌面,通过 SSH 连接到服务器

  1. 打开新终端,通过 SSH 连接到服务器,再使用 curl 127.0.0.1 命令返回页面源文件
  2. 打开客户端浏览器,输入服务器 IP 地址
  3. 比较上面两步对应的操作日志有什么区别

刚才在 Ubuntu 默认的火狐浏览器打开 127.0.0.1 时的访问日志如图。

1557750357418

接下来换一台电脑访问 192.168.23.129。

1557750398919

1557750411791

首先可以看到,UA 是不一样的,这是因为我用了不同的浏览器,当然,访问时间等也是不一样的。

最关键的一点,第一次访问的 IP 是 127.0.0.1,是环回地址,而后一次访问的 IP 是 192.168.23.1,这个是我 Windows 10 的 IP 地址。

最后看一点实战的内容——我的博客的访问日志:

1557750709656

1557750722075

从中可以看到类似的日志记录,不仅记录了访问者的 IP、UA,还记录了访问资源 URL 以及一些附加的信息。

同样的,还有错误日志,例如看一下 gitlab.error.log

1557750810498

有了这些日志,管理员就方便排查问题了。

Nginx 默认配置

配置文件:/etc/nginx/nginx.conf(如果是 LNMP 安装的,则可能在 /usr/local/nginx/conf/nginx.conf)。

可以用 less 查看配置文件,配置文件默认的环境是全局环境,即一个 main{},后面会定义用户、工作进程等,以及 HTTP 服务、邮件服务。

1557817139159

下面主要讲一下 HTTP 配置文件。

1557817159052

首先在 HTTP{} 会有一些全局的配置,包括访问日志、连接超时等信息,随后会给出一个或多个 server 表示多个虚拟主机。

来看一下实战的配置文件。

1557817278775

1557817334696

用户和用户组都是 www,配置了错误日志的访问路径,工作模式是 epoll、IO 多路复用,单个进程的最大连接数是 51200。

1557817394587

配置了 fastcgi 相关信息。

Nginx 作为 HTTP 服务器的配置

Nginx 默认的静态资源文件夹为 /var/www/html(不同的安装包可能有不同的默认路径,例如可能为 /usr/local/nginx/www/html/default 或者其他目录,也可以自己指定)。

在默认目录下,新建一个叫做 jxtxzzw.html 的文件,随便写一点东西。

1557817758381

1557817709063

然后在 nginx.conf 的 HTTP 结点中新增一个虚拟服务器,并 sudo nginx -s reload 重新加载。

1557817875799

如图,在 80 端口监听,当用户访问的服务器是 jxtxzzwtest.com 的时候,就定位到 /var/www/html/ 下,并当用户没有指定访问的路径的时候,默认访问 jxtxzzw.html

为了模拟域名解析的过程,修改 /etc/hosts 文件,增加 jxtxzzwtest.com 的 IP 为 127.0.0.1

1557818114250

修改之后打开浏览器访问 jxtxzzwtest.com,可以看到刚才的页面。

1557818165684

如何不购买新的二级域名和服务器,利用该服务器和已有的域名再做一个个人主页呢?

这就可以添加一个新的虚拟服务器。

重复上面的步骤,只是注意添加虚拟服务器的时候取一个新的 server_name,例如 new.jxtxzzwtest.com,至于 location 写什么,就看个人主页放在了哪个文件夹下面了。这些都可以根据自己需要修改。

server {
    listen 80;
    server_name new.jxtxzzwtest.com;
    location / {
        index a_new_page.html;
        root /home/jxtxzzw/web/;
    }
}

随后,在 hosts 模拟 DNS 解析,添加 127.0.0.1 new.jxtxzzwtest.com 之后就可以在浏览器访问 new.jxtxzzwtest.com 来看到个人主页了。

练习 2

  1. 在配置文件 nginx.conf 的 http 节点内新增一个虚拟服务器,新建 /var/www/EXAMPLE.com 文件夹,该文件夹下新建 index.html 文件写入文字,重加载配置 sudo nginx -s reload (注:将本页中的 EXAMPLE 替换成自己的名字拼音)
  2. 浏览器输入 IP 地址,检查是否生成 /var/log/nginx/EXAMPLE.access.log 文件,同时检查 /var/log/nginx/access.log 文件是否有变化
  3. 修改自己客户端电脑上的 hosts 文件,添加两行解析到服务器 IP 地址
  4. 浏览器输入 www.EXAMPLE.com,检查是否生成 /var/log/nginx/EXAMPLE.access.log,同时监测 /var/log/nginx/access.log 和 /var/log/nginx/EXAMPLE.access.log 文件的变化
server {
    listen 80;
    server_name www.zzw.com;
    access_log /var/log/nginx/zzw.access.log;
    location / {
        index index.html;
        root /var/www/html/zzw.com/;
    }
}

1557818970811

输入 IP 地址,不论是本机访问 127.0.0.1 还是另一台电脑访问 192.168.23.129,发现都只访问了 Nginx 默认的安装成功页面,没有进入 zzw.com。

显然的,只有 access.log 会有变化,记录了本次访问信息。

1557819148817

而在添加了 hosts 以后,访问 www.zzw.com 就会看到刚才输入的信息。

1557819224946

需要注意的是,在配置文件中只定义了 www.zzw.com,没有定义 zzw.com,所以,在访问 zzw.com 的时候还是会跳转到 Nginx 安装成功的那个页面。

解决这个办法可以在 server_name 后面增加一个别名。

server_name www.zzw.com zzw.com;

看到 zzw.access.log 和 access.log 都有了新的记录。

来看一些实战的内容。

1557819404635

我的博客,监听了 80 端口,同时处理 www.jxtxzzw.comjxtxzzw.com 两个服务器名字,并对 80 端口的请求全部转发到 443 端口。

443 端口配置了一些关于 SSL 相关的信息,并且导入了 PHP 相关的配置。

1557819497443

同时,还有一个 gitlab.jxtxzzw.com 的虚拟主机,这个配置文件将在下面详述。

负载均衡简介

1557900464912

1557900479572

1557900487750

负载均衡转发算法:

  • 轮询(Round Robin):为第一个请求选择列表中的第一个服务器,然后按顺序向下移动列表直到结尾,然后循环
  • 最小连接(Least Connection):优先选择连接数最少的服务器,在普遍会话较长的情况下推荐使用
  • 散列(Hash):根据请求源的 IP 的散列来选择要转发的服务器,这种方式可以一定程度上保证特定用户能链接到相同的服务器

负载均衡算法:

  • round:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,能自动删除
  • weight:指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况
  • fiar(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配
  • ip_hash:每个请求按访问 IP 的散列结果分配,每个访客固定访问一个后端服务器,可以解决 session 的问题
  • url_hash(第三方):每个请求按 URL 的散列结果分配,不同访客访问相同的服务器

1557900812070

预备 Web 服务器环境:

  1. 配置两台 Apache(httpd) 作为 Web 服务器,例如可以使用 XAMPP
  2. XAMPP 的访问日志在 /opt/lampp/logs/access.log
  3. 一台 Ubuntu Desktop 的虚拟机,192.168.23.129,作为 Nginx 服务器
  4. 一台 Ubuntu Desktop 的虚拟机,192.168.23.128,作为第 1 台 XAMPP 服务器
  5. 一台 Ubuntu Server 的虚拟机,192.168.23.130,作为第 2 台 XAMPP 服务器
  6. 一台 Windows 的物理机,192.168.23.1,用来访问

1557904366933

1557904412893

1557904436313

在 nginx.conf 的 http 节点下添加以下代码后重新加载配置

upstream first {
    server 192.168.23.128;
    server 192.168.23.130;
}

server {
    listen 80;
    server_name load.jxtxzzwtest.com;
    location / {
        proxy_pass http://first;
    }
}

修改电脑的 host 文件,添加一个域名解析

192.168.23.129 load.jxtxzzwtest.com

1557904573224

浏览器访问 load.jxtxzzwtest.com,发现打开了 XAMPP 的一个界面,说明代理成功了。

但是到底访问的是哪一个 XAMPP 呢?可以看一下日志。

在此之前,刷新几次,看看日志会不会访问了不同的页面。

日志的观察结果,可以看到 128 的那台服务器上收到了若干次来自 129 的转发请求,而 130 的那台服务器上也收到了若干请求,但是观察时间可以看到,两台服务器上接受的请求是先后交替的,这意味着符合轮询算法的期望结果。

更加直观的方法,是可以修改其中一个 Apache 服务器的主页显示。

1557905255583

简单粗暴的方法,删掉了 128 那台服务器的 index.html。

然后刷新页面的效果就是交替出现 XAMPP 的 dashboard 和 Directory Listing。

1557905322496

刷新以后变成下面这个页面,两个页面在每次刷新后交替显示。

1557905359160

如果没有交替显示,有可能是浏览器做了缓存,强制刷新一下就好了。

练习 3

  1. 在 nginx.conf 的 http 节点下新增 upstream second 方案,将 server 节点下的 proxy_pass 设为 second 后重加载配置,其中 IP 地址要换成自己服务器的地址,浏览器访问域名,监测 Nginx 服务器的 /var/log/nginx/access.log 和两台 Web 服务器的 /opt/lampp/logs/access.log 发现有什么规律

    upstream second {
        server 192.168.1.102:80;
        server 192.168.1.103 weight=3;
    }
  2. 新增 upstream third 方案,重复上述实验

    upstream third {
        ip_hash;
        server 192.168.1.102;
        server 192.168.1.103;
    }

1557905657267

1557905818420

访问日志可以看出,交替比例变为 3:1。

需要特别说明的是,浏览器可能存在缓存,所以一定要去看日志。

换成 hash 以后,我只能刷出 Index of /dashboard 这个页面,不论刷新多少次,而查看访问日志也确实发现我被转发到了 130 这个服务器上。

换一台设备,可能(如果正好 hash 计算结果不同)就会被转发到 128 的服务器上。也可能还是访问的 130 的服务器。

再来看一些关于 Nginx 代理的实战的例子。

第一个例子是 HTTPS 反向代理到 Docker,具体的配置过程可以看我的另一篇文章《Nginx代理HTTPS到Docker指定端口》,这里只简要的给出与反向代理、负载均衡相关的代码。

1557906259949

1557906274170

第二个例子是 GitLab。

如果不想用 GitLab 自带的 Nginx 服务,而想要把 GitLab 作为一个虚拟主机统一在已有的 LNMP 服务中一起管理,可以用到反向代理。

由于 GitLab 默认的是在 socket 中通信,所以有点不太一样。

1557906387237

1557906405665

1557906423386

这两张截图省略了 GitLab 中与 SSL 配置相关的代码。

练习 4

  1. 利用 XAMPP,搭建一个能访问数据库的动态网站,并通过负载均衡服务器访问
  2. 比较 Nginx 服务器和 Apache 服务器的异同

第一个练习,比较简单,基本上只要复现本文内容即可,唯一的区别在于需要把本文中简陋的 HTML 代码复杂化,加上与数据库通信的部分,例如,访问数据库并列出所有学生的姓名……

由于《MySQL备份与主备配置》已经配置了双主结构,所以,在一个 PHP 页面中加入增删改查的功能,并把页面复制到另一台服务器上就可以了,访问会通过负载均衡,数据库的访问会通过双主备份,保证了数据的一致。

代码就不贴了。

第二个练习,简单说一下。

Nginx 相对于 Apache 的优势:

  • Apache 是同步多进程模型,一个连接对应一个进程,Nginx 是异步的,多个连接(万级别)可以对应一个进程
  • Nginx 的抗并发能力强很多,对资源需求更少
  • Nginx 支持反向代理
  • Nginx 支持 7 层负载均衡

Apache 相对 Nginx 的优点:

  • Rewrite,比 Nginx 的 Rewrite 强大
  • 模块超多,基本想到的都可以找到

一般来说,需要性能的 Web 服务,用 Nginx,如果不需要性能只求稳定,那就 Apache 吧。总之,就是看自己需求的。

但是从个人使用经历来看,我会推荐 Nginx 作为 Web 服务器的首选。如果你是新手,什么都没接触过,不妨先试试 Nginx?

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
11天前
|
负载均衡 应用服务中间件 Linux
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
这篇博客文章详细介绍了Nginx的下载、安装、配置以及使用,包括正向代理、反向代理、负载均衡、动静分离等高级功能,并通过具体实例讲解了如何进行配置。
61 4
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
|
1天前
|
监控 Linux 云计算
Linux操作系统在云计算环境中的实践与优化###
【10月更文挑战第16天】 本文探讨了Linux操作系统在云计算环境中的应用实践,重点分析了其在稳定性、安全性和高效性方面的优势。通过具体案例,阐述了Linux如何支持虚拟化技术、实现资源高效分配以及与其他开源技术的无缝集成。文章还提供了针对Linux系统在云计算中的优化建议,包括内核参数调整、文件系统选择和性能监控工具的应用,旨在帮助读者更好地理解和应用Linux于云计算场景。 ###
8 3
|
8天前
|
负载均衡 应用服务中间件 nginx
Nginx的6大负载均衡策略及权重轮询手写配置
【10月更文挑战第9天】 Nginx是一款高性能的HTTP服务器和反向代理服务器,它在处理大量并发请求时表现出色。Nginx的负载均衡功能可以将请求分发到多个服务器,提高网站的吞吐量和可靠性。以下是Nginx支持的6大负载均衡策略:
30 7
|
6天前
|
负载均衡 算法 Java
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
尼恩,一位资深架构师,分享了关于负载均衡及其策略的深入解析,特别是基于权重的负载均衡策略。文章不仅介绍了Nginx的五大负载均衡策略,如轮询、加权轮询、IP哈希、最少连接数等,还提供了手写加权轮询算法的Java实现示例。通过这些内容,尼恩帮助读者系统化理解负载均衡技术,提升面试竞争力,实现技术上的“肌肉展示”。此外,他还提供了丰富的技术资料和面试指导,助力求职者在大厂面试中脱颖而出。
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
|
9天前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
114 3
|
8天前
|
缓存 负载均衡 算法
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
Nginx 是一款高性能的 HTTP 和反向代理服务器,也是一个通用的 TCP/UDP 代理服务器,以及一个邮件代理服务器和通用的 HTTP 缓存服务器。
17 0
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
|
15天前
|
应用服务中间件 Shell PHP
windows系统配置nginx环境运行pbootcms访问首页直接404的问题
windows系统配置nginx环境运行pbootcms访问首页直接404的问题
|
15天前
|
应用服务中间件 Linux nginx
Linux下操作Nginx相关命令
Linux下操作Nginx相关命令
|
16天前
|
开发框架 负载均衡 前端开发
Nginx负载均衡
Nginx负载均衡
|
16天前
|
负载均衡 Java 应用服务中间件
Nginx负载均衡配置
Nginx负载均衡配置