- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Linux 系统 nginx 服务器安装及负载均衡配置详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
nginx(engine x) 是一个 高性能 的 HTTP 和 反向代理 服务器、邮件代理服务器以及通用的 TCP/UDP 代理服务器。其特点为轻量级(占用系统资源少)、稳定性好、可扩展性(模块化结构)、并发能力强、配置简单等.
本文主要介绍在测试环境中通过 nginx 实现基本的 负载均衡 功能.
nginx 可以提供 HTTP 服务,包括处理静态文件,支持 SSL 和 TLS SNI、GZIP 网页压缩、虚拟主机、URL 重写等功能,可以搭配 FastCGI、uwsgi 等程序处理动态请求.
此外,nginx 还可以用于代理、反向代理、负载均衡、缓存等服务器功能,在集群环境中改善网络负载、提高可用性.
1、搭建测试环境 。
这里的测试环境为通过VirtualBox 安装的两台Lubuntu 19.04 虚拟机,Linux 系统安装方法不作赘述.
为了保证两台 Linux 虚拟机之间的相互访问,虚拟机的网络配置除了默认的 NAT 方式外,还使用了 VirtualBox 软件提供的内部网络(Internal) 联网方式.
此外,还需要将两台虚拟机中与“内部网络”相关联的网卡,绑定上 同一网段 的静态 IP 地址,则两台主机形成局域网络,相互之间可以直接访问.
网络配置 。
打开 VirtualBox 软件,分别进入两台虚拟机的设置界面,为其添加 连接方式为内部网络 的网络连接,截图如下(两台虚拟机作同样的配置):
内部网络 。
登录进虚拟机系统,使用 ip addr 命令查看当前的网络连接信息:
1
2
3
4
5
6
7
8
9
10
11
12
|
$ 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 配置文件,示例如下:
1
2
3
4
5
6
7
8
9
10
11
|
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 即可生效.
1
2
3
4
5
6
7
8
|
$ 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。两台主机可相互访问。测试如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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
|
2、安装 nginx 服务器 。
nginx 的安装方式主要有两种:
本示例并没有特殊的需求,所以直接选择第一种安装方式。命令如下:
1
2
|
$
sudo
apt-get update
$
sudo
apt-get
install
nginx
|
安装成功后,通过 systemctl status nginx 命令查看 nginx 服务的运行状态:
1
2
3
4
5
6
7
8
9
10
11
|
$ 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 服务器是否可以正常访问:
1
2
3
4
|
$ curl -I 127.0.0.1
HTTP
/1
.1 200 OK
Server: nginx
/1
.15.9 (Ubuntu)
...
|
3、负载均衡配置 。
负载均衡(load-balancing)即按照一定的规则将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度.
简单的示例图如下:
load-balancing 。
如某网站应用部署在多台主机构成的服务器集群上,负载均衡服务器位于终端用户和服务器集群之间,负责接收终端用户的访问流量,并根据一定的规则将用户访问 分发 给后端的服务器主机,从而提高在高并发状态下的响应速度.
负载均衡服务器 。
nginx 可以通过 upstream 选项配置负载均衡。这里使用虚拟机 server1 作为负载均衡服务器.
修改 serve1 上默认站点的配置文件( sudo vim /etc/nginx/sites-available/default ),改为如下内容:
1
2
3
4
5
6
7
8
9
10
11
|
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 ),改为如下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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 页面,内容如下:
1
2
3
4
5
6
7
8
|
<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 页面:
1
2
3
4
5
6
7
8
9
|
$ 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 配置文件,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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 页面,内容如下:
1
2
3
4
5
6
7
8
|
<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 页面:
1
2
3
4
5
6
7
8
9
|
$ 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 ,效果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
$ 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 站点的 轮询 ,起到负载均衡的作用.
4、负载均衡方法 。
nginx 开源版本提供四种负载均衡的实现方式,简单介绍如下.
1. Round Robin 。
用户请求 均匀 地分配给后端服务器集群(可以通过 weight 选项设置轮询的 权重 ),这是 nginx 默认使用的负载均衡方式:
1
2
3
4
|
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com;
}
|
2. Least Connections 。
用户请求会优先转发给集群中当前活跃连接数最少的服务器。同样支持 weight 选项.
1
2
3
4
5
|
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
}
|
3. IP Hash 。
用户请求会根据 客户端 IP 地址 进行转发。即该方式意图保证某个特定的客户端最终会访问 同一个 服务器主机.
1
2
3
4
5
|
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
|
4. Generic Hash 。
用户请求会根据一个 自定义键值 确定最终转发的目的地,该键值可以是字符串、变量或者组合(如源 IP 和端口号).
1
2
3
4
5
|
upstream backend {
hash
$request_uri consistent;
server backend1.example.com;
server backend2.example.com;
}
|
权重 。
参考下面的示例配置:
1
2
3
4
5
|
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 服务器安装及负载均衡配置详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢! 。
原文链接:https://www.jianshu.com/p/f1b62050dc5e 。
最后此篇关于Linux 系统 nginx 服务器安装及负载均衡配置详解的文章就讲到这里了,如果你想了解更多关于Linux 系统 nginx 服务器安装及负载均衡配置详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我只是不喜欢 Logback 的 XML 或 Groovy 配置,而更喜欢用 Java 进行配置(这也是因为我将在初始化后的不同时间在运行时更改配置)。 似乎对 Logback 进行 Java 配置的
我的 sphinx 配置是: ================================ config/sphinx.yml development: bin_path: "/usr/loc
我们计划在生产服务器中部署我们的系统。我有兴趣了解更多有关优化网站性能的信息。 Sitecore 有哪些优化建议? (缓存,网络配置中的其他设置) 我们可以在 IIS 中做哪些优化? 找不到关于这些主
我有一个 Django 应用程序,可以处理网站的两个(或更多)部分,例如网站的“admin”和“api”部分。我还为网站的其余部分提供了普通的 html 页面,其中不需要 Django。 例如,我希望
我刚刚开始研究Docker。我有一个 Node 应用程序,可以调整大小和图像,然后在完成后向 aws 发送 SQS 消息。我已成功创建应用程序的 docker 镜像,并从本地计算机复制它,但遇到了无法
如何配置 checkstyle(在 Ant nt Maven 中)任务?我尝试了一点,但没有正确收到报告。这是我的 Ant 脚本。
我正在使用 Quartz 和 Spring 框架重写一个遗留项目。原始配置是 XML 格式,现在我将其转换为 Java Config。 xml 配置使用 jobDetail 设置触发器 bean 的作
tl;rd: 使用主键对数据库进行分区 索引大小问题。 数据库大小每天增长约 1-3 GB 突袭设置。 您有使用 Hypertable 的经验吗? 长版: 我刚刚建立/购买了一个家庭服务器: 至强 E
在安装 gcp 应用程序后,我们尝试使用 GCP 的图形 api 配置 Azure Active Directory saml 配置。我们正在遵循相同的 AWS graph api saml 设置 U
我刚刚了解了 spring security 并想使用 java hibernate 配置连接到数据库,但我发现的示例或教程很少。我通过使用 xml 配置找到了更多。我在这里使用 Spring 4.0
我们最近切换到 Java 8 以使用 java.time API(LocalDate、LocalDateTime,...)。因此,我们将 Hibernate 依赖项更新到版本 4.3.10。我们编写了
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《quarkus实战》系列的第六篇,咱
我是 NGINX 的新手,我正在尝试对我们的 ERP 网络服务器进行负载平衡。我有 3 个网络服务器在由 websphere 提供支持的端口 80 上运行,这对我来说是一个黑盒子: * web01.e
我们想使用 gerrit 进行代码审查,但我们在 webview 中缺少一些设置。 是否可以禁止提交者审查/验证他们自己的 提交? 是否有可能两个审稿人给 +1 一个累积它 到+2,以便可以提交? 谢
配置根据运行模式应用于 AEM 实例。在多个运行模式和多个配置的情况下,AEM 如何确定要选择的配置文件?假设以下配置在 AEM 项目中可用, /apps /myproject - con
我正在使用 Neo4j 服务器。我遇到了负载相对较低的问题。但是,响应时间相当长。我认为为请求提供服务的线程数太少了。有没有办法调整为 HTTP 请求提供服务的线程池的大小。那可能吗? 最佳答案 线程
我在/etc/default/celeryd 中有以下配置 CELERYD_NODES = "worker1 worker2 worker3" CELERYD_CHDIR = "path to pro
Plone 在其页面中显示来 self 的母语(巴西葡萄牙语)的特殊字符。但是,当我使用我创建的 spt 页面时,它会显示转义序列,例如: Educa\xc3\xa7\xc3\xa3o 代替 Educ
我正在尝试开始使用 Emacs/Clojure。安装 emacs 扩展的正确方法是什么。我正在尝试安装以下插件: https://bitbucket.org/kotarak/vimclojure 我已
我有一个简单的 C 项目结构: proj/ src/ docs/ build/ tests/ lib/ 尝试编写合适的 CMake 文件。 到目前为止我的尝试:http://pas
我是一名优秀的程序员,十分优秀!