Linux下nginx服务器安装及负载均衡怎么配置

发布时间 - 2023-05-13 00:00:00    点击率:

一、搭建测试环境

这里的测试环境为通过virtualbox 安装的两台lubuntu 19.04 虚拟机,linux 系统安装方法不作赘述。

为了保证两台 linux 虚拟机之间的相互访问,虚拟机的网络配置除了默认的 nat 方式外,还使用了 virtualbox 软件提供的内部网络(internal) 联网方式。

此外,还需要将两台虚拟机中与“内部网络”相关联的网卡,绑定上 同一网段 的静态 ip 地址,则两台主机形成局域网络,相互之间可以直接访问。

网络配置

打开 virtualbox 软件,分别进入两台虚拟机的设置界面,为其添加 连接方式为内部网络 的网络连接,截图如下(两台虚拟机作同样的配置):

内部网络

登录进虚拟机系统,使用 ip addr 命令查看当前的网络连接信息:

$ ip addr
...
2: enp0s3:  mtu 1500 qdisc fq_codel state up group default qlen 1000
 link/ether 08:00:27:38:65:a8 brd ff:ff:ff:ff:ff:ff
 inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute enp0s3
  valid_lft 86390sec preferred_lft 86390sec
 inet6 fe80::9a49:54d3:2ea6:1b50/64 scope link noprefixroute
  valid_lft forever preferred_lft forever
3: enp0s8:  mtu 1500 qdisc fq_codel state up group default qlen 1000
 link/ether 08:00:27:0d:0b:de brd ff:ff:ff:ff:ff:ff
 inet6 fe80::2329:85bd:937e:c484/64 scope link noprefixroute
  valid_lft forever preferred_lft forever

可以看到,此时的 enp0s8 网卡还没有绑定 ipv4 地址,需要为其手动指定静态 ip。

需要 注意 的是,从 ubuntu 17.10 版本开始,一个新的名为 netplan 的工具被引入,原来的网络配置文件 /etc/network/interfaces 不再生效。

所以为网卡设置静态 ip 时需要修改 /etc/netplan/01-network-manager-all.yaml 配置文件,示例如下:

network:
 version: 2
 renderer: networkmanager
  ethernets:
  enp0s8:
   dhcp4: no
   dhcp6: no
   addresses: [192.168.1.101/24]
#   gateway4: 192.168.1.101
#   nameservers:
#     addresses: [192.168.1.101, 8.8.8.8]

由于两台主机处于同一子网,网关和 dns 服务器未配置的情况下仍可以互相访问。对应的配置项暂时先注释掉(后续可以尝试自行搭建 dns 服务器)。

编辑完成后运行 sudo netplan apply 命令,前面配置的静态 ip 即可生效。

$ ip addr
...
3: enp0s8:  mtu 1500 qdisc fq_codel state up group default qlen 1000
  link/ether 08:00:27:0d:0b:de brd ff:ff:ff:ff:ff:ff
  inet 192.168.1.101/24 brd 192.168.1.255 scope global noprefixroute enp0s8
    valid_lft forever preferred_lft forever
  inet6 fe80::a00:27ff:fe0d:bde/64 scope link
    valid_lft forever preferred_lft forever

登录进另一台虚拟机中,执行同样的操作(注意配置文件中的 addresses 项改为 [192.168.1.102/24] )。两台虚拟机的网络即配置完成。

此时有 linux 虚拟机 server1,ip 地址为 192.168.1.101;linux 虚拟机 server2,ip 地址为 192.168.1.102。两台主机可相互访问。测试如下:

starky@server1:~$ ping 192.168.1.102 -c 2
ping 192.168.1.102 (192.168.1.102) 56(84) bytes of data.
64 bytes from 192.168.1.102: icmp_seq=1 ttl=64 time=0.951 ms
64 bytes from 192.168.1.102: icmp_seq=2 ttl=64 time=0.330 ms
--- 192.168.1.102 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 0.330/0.640/0.951/0.311 ms
skitar@server2:~$ ping 192.168.1.101 -c 2
ping 192.168.1.101 (192.168.1.101) 56(84) bytes of data.
64 bytes from 192.168.1.101: icmp_seq=1 ttl=64 time=0.223 ms
64 bytes from 192.168.1.101: icmp_seq=2 ttl=64 time=0.249 ms
--- 192.168.1.101 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 29ms
rtt min/avg/max/mdev = 0.223/0.236/0.249/0.013 ms

二、安装 nginx 服务器

nginx 的安装方式主要有两种:

  • 预编译的二进制程序。这是最简单和最快速的安装方式,各主流操作系统都可以通过包管理器(如 ubuntu 的 apt-get)安装。此种方式会安装几乎所有的 官方 模块或插件。

  • 从源代码编译安装。这种方式相对于前者更加灵活,可以自行选择需要安装的模块或第三方插件。

本示例并没有特殊的需求,所以直接选择第一种安装方式。命令如下:

$ sudo apt-get update
$ sudo apt-get install nginx

安装成功后,通过 systemctl status nginx 命令查看 nginx 服务的运行状态:

$ systemctl status nginx
● nginx.service - a high performance web server and a reverse proxy server
  loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: en
  active: active (running) since tue 2019-07-02 01:22:07 cst; 26s ago
   docs: man:nginx(8)
 main pid: 3748 (nginx)
  tasks: 2 (limit: 1092)
  memory: 4.9m
  cgroup: /system.slice/nginx.service
      ├─3748 nginx: master process /usr/sbin/nginx -g daemon on; master_pro
      └─3749 nginx: worker process

通过 curl -i 127.0.0.1 命令验证 web 服务器是否可以正常访问:

$ curl -i 127.0.0.1
http/1.1 200 ok
server: nginx/1.15.9 (ubuntu)
...

三、负载均衡配置

负载均衡(load-balancing)即按照一定的规则将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度。

简单的示例图如下:

load-balancing

如某网站应用部署在多台主机构成的服务器集群上,负载均衡服务器位于终端用户和服务器集群之间,负责接收终端用户的访问流量,并根据一定的规则将用户访问 分发 给后端的服务器主机,从而提高在高并发状态下的响应速度。

负载均衡服务器

nginx 可以通过 upstream 选项配置负载均衡。这里使用虚拟机 server1 作为负载均衡服务器。

修改 serve1 上默认站点的配置文件( sudo vim /etc/nginx/sites-available/default ),改为如下内容:

upstream backend {
  server 192.168.1.102:8000;
  server 192.168.1.102;
}
server {
  listen 80;

  location / {
    proxy_pass http://backend;
  }
}

基于测试的目的,当前只有两台虚拟机。server1(192.168.1.101)已经作为负载均衡服务器,所以使用 server2(192.168.1.102)作为应用服务器。

这里借助 nginx 的虚拟主机功能,分别将 192.168.1.102 和 192.168.1.102:8000 “模拟”为两台不同的应用服务器。

应用服务器

修改 server2 上默认站点的配置文件( sudo vim /etc/nginx/sites-available/default ),改为如下内容:

server {
    listen 80;

    root /var/www/html;

    index index.html index.htm index.nginx-debian.html;

    server_name 192.168.1.102;

    location / {
        try_files $uri $uri/ =404;
    }
}

在 /var/www/html 目录下创建 index.html 文件,作为 default 站点的 index 页面,内容如下:


  
    index page from server1
  
  
    

this is server1, address 192.168.1.102.

运行 sudo systemctl restart nginx 命令重启 nginx 服务,此时访问 即可获取刚刚创建的 index.html 页面:

$ curl 192.168.1.102

  
    index page from server1
  
  
    

this is server1, address 192.168.1.102.

配置“另一台主机”上的站点,在 server2 上创建 /etc/nginx/sites-available/server2 配置文件,内容如下:

server {
    listen 8000;

    root /var/www/html;

    index index2.html index.htm index.nginx-debian.html;

    server_name 192.168.1.102;

    location / {
        try_files $uri $uri/ =404;
    }
}

注意监听端口和 index 页面的配置变化。在 /var/www/html 目录下创建 index2.html 文件,作为 server2 站点的 index 页面,内容如下:


  
    index page from server2
  
  
    

this is server2, address 192.168.1.102:8000.

ps:为了测试目的,default 站点和 server2 站点配置在同一个主机 server2 上,且页面稍有不同。实际环境中通常将这两个站点配置在不同的主机上,且内容一致。

运行 sudo ln -s /etc/nginx/sites-available/server2 /etc/nginx/sites-enabled/ 命令启用刚刚创建的 server2 站点。

重启 nginx 服务,此时访问  即可获取刚刚创建的 index2.html 页面:

$ curl 192.168.1.102:8000

  
    index page from server2
  
  
    

this is server2, address 192.168.1.102:8000.

负载均衡测试

回到负载均衡服务器即虚拟机 server1 上,其配置文件中设置的 反向代理 url 为  。

由于未曾配置域名解析服务,无法将 urlhttp://backend 定位到正确的位置。

可以修改 server1 上的 /etc/hosts 文件,添加如下一条记录:

127.0.0.1 backend

即可将该域名解析到本地 ip ,完成对负载均衡服务器的访问。

重启 nginx 服务,在 server1 上访问 ,效果如下:

$ curl http://backend

  
    index page from server1
  
  
    

this is server1, address 192.168.1.102.

$ curl http://backend index page from server2

this is server2, address 192.168.1.102:8000.

$ curl http://backend index page from server1

this is server1, address 192.168.1.102.

$ curl http://backend index page from server2

this is server2, address 192.168.1.102:8000.

从输出中可以看出,server1 对负载均衡服务器 的访问,完成了对应用服务器 server2 上两个 web 站点的 轮询 ,起到负载均衡的作用。

四、负载均衡方法

nginx 开源版本提供四种负载均衡的实现方式,简单介绍如下。

1. round robin

用户请求 均匀 地分配给后端服务器集群(可以通过 weight 选项设置轮询的 权重 ),这是 nginx 默认使用的负载均衡方式:

upstream backend {
  server backend1.example.com weight=5;
  server backend2.example.com;
}

2. least connections

用户请求会优先转发给集群中当前活跃连接数最少的服务器。同样支持 weight 选项。

upstream backend {
  least_conn;
  server backend1.example.com;
  server backend2.example.com;
}

3. ip hash

用户请求会根据 客户端 ip 地址 进行转发。即该方式意图保证某个特定的客户端最终会访问 同一个 服务器主机。

upstream backend {
  ip_hash;
  server backend1.example.com;
  server backend2.example.com;
}

4. generic hash

用户请求会根据一个 自定义键值 确定最终转发的目的地,该键值可以是字符串、变量或者组合(如源 ip 和端口号)。

upstream backend {
  hash $request_uri consistent;
  server backend1.example.com;
  server backend2.example.com;
}

权重

参考下面的示例配置:

upstream backend {
  server backend1.example.com weight=5;
  server backend2.example.com;
  server 192.0.0.1 backup;
}

默认权重(weight)为 1 。 backup 服务器 只有在所有其他服务器全部宕机的情况下才会接收请求。

如上面的示例,每 6 个请求会有 5 个转发给 backend1.example.com,1 个转发给 backend2.example.com。只有当 backend1 和 backend2 全部宕机时,192.0.0.1 才会接收并处理请求。


# linux  # nginx  # 负载均衡  # 两台  # 配置文件  # 可以通过  # 这是  # 重启  # 才会  # 转发给  # 为其  # 绑定 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速搭建高效可靠的建站解决方案?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  如何为不同团队 ID 动态生成多个非值班状态按钮  如何用5美元大硬盘VPS安全高效搭建个人网站?  浅谈redis在项目中的应用  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  公司门户网站制作流程,华为官网怎么做?  教学论文网站制作软件有哪些,写论文用什么软件 ?  EditPlus中的正则表达式 实战(4)  如何在局域网内绑定自建网站域名?  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  如何在建站宝盒中设置产品搜索功能?  Swift中swift中的switch 语句  如何解决hover在ie6中的兼容性问题  如何确保FTP站点访问权限与数据传输安全?  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  如何自定义建站之星模板颜色并下载新样式?  微信小程序 五星评分(包括半颗星评分)实例代码  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  如何在阿里云购买域名并搭建网站?  简历在线制作网站免费版,如何创建个人简历?  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  Laravel如何与Pusher实现实时通信?(WebSocket示例)  如何用虚拟主机快速搭建网站?详细步骤解析  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  高性价比服务器租赁——企业级配置与24小时运维服务  iOS UIView常见属性方法小结  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  Laravel如何处理文件下载请求?(Response示例)  详解CentOS6.5 安装 MySQL5.1.71的方法  Python正则表达式进阶教程_复杂匹配与分组替换解析  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  三星、SK海力士获美批准:可向中国出口芯片制造设备  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  魔方云NAT建站如何实现端口转发?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  如何快速打造个性化非模板自助建站?  北京企业网站设计制作公司,北京铁路集团官方网站?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  Laravel如何使用Collections进行数据处理?(实用方法示例)  如何实现javascript表单验证_正则表达式有哪些实用技巧  Laravel如何实现多对多模型关联?(Eloquent教程)