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

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 命令查看当前的网络连接信息:

$ 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 不再生效。

所以为网卡设置静态 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)即按照一定的规则将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度。

简单的示例图如下:

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 命令重启 nginx 服务,此时访问http://192.168.1.102 即可获取刚刚创建的 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 服务,此时访问 http://192.168.1.102:8000 即可获取刚刚创建的 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 为 http://backend

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

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

127.0.0.1 backend

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

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

$ 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 对负载均衡服务器http://backend 的访问,完成了对应用服务器 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 才会接收并处理请求。

参考资料

HTTP Load Balancing

总结

以上所述是小编给大家介绍的Linux 系统 nginx 服务器安装及负载均衡配置详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • springboot+nginx+https+linux实现负载均衡加域名访问简单测试

    1.把springboot项目打包成三个jar包,并指定端口为 14341,14342,14343 2.下载腾讯云免费ssl证书,解压后会出现如下图文件夹 3.把nginx文件夹下的 .crt 和 .key文件复制到服务器,例如复制到 /home/ssl/xxx.crt /home/ssl/xxx.key 4.安装好nginx默认配置文件在 /usr/local/nginx/conf/nginx.conf 5.修改nginx.conf配置文件实现https+负载均衡的简单测试(此测试是在一台服务

  • linux服务器之LVS、Nginx和HAProxy负载均衡器对比总结

    LVS特点: 1.抗负载能力强,使用IP负载均衡技术,只做分发,所以LVS本身并没有多少流量产生: 2.稳定性.可靠性好,自身有完美的热备方案:(如:LVS+Keepalived) 3.应用范围比较广,可以对所有应用做负载均衡: 4.不支持正则处理,不能做动静分离. 常用四种算法: 1.rr:轮叫,轮流分配到后端服务器: 2.wrr:权重轮叫,根据后端服务器负载情况来分配: 3.lc:最小连接,分配已建立连接最少的服务器上: 4.wlc:权重最小连接,根据后端服务器处理能力来分配. 可以采用ip

  • linux下Nginx+Tomcat负载均衡配置方法

    Nginx+tomcat是目前主流的java web架构,如何让nginx+tomcat同时工作呢,也可以说如何使用nginx来反向代理tomcat后端均衡呢?直接安装配置如下: 1.JAVA JDK安装: #下载相应的jdk软件包,然后解压安装,我这里包名称为:jdk-7u25-linux-x64.tar.gz tar -xzf jdk-7u25-linux-x64.tar.gz ;mkdir -p /usr/java/ ;mv jdk1.7.0_25/ /usr/java/ 下. #然后配置

  • 使用nginx来负载均衡 本文在window与linux下配置nginx实现负载

    实现网站负载有两种办法,一种是购买硬件来实现,比如是硬件F5再到Citrix Netscalar,这些设备都几十万,不是一般人玩的,另一种是使用软件来实现,比如nginx,squid这类有反向代理功能的软件,本文就nginx安装实现负载. 首先是windows系统,这里建议使用window 2003企业版,而不要作用win7(太新了,我遇到无法启动nginx的问题).要说的是,在windows下配置安装nginx还是很容易的,少了 linux下下载tar再配置编译参数等等步骤,我们只要从下面的地

  • linux下nginx负载均衡搭建的方法步骤

    首先先了解下负载均衡,假设一个场景,如果有1000个客户同时访问你服务器时,而你只有一台服务器的Nginx,且只有一个MySQL服务器,那么这些请求 可能会高出你的的服务器承受能力,就会down掉: 解决方法: 1.垂直升级:就是增加服务器的配置,CPU,内存等 2.水平升级:添加多台服务器来分担服务器压力 常见的负载均衡器 根据工作在的协议层划分可划分为: 四层负载均衡:根据请求报文中的目标地址和端口进行调度 七层负载均衡:根据请求报文的内容进行调度,这种调度属于「代理」的方式 根据软硬件划分

  • Linux下Nginx负载均衡多个tomcat配置的方法步骤

    Linux下安装nginx和安装多个tomcat的方法这里不过多介绍,不清楚的可参考: Linux安装nginx: https://www.jb51.net/article/159519.htm Linux安装多个tomcat: https://www.jb51.net/article/159521.htm 当我们服务器安装好了nginx,并且安装了多台tomcat,那么我们现在可以试着玩玩nginx的负载均衡. 先简单介绍我的运行环境 一台阿里云服务器, Linux系统,jdk1.8, 已安装

  • 详解Linux系统配置nginx的负载均衡

    详解Linux系统配置nginx的负载均衡 负载均衡的几种方式: 1.轮询:默认按照时间顺序对所有服务器一个一个的访问,如果有服务器宕机,会自动剔除: 2.weight:服务器的方位几率和weight成正比,这个可以在服务器配置不均的时候进行配置: 3.ip_hash:对每个请求的ip进行hash计算,并按照一定的规则分配对应的服务器(可解决session共享): 4.fair:按照每台服务器的响应时间(rt)来分配请求,rt知道优先分配: 5.url_hash:按照访问url的hash值来分配

  • Linux 系统 nginx 服务器安装及负载均衡配置详解

    nginx(engine x) 是一个 高性能 的 HTTP 和 反向代理 服务器.邮件代理服务器以及通用的 TCP/UDP 代理服务器.其特点为轻量级(占用系统资源少).稳定性好.可扩展性(模块化结构).并发能力强.配置简单等. 本文主要介绍在测试环境中通过 nginx 实现基本的 负载均衡 功能. nginx 可以提供 HTTP 服务,包括处理静态文件,支持 SSL 和 TLS SNI.GZIP 网页压缩.虚拟主机.URL 重写等功能,可以搭配 FastCGI.uwsgi 等程序处理动态请求

  • nginx七层负载均衡配置详解

    目录 一.负载均衡介绍 二.nginx下载安装 1.下载nginx源码包 2.安装并启用 三.nginx七层负载均衡配置 real server设置: 客户端设置: 四.nginx扩充调度算法(sticky) 1.下载扩展包 2.编译前做一些优化: 3.重新编译 一.负载均衡介绍 1)四层负载均衡 所谓四层就是基于IP+端口的负载均衡 四层负载均衡,是指OSI七层模型中的传输层,传输层已经支持TCP/IP的控制,所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载. 2)七层负载均

  • Python3爬虫里关于Splash负载均衡配置详解

    用Splash做页面抓取时,如果爬取的量非常大,任务非常多,用一个Splash服务来处理的话,未免压力太大了,此时可以考虑搭建一个负载均衡器来把压力分散到各个服务器上.这相当于多台机器多个服务共同参与任务的处理,可以减小单个Splash服务的压力. 1. 配置Splash服务 要搭建Splash负载均衡,首先要有多个Splash服务.假如这里在4台远程主机的8050端口上都开启了Splash服务,它们的服务地址分别为41.159.27.223:8050.41.159.27.221:8050.41

  • CentOS6.5环境安装nginx服务器及负载均衡配置操作详解

    本文实例讲述了CentOS6.5环境安装nginx服务器及负载均衡配置操作.分享给大家供大家参考,具体如下: 1.下载PCRE, 是一个用C语言编写的正则表达式函数库 [root@localhost pcre-8.36]# cd /tmp/download/ [root@localhost download]# wget http://nchc.dl.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz [root@localhost d

  • nginx sticky实现基于cookie负载均衡示例详解

    目录 前言 思考 1.cookie_jsessionid 负载均衡 1.1 后端准备 1.2 hash $cookie_jsessionid;配置 2.nginx sticky 负载均衡 2.1 下载 sticky 2.2 重新编译升级nginx 2.3 upstream 配置 sticky 2.4 修改后端不再创建session 2.5 再次 多次请求 3.sticky 其他用法 总结 前言 sticky 是一个nginx的第三方模块 它不在nginx发行版中 需要额外编译这个模块的, 它的思

  • nginx+keepalived 高可用主从配置详解

    本文介绍了nginx+keepalived 高可用主从配置详解,分享给大家,具体如下: 一.系统环境及软件版本 CentOS 6.6 x64 keepalived-1.2.18.tar.gz nginx-1.6.2.tar.gz 主服务器:192.168.38.64 从服务器:192.168.38.66 VIP :192.168.38.100 二.nginx安装 (主从安装一致) 1.安装依赖环境 复制代码 代码如下: yum install gcc gcc-c++ make automake

  • Linux 系统下安装JDK1.8的教程详解

    一,安装前的清理工作 rpm -qa | grep jdk rpm -qa | grep gcj yum -y remove java-xxx-xxx 二 , 在线下载JDK 命令: wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b1

  • Linux系统(CentOS7安装)安装JDK8的教程详解

    JDK 的安装 系统安装就不做过多介绍,大家从网上寻找安装步骤进行安装,不过我推荐大家进行安装时选择桌面图形化格式进行安装,方便做一部分操作,同时在安装过程中选择英文模式,同时我自己在安装的过程中发现使用Oracle VM VirtualBox这个虚拟机工具比使用VM工具开发更加方便些 使用工具 系统:CentOS7_64位(推荐使用最小配置命令窗口) Jdk:jdk1.8.0_191 虚拟机:Oracle VM VirtualBox 文档编写工具:EditPlus 文件传输工具:FileZil

  • nginx 防盗链防爬虫配置详解

    新建配置配置文件 (例如进入到nginx安装目录下的conf目录,创建: agent_deny.conf) 禁止Scrapy等工具的抓取 if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) { return 403; } 禁止指定UA及UA为空的访问 #forbidden Scrapy if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) { return 403; } #forbidden UA if

  • Nginx+Tomcat的服务器端环境配置详解

    Nginx+tomcat是目前主流的java web架构,如何让nginx+tomcat同时工作呢,也可以说如何使用nginx来反向代理tomcat后端均衡呢?直接安装配置如下: 1.JAVA JDK安装: #下载相应的jdk软件包,然后解压安装,我这里包名称为:jdk-7u25-linux-x64.tar.gz tar -xzf jdk-7u25-linux-x64.tar.gz ;mkdir -p /usr/java/ ;mv jdk1.7.0_25/ /usr/java/ 下. #然后配置

随机推荐