>  기사  >  운영 및 유지보수  >  Linux에서 nginx 서버를 설치하고 로드 밸런싱을 구성하는 방법

Linux에서 nginx 서버를 설치하고 로드 밸런싱을 구성하는 방법

WBOY
WBOY앞으로
2023-05-13 23:19:041002검색

1. 테스트 환경 설정

여기서 테스트 환경은 virtualbox를 통해 설치된 두 개의 lubuntu 19.04 가상 머신입니다. Linux 시스템 설치 방법은 자세히 설명하지 않습니다.

두 개의 Linux 가상 머신 간의 상호 액세스를 보장하기 위해 기본 nat 방법 외에도 가상 머신의 네트워크 구성에서는 virtualbox 소프트웨어에서 제공하는 내부 네트워크(내부) 네트워킹 방법도 사용합니다.

또한 두 가상 머신의 "내부 네트워크"와 연결된 네트워크 카드는 동일한 네트워크 세그먼트의 고정 IP 주소에 바인딩되어야 두 호스트가 LAN을 형성하고 각각에 직접 액세스할 수 있습니다. 다른.

네트워크 구성

virtualbox 소프트웨어를 열고 각각 두 가상 머신의 설정 인터페이스에 들어간 후 연결 방법으로 내부 네트워크에 대한 네트워크 연결을 추가합니다. 스크린샷은 다음과 같습니다(두 가상 머신에는 동일한 구성):

Linux에서 nginx 서버를 설치하고 로드 밸런싱을 구성하는 방법

내부 네트워크

가상 머신 시스템에 로그인하고 ip addr 명령을 사용하여 현재 네트워크 연결 정보를 확인합니다.

$ ip addr
...
2: enp0s3: <broadcast,multicast,up,lower_up> 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: <broadcast,multicast,up,lower_up> 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는 더 이상 유효하지 않습니다. /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: <broadcast,multicast,up,lower_up> 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)即按照一定的规则将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度。

简单的示例图如下:

Linux에서 nginx 서버를 설치하고 로드 밸런싱을 구성하는 방법

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 页面,内容如下:

<html>
  <head>
    <title>index page from server1</title>
  </head>
  <body>
    <h1>this is server1, address 192.168.1.102.</h1>
  </body>
</html>

运行 sudo systemctl restart nginx 

그래서 네트워크 카드에 고정 IP를 설정할 때 /etc/netplan/01-network-manager-all.yaml 구성 파일을 수정해야 합니다. 예는 다음과 같습니다. 🎜
$ curl 192.168.1.102
<html>
  <head>
    <title>index page from server1</title>
  </head>
  <body>
    <h1>this is server1, address 192.168.1.102.</h1>
  </body>
</html>
🎜두 호스트가 동일한 서브넷, 게이트웨이 및 DNS 서버가 구성되지 않았습니다. 여전히 서로 액세스할 수 있습니다. 지금은 해당 구성 항목을 주석 처리합니다(나중에 고유한 DNS 서버를 구축해 볼 수 있습니다). 🎜🎜수정이 완료된 후 sudo netplan apply 명령을 실행하면 이전에 설정한 고정 IP가 적용됩니다. 🎜
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;
    }
}
🎜다른 가상 머신에 로그인하여 동일한 작업을 수행합니다. (구성 파일의 주소 항목이 [192.168.1.102/24]로 변경됩니다.) 두 가상 머신의 네트워크 구성이 완료되었습니다. 🎜🎜현재 IP 주소가 192.168.1.101인 Linux 가상 머신 server1이 있고, IP ​​주소가 192.168.1.102인 Linux 가상 머신 server2가 있습니다. 두 호스트는 서로 액세스할 수 있습니다. 테스트 방법은 다음과 같습니다. 🎜
<html>
  <head>
    <title>index page from server2</title>
  </head>
  <body>
    <h1>this is server2, address 192.168.1.102:8000.</h1>
  </body>
</html>
🎜🎜 2. nginx 서버 설치 🎜🎜🎜nginx 설치 방법은 크게 두 가지가 있습니다. 🎜
  • 미리 컴파일된 바이너리 프로그램 . 이것은 가장 간단하고 빠른 설치 방법입니다. 모든 주요 운영 체제는 패키지 관리자(예: ubuntu의 apt-get)를 통해 설치할 수 있습니다. 이 방법을 사용하면 거의 모든 공식 모듈이나 플러그인이 설치됩니다.
    🎜

  • 소스 코드에서 컴파일하고 설치합니다. 이 방법은 이전 방법보다 더 유연하며 설치해야 하는 모듈이나 타사 플러그인을 선택할 수 있습니다.
    🎜

🎜이 예시에는 특별한 요구 사항이 없으므로 첫 번째 설치 방법을 직접 선택하세요. 명령은 다음과 같습니다. 🎜
$ curl 192.168.1.102:8000
<html>
  <head>
    <title>index page from server2</title>
  </head>
  <body>
    <h1>this is server2, address 192.168.1.102:8000.</h1>
  </body>
</html>
🎜설치가 성공적으로 완료되면 systemctl status nginx 명령을 통해 nginx 서비스의 실행 상태를 확인합니다. 🎜
$ curl http://backend
<html>
  <head>
    <title>index page from server1</title>
  </head>
  <body>
    <h1>this is server1, address 192.168.1.102.</h1>
  </body>
</html>
$ curl http://backend
<html>
  <head>
    <title>index page from server2</title>
  </head>
  <body>
    <h1>this is server2, address 192.168.1.102:8000.</h1>
  </body>
</html>
$ curl http://backend
<html>
  <head>
    <title>index page from server1</title>
  </head>
  <body>
    <h1>this is server1, address 192.168.1.102.</h1>
  </body>
</html>
$ curl http://backend
<html>
  <head>
    <title>index page from server2</title>
  </head>
  <body>
    <h1>this is server2, address 192.168.1.102:8000.</h1>
  </body>
</html>
🎜 curl -i를 통해 웹 서버를 확인합니다. 127.0.0.1 명령 정상적으로 접속 가능한지 여부: 🎜
upstream backend {
  server backend1.example.com weight=5;
  server backend2.example.com;
}
🎜🎜 3. 로드 밸런싱 구성 🎜🎜🎜 로드 밸런싱(load-balancing)이란 특정 규칙에 따라 여러 운영 단위에 로드를 할당하여 성능을 향상시키는 것을 의미합니다. 서비스의 가용성 및 응답 속도. 🎜🎜간단한 예시 사진은 다음과 같습니다. 🎜🎜nginx 서버 설치 및 로드 밸런싱 Linux에서 구성 방법🎜🎜load-balancing🎜🎜예를 들어 웹 사이트 애플리케이션은 여러 호스트로 구성된 서버 클러스터에 배포됩니다. 로드 밸런싱 서버는 최종 사용자와 서버 클러스터 사이에 위치합니다. 최종 사용자의 액세스 트래픽을 수신하고 특정 규칙에 따라 균형을 유지하기 위해 사용자 액세스를 백엔드 서버 호스트에 분배함으로써 높은 동시성 조건에서 응답 속도를 향상시킵니다. 🎜🎜🎜로드 밸런싱 서버🎜🎜🎜nginx는 업스트림 옵션을 통해 로드 밸런싱을 구성할 수 있습니다. 여기서는 가상 머신 server1이 부하 분산 서버로 사용됩니다. 🎜🎜serv1의 기본 사이트 구성 파일(sudo vim /etc/nginx/sites-available/default)을 다음 내용으로 수정합니다. 🎜
upstream backend {
  least_conn;
  server backend1.example.com;
  server backend2.example.com;
}
🎜테스트 목적으로 현재 가상 머신은 두 개뿐입니다. server1(192.168.1.101)은 로드 밸런싱 서버로 사용되었으므로 server2(192.168.1.102)는 응용 프로그램 서버로 사용됩니다. 🎜🎜여기에서는 nginx의 가상 호스트 기능을 사용하여 192.168.1.102 및 192.168.1.102:8000을 두 개의 서로 다른 애플리케이션 서버로 "시뮬레이트"합니다. 🎜🎜🎜Application Server🎜🎜🎜server2의 기본 사이트 구성 파일( sudo vim /etc/nginx/sites-available/default )을 다음 내용으로 수정합니다. 🎜
upstream backend {
  ip_hash;
  server backend1.example.com;
  server backend2.example.com;
}
🎜 /var/www/html에 인덱스 생성 .html 파일은 기본 사이트의 인덱스 페이지로 내용은 다음과 같습니다. 🎜
upstream backend {
  hash $request_uri consistent;
  server backend1.example.com;
  server backend2.example.com;
}
🎜 sudo systemctl restart nginx 명령을 실행하면 nginx 서비스를 다시 시작할 수 있습니다. 방금 만든 index.html 페이지: 🎜
$ curl 192.168.1.102
<html>
  <head>
    <title>index page from server1</title>
  </head>
  <body>
    <h1>this is server1, address 192.168.1.102.</h1>
  </body>
</html>

配置“另一台主机”上的站点,在 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 页面,内容如下:

<html>
  <head>
    <title>index page from server2</title>
  </head>
  <body>
    <h1>this is server2, address 192.168.1.102:8000.</h1>
  </body>
</html>

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
<html>
  <head>
    <title>index page from server2</title>
  </head>
  <body>
    <h1>this is server2, address 192.168.1.102:8000.</h1>
  </body>
</html>

负载均衡测试

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

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

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

127.0.0.1 backend

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

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

$ curl http://backend
<html>
  <head>
    <title>index page from server1</title>
  </head>
  <body>
    <h1>this is server1, address 192.168.1.102.</h1>
  </body>
</html>
$ curl http://backend
<html>
  <head>
    <title>index page from server2</title>
  </head>
  <body>
    <h1>this is server2, address 192.168.1.102:8000.</h1>
  </body>
</html>
$ curl http://backend
<html>
  <head>
    <title>index page from server1</title>
  </head>
  <body>
    <h1>this is server1, address 192.168.1.102.</h1>
  </body>
</html>
$ curl http://backend
<html>
  <head>
    <title>index page from server2</title>
  </head>
  <body>
    <h1>this is server2, address 192.168.1.102:8000.</h1>
  </body>
</html>

从输出中可以看出,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 서버를 설치하고 로드 밸런싱을 구성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제