• 售前

  • 售后

热门帖子
入门百科

Linux 体系 nginx 服务器安装及负载平衡配置详解

[复制链接]
去火星三小时自 显示全部楼层 发表于 2021-10-26 14:29:57 |阅读模式 打印 上一主题 下一主题
nginx(engine x) 是一个 高性能 的 HTTP 和 反向署理 服务器、邮件署理服务器以及通用的 TCP/UDP 署理服务器。其特点为轻量级(占用系统资源少)、稳固性好、可扩展性(模块化布局)、并发本领强、设置简朴等。
本文紧张先容在测试环境中通过 nginx 实现基本的 负载均衡 功能。
nginx 可以提供 HTTP 服务,包罗处理静态文件,支持 SSL 和 TLS SNI、GZIP 网页压缩、假造主机、URL 重写等功能,可以搭配 FastCGI、uwsgi 等程序处理动态请求。
别的,nginx 还可以用于署理、反向署理、负载均衡、缓存等服务器功能,在集群环境中改善网络负载、提高可用性。
一、搭建测试环境
这里的测试环境为通过VirtualBox 安装的两台Lubuntu 19.04 假造机,Linux 系统安装方法不作赘述。
为了包管两台 Linux 假造机之间的相互访问,假造机的网络设置除了默认的 NAT 方式外,还使用了 VirtualBox 软件提供的内部网络(Internal) 联网方式。
别的,还必要将两台假造机中与“内部网络”干系联的网卡,绑定上 同一网段 的静态 IP 地点,则两台主机形成局域网络,相互之间可以直接访问。
网络设置
打开 VirtualBox 软件,分别进入两台假造机的设置界面,为其添加 毗连方式为内部网络 的网络毗连,截图如下(两台假造机作同样的设置):

内部网络
登录进假造机系统,使用 ip addr 下令查看当前的网络毗连信息:
  1. $ ip addr
  2. ...
  3. 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  4. link/ether 08:00:27:38:65:a8 brd ff:ff:ff:ff:ff:ff
  5. inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute enp0s3
  6.   valid_lft 86390sec preferred_lft 86390sec
  7. inet6 fe80::9a49:54d3:2ea6:1b50/64 scope link noprefixroute
  8.   valid_lft forever preferred_lft forever
  9. 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  10. link/ether 08:00:27:0d:0b:de brd ff:ff:ff:ff:ff:ff
  11. inet6 fe80::2329:85bd:937e:c484/64 scope link noprefixroute
  12.   valid_lft forever preferred_lft forever
复制代码
可以看到,此时的 enp0s8 网卡还没有绑定 IPv4 地点,必要为其手动指定静态 IP。
必要 注意 的是,从 Ubuntu 17.10 版本开始,一个新的名为 netplan 的工具被引入,原来的网络设置文件
  1. /etc/network/interfaces
复制代码
不再见效。
所以为网卡设置静态 IP 时必要修改 /etc/netplan/01-network-manager-all.yaml 设置文件,示例如下:
  1. network:
  2. version: 2
  3. renderer: NetworkManager
  4.   ethernets:
  5.   enp0s8:
  6.    dhcp4: no
  7.    dhcp6: no
  8.    addresses: [192.168.1.101/24]
  9. #   gateway4: 192.168.1.101
  10. #   nameservers:
  11. #     addresses: [192.168.1.101, 8.8.8.8]
复制代码
由于两台主机处于同一子网,网关和 DNS 服务器未设置的环境下仍可以相互访问。对应的设置项暂时先表明掉(后续可以尝试自行搭建 DNS 服务器)。
编辑完成后运行
  1. sudo netplan apply
复制代码
下令,前面设置的静态 IP 即可见效。
  1. $ ip addr
  2. ...
  3. 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  4.   link/ether 08:00:27:0d:0b:de brd ff:ff:ff:ff:ff:ff
  5.   inet 192.168.1.101/24 brd 192.168.1.255 scope global noprefixroute enp0s8
  6.     valid_lft forever preferred_lft forever
  7.   inet6 fe80::a00:27ff:fe0d:bde/64 scope link
  8.     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。两台主机可相互访问。测试如下:
  1. starky@server1:~$ ping 192.168.1.102 -c 2
  2. PING 192.168.1.102 (192.168.1.102) 56(84) bytes of data.
  3. 64 bytes from 192.168.1.102: icmp_seq=1 ttl=64 time=0.951 ms
  4. 64 bytes from 192.168.1.102: icmp_seq=2 ttl=64 time=0.330 ms
  5. --- 192.168.1.102 ping statistics ---
  6. 2 packets transmitted, 2 received, 0% packet loss, time 2ms
  7. rtt min/avg/max/mdev = 0.330/0.640/0.951/0.311 ms
  8. skitar@server2:~$ ping 192.168.1.101 -c 2
  9. PING 192.168.1.101 (192.168.1.101) 56(84) bytes of data.
  10. 64 bytes from 192.168.1.101: icmp_seq=1 ttl=64 time=0.223 ms
  11. 64 bytes from 192.168.1.101: icmp_seq=2 ttl=64 time=0.249 ms
  12. --- 192.168.1.101 ping statistics ---
  13. 2 packets transmitted, 2 received, 0% packet loss, time 29ms
  14. rtt min/avg/max/mdev = 0.223/0.236/0.249/0.013 ms
复制代码
二、安装 nginx 服务器
nginx 的安装方式紧张有两种:
      
  • 预编译的二进制程序。这是最简朴和最快速的安装方式,各主流操纵系统都可以通过包管理器(如 Ubuntu 的 apt-get)安装。此种方式会安装几乎所有的 官方 模块或插件。  
  • 从源代码编译安装。这种方式相对于前者更加机动,可以自行选择必要安装的模块或第三方插件。
本示例并没有特殊的需求,所以直接选择第一种安装方式。下令如下:
  1. $ sudo apt-get update
  2. $ sudo apt-get install nginx
复制代码
安装成功后,通过
  1. systemctl status nginx
复制代码
下令查看 nginx 服务的运行状态:
  1. $ systemctl status nginx
  2. ● nginx.service - A high performance web server and a reverse proxy server
  3.   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: en
  4.   Active: active (running) since Tue 2019-07-02 01:22:07 CST; 26s ago
  5.    Docs: man:nginx(8)
  6. Main PID: 3748 (nginx)
  7.   Tasks: 2 (limit: 1092)
  8.   Memory: 4.9M
  9.   CGroup: /system.slice/nginx.service
  10.       ├─3748 nginx: master process /usr/sbin/nginx -g daemon on; master_pro
  11.       └─3749 nginx: worker process
复制代码
通过
  1. curl -I 127.0.0.1
复制代码
下令验证 Web 服务器是否可以正常访问:
  1. $ curl -I 127.0.0.1
  2. HTTP/1.1 200 OK
  3. Server: nginx/1.15.9 (Ubuntu)
  4. ...
复制代码
三、负载均衡设置
负载均衡(load-balancing)即按照肯定的规则将负载分摊到多个操纵单元上实行,从而提高服务的可用性和相应速度。
简朴的示例图如下:

load-balancing
如某网站应用部署在多台主机构成的服务器集群上,负载均衡服务器位于终端用户和服务器集群之间,负责接收终端用户的访问流量,并根据肯定的规则将用户访问 分发 给后端的服务器主机,从而提高在高并发状态下的相应速度。
负载均衡服务器
nginx 可以通过 upstream 选项设置负载均衡。这里使用假造机 server1 作为负载均衡服务器。
修改 serve1 上默认站点的设置文件( sudo vim /etc/nginx/sites-available/default ),改为如下内容:
  1. upstream backend {
  2.   server 192.168.1.102:8000;
  3.   server 192.168.1.102;
  4. }
  5. server {
  6.   listen 80;
  7.   location / {
  8.     proxy_pass http://backend;
  9.   }
  10. }
复制代码
基于测试的目标,当前只有两台假造机。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 ),改为如下内容:
  1. server {
  2.     listen 80;
  3.     root /var/www/html;
  4.     index index.html index.htm index.nginx-debian.html;
  5.     server_name 192.168.1.102;
  6.     location / {
  7.         try_files $uri $uri/ =404;
  8.     }
  9. }
复制代码
在 /var/www/html 目次下创建 index.html 文件,作为 default 站点的 index 页面,内容如下:
  1. <html>
  2.   <head>
  3.     <title>Index Page From Server1</title>
  4.   </head>
  5.   <body>
  6.     <h1>This is Server1, Address 192.168.1.102.</h1>
  7.   </body>
  8. </html>
复制代码
运行
  1. sudo systemctl restart nginx
复制代码
下令重启 nginx 服务,此时访问http://192.168.1.102 即可获取刚刚创建的 index.html 页面:
  1. $ curl 192.168.1.102<html>
  2.   <head>
  3.     <title>Index Page From Server1</title>
  4.   </head>
  5.   <body>
  6.     <h1>This is Server1, Address 192.168.1.102.</h1>
  7.   </body>
  8. </html>
复制代码
设置“另一台主机”上的站点,在 server2 上创建
  1. /etc/nginx/sites-available/server2
复制代码
设置文件,内容如下:
  1. server {
  2.     listen 8000;
  3.     root /var/www/html;
  4.     index index2.html index.htm index.nginx-debian.html;
  5.     server_name 192.168.1.102;
  6.     location / {
  7.         try_files $uri $uri/ =404;
  8.     }
  9. }
复制代码
注意监听端口和 index 页面的设置变化。在 /var/www/html 目次下创建 index2.html 文件,作为 server2 站点的 index 页面,内容如下:
  1. <html>
  2.   <head>
  3.     <title>Index Page From Server2</title>
  4.   </head>
  5.   <body>
  6.     <h1>This is Server2, Address 192.168.1.102:8000.</h1>
  7.   </body>
  8. </html>
复制代码
PS:为了测试目标,default 站点和 server2 站点设置在同一个主机 server2 上,且页面稍有不同。实际环境中通常将这两个站点设置在不同的主机上,且内容同等。
运行
  1. sudo ln -s /etc/nginx/sites-available/server2 /etc/nginx/sites-enabled/
复制代码
下令启用刚刚创建的 server2 站点。
重启 nginx 服务,此时访问 http://192.168.1.102:8000 即可获取刚刚创建的 index2.html 页面:
  1. $ curl 192.168.1.102:8000<html>
  2.   <head>
  3.     <title>Index Page From Server2</title>
  4.   </head>
  5.   <body>
  6.     <h1>This is Server2, Address 192.168.1.102:8000.</h1>
  7.   </body>
  8. </html>
复制代码
负载均衡测试
回到负载均衡服务器即假造机 server1 上,其设置文件中设置的 反向署理 URL 为 http://backend 。
由于未曾设置域名剖析服务,无法将 URLhttp://backend 定位到精确的位置。
可以修改 server1 上的 /etc/hosts 文件,添加如下一条记录:
127.0.0.1 backend
即可将该域名剖析到当地 IP ,完成对负载均衡服务器的访问。
重启 nginx 服务,在 server1 上访问http://backend ,效果如下:
  1. $ curl http://backend<html>
  2.   <head>
  3.     <title>Index Page From Server1</title>
  4.   </head>
  5.   <body>
  6.     <h1>This is Server1, Address 192.168.1.102.</h1>
  7.   </body>
  8. </html>$ curl http://backend<html>
  9.   <head>
  10.     <title>Index Page From Server2</title>
  11.   </head>
  12.   <body>
  13.     <h1>This is Server2, Address 192.168.1.102:8000.</h1>
  14.   </body>
  15. </html>$ curl http://backend<html>
  16.   <head>
  17.     <title>Index Page From Server1</title>
  18.   </head>
  19.   <body>
  20.     <h1>This is Server1, Address 192.168.1.102.</h1>
  21.   </body>
  22. </html>$ curl http://backend<html>
  23.   <head>
  24.     <title>Index Page From Server2</title>
  25.   </head>
  26.   <body>
  27.     <h1>This is Server2, Address 192.168.1.102:8000.</h1>
  28.   </body>
  29. </html>
复制代码
从输出中可以看出,server1 对负载均衡服务器http://backend 的访问,完成了对应用服务器 server2 上两个 Web 站点的 轮询 ,起到负载均衡的作用。
四、负载均衡方法
nginx 开源版本提供四种负载均衡的实现方式,简朴先容如下。
1. Round Robin
用户请求 匀称 地分配给后端服务器集群(可以通过 weight 选项设置轮询的 权重 ),这是 nginx 默认使用的负载均衡方式:
  1. upstream backend {
  2.   server backend1.example.com weight=5;
  3.   server backend2.example.com;
  4. }
复制代码
2. Least Connections
用户请求会优先转发给集群中当前活跃毗连数最少的服务器。同样支持 weight 选项。
  1. upstream backend {
  2.   least_conn;
  3.   server backend1.example.com;
  4.   server backend2.example.com;
  5. }
复制代码
3. IP Hash
用户请求会根据 客户端 IP 地点 举行转发。即该方式意图包管某个特定的客户端终极会访问 同一个 服务器主机。
  1. upstream backend {
  2.   ip_hash;
  3.   server backend1.example.com;
  4.   server backend2.example.com;
  5. }
复制代码
4. Generic Hash
用户请求会根据一个 自定义键值 确定终极转发的目标地,该键值可以是字符串、变量大概组合(如源 IP 和端标语)。
  1. upstream backend {
  2.   hash $request_uri consistent;
  3.   server backend1.example.com;
  4.   server backend2.example.com;
  5. }
复制代码
权重
参考下面的示例设置:
  1. upstream backend {
  2.   server backend1.example.com weight=5;
  3.   server backend2.example.com;
  4.   server 192.0.0.1 backup;
  5. }
复制代码
默认权重(weight)为 1 。 backup 服务器 只有在所有其他服务器全部宕机的环境下才会接收请求。
如上面的示例,每 6 个请求会有 5 个转发给
  1. backend1.example.com
复制代码
,1 个转发给 backend2.example.com。只有当 backend1 和 backend2 全部宕机时,192.0.0.1 才会接收并处理请求。
参考资料
HTTP Load Balancing
总结
以上所述是小编给大家先容的Linux 系统 nginx 服务器安装及负载均衡设置详解,渴望对大家有所资助,假如大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对草根技术分享网站的支持!
假如你觉得本文对你有资助,欢迎转载,烦请注明出处,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作