Linux环境下Nginx及负载均衡

本文涉及的产品
全局流量管理 GTM,标准版 1个月
应用型负载均衡 ALB,每月750个小时 15LCU
日志服务 SLS,月写入数据量 50GB 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)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
7天前
|
Ubuntu Linux Shell
(已解决)Linux环境—bash: wget: command not found; Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
(已成功解决)Linux环境报错—bash: wget: command not found;常见Linux发行版本,Linux中yum、rpm、apt-get、wget的区别;Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
139 68
(已解决)Linux环境—bash: wget: command not found; Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
|
4天前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
8天前
|
负载均衡 Ubuntu 应用服务中间件
nginx修改网站默认根目录及发布(linux、centos、ubuntu)openEuler软件源repo站点
通过合理配置 Nginx,我们可以高效地管理和发布软件源,为用户提供稳定可靠的服务。
51 13
|
13天前
|
弹性计算 负载均衡 网络协议
ECS中实现nginx4层7层负载均衡和ALB/NLB原SLB负载均衡
通过本文的介绍,希望您能深入理解并掌握如何在ECS中实现Nginx四层和七层负载均衡,以及如何使用ALB和NLB进行高效的负载均衡配置,以提高系统的性能和可靠性。
60 9
|
1月前
|
缓存 负载均衡 算法
如何配置Nginx反向代理以实现负载均衡?
如何配置Nginx反向代理以实现负载均衡?
|
24天前
|
负载均衡 算法 应用服务中间件
Nginx的负载均衡
Nginx 是一款高性能的Web服务器与反向代理服务器,支持负载均衡功能,能有效提升系统性能与可靠性。其负载均衡策略包括基于轮询和权重的分配方法,以及IP哈希、最小连接数等算法,可根据实际需求灵活选择。
86 5
|
26天前
|
负载均衡 前端开发 应用服务中间件
负载均衡指南:Nginx与HAProxy的配置与优化
负载均衡指南:Nginx与HAProxy的配置与优化
49 3
|
27天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
64 3
|
1月前
|
缓存 Ubuntu Linux
Linux环境下测试服务器的DDR5内存性能
通过使用 `memtester`和 `sysbench`等工具,可以有效地测试Linux环境下服务器的DDR5内存性能。这些工具不仅可以评估内存的读写速度,还可以检测内存中的潜在问题,帮助确保系统的稳定性和性能。通过合理配置和使用这些工具,系统管理员可以深入了解服务器内存的性能状况,为系统优化提供数据支持。
39 4
|
1月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
115 3