ubuntu22.04安装nginx及动静分离,负载均衡实战
安装依赖
apt-get install gcc libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev make
新建nginx的安装目录,下载安装包
cd /opt
mkdir nginx
cd nginx
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -zvxf nginx-1.24.0.tar.gz
配置、编译安装
cd nginx-1.24.0/
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
--prefix=/usr/local/nginx:指定安装目录为/usr/local/nginx。在编译和安装完成后,软件将被安装到该目录下. --with-http_stub_status_module:启用 HTTP Stub Status 模块。该模块是 Nginx 的一个内置模块,用于获取 Nginx 服务器的状态信息。 --with-http_ssl_module:启用 HTTP SSL 模块。该模块使得 Nginx 支持通过 HTTPS 提供安全的加密传输。
建立软连接
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
创建 systemd 服务文件
sudo vim /etc/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target
[Service]
Type=forking
# Nginx 主程序路径
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PIDFile=/usr/local/nginx/logs/nginx.pid
PrivateTmp=true
[Install]
WantedBy=multi-user.target
刷新systemd配置
sudo systemctl daemon-reload
sudo systemctl enable nginx
sudo systemctl start nginx
文件结构
-
全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
-
events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
-
http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
-
server块:配置虚拟主机的相关参数,一个http中可以有多个server。
-
location块:配置请求的路由,以及各种页面的处理情况。
location / {
root html;
index index.html index.htm;
}
root html 是一个相对路径,相对于 --prefix 指定的安装路径,
root html 等价于 root /usr/local/nginx/html ,
当访问 http://服务器IP/ 时,Nginx 会尝试打开 /usr/local/nginx/html/index.html
index index.html index.htm;
当客户端访问一个目录(例如 /)时,Nginx 会依次查找该目录下的
index.html 或 index.htm 文件,并将第一个找到的文件作为默认首页返回。
例如:访问http://192.168.1.10/时,Nginx 实际会去找 /usr/local/nginx/html/index.html 或 /usr/local/nginx/html/index.htm
负载均衡
三个服务器,安装nginx的服务器作反向代理将请求发送到另外两个服务器中实现负载均衡。
192.168.195.130 nginx
192.168.195.131 apache2
192.168.195.132 apache2
安装apache2的服务器
apt install apache2 -y
在/var/www/html中分别创建一个内容不同的index.html文件来分辨跳转到哪个服务器
vim index.html
修改apache服务的默认端口
vim /etc/apache2/ports.conf
Listen 8081
安装nginx的服务器
编辑配置文件
vim /usr/local/nginx/conf/nginx.conf
在http模块中添加upstream配置:
upstream test {
server 192.168.195.131:8081 weight=2;
server 192.168.195.132:8082 weight=2;
}
在server模块中添加location配置进行反向代理:
location /test {
proxy_pass http://test/; #test和upstream中的test对应
##proxy_pass http://test; 保留原始请求路径(不会删掉 location 匹配部分)
##proxy_pass http://test/; 删除匹配的路径部分,用 / 替换
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
## weight 权重,谁的权重大,跳转到谁的机率就大
访问192.168.195.130/test 实现两个页面的跳转
nginx负载均衡策略
1.轮询(默认策略) Nginx 按照顺序依次将请求分发到后端服务器,每个服务器轮流处理请求。例如,第一个请求发送到 192.168.1.100:8080,第二个请求发送到 192.168.1.101:8080,以此类推
upstream backend_servers {
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
2.加权轮询
为每个后端服务器分配一个权重,权重越高的服务器处理的请求越多。在系统中,如果某台服务器的性能较好,可以为其分配较高的权重。
upstream backend_servers {
server 192.168.1.100:8080 weight=2;
server 192.168.1.101:8080 weight=1;
}
3.IP哈希
根据客户端的 IP 地址进行哈希计算,将相同 IP 地址的请求总是发送到同一台后端服务器。这种策略适用于需要保持会话状态的场景,如系统中的用户登录状态。
upstream backend_servers {
ip_hash;
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
4.最少连接数
将请求发送到当前连接数最少的后端服务器,以确保各服务器的负载相对均衡。
upstream backend_servers {
least_conn;
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
添加不同后缀实现不同页面的跳转
在ngixn服务器进行配置
在http模块中添加upstream配置:
upstream o {
server 192.168.195.131:8081;
}
upstream sjz {
server 192.168.195.132:8082;
}
在server模块中添加location配置:
location /o {
proxy_pass http://o/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /sjz {
proxy_pass http://sjz/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
访问http://192.168.195.130/o 和http://192.168.195.130/sjz 进行测试
热备
一台主服务器负责处理请求,一台或多台备用服务器随时待命。当主服务器宕机时自动将请求切换到备用服务器,主服务器恢复时备用服务器不再接收请求,主服务器重新接管。
upstream test {
server 192.168.195.131:8081; # 主服务器
server 192.168.195.132:8082 backup; # 备用服务器
}
动静分离
一台服务器安装nginx,一台服务器安装apache2
192.168.195.130 nginx
192.168.195.131 apache2
192.168.195.131
#安装apache,mariadb,php
apt install apache2 mariadb-common php php-mysql
systemctl enable mariadb
systemctl start mariadb
mysql_secure_installation ##给数据库设置密码,进行数据库配置
Enter current password for root (enter for none): ##回车
Set root password? [Y/n] y ##输入y,回车
New password: ##输入密码:123456
Re-enter new password: ##输入密码:123456
#安装php插件
apt install -y php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap curl php-bcmath
#编辑php网页内容文件
vim /var/www/html/index.php
<?php
// 数据库连接配置
$servername = "localhost";
$username = "root";
$password = "123456";
$dbname = "mysql";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("<h2 style='color:red;'>连接失败: " . $conn->connect_error . "</h2>");
} else {
echo "<h2 style='color:green;'>✅ 数据库连接成功!</h2>";
}
$sql = "SELECT VERSION() AS version";
$result = $conn->query($sql);
if ($result && $row = $result->fetch_assoc()) {
echo "<p><b>MariaDB 版本:</b> " . $row["version"] . "</p>";
}
$conn->close();
?>
<hr>
<p><b>服务器时间:</b> <span id="time"></span></p>
<script>
function updateTime() {
const now = new Date();
document.getElementById("time").innerText =
now.getFullYear() + "-" +
String(now.getMonth() + 1).padStart(2, '0') + "-" +
String(now.getDate()).padStart(2, '0') + " " +
String(now.getHours()).padStart(2, '0') + ":" +
String(now.getMinutes()).padStart(2, '0') + ":" +
String(now.getSeconds()).padStart(2, '0');
}
// 初次执行一次
updateTime();
// 每秒更新一次
setInterval(updateTime, 1000);
</script>
#重启服务
systemctl restart apache2
systemctl restart mariadb
#验证
http://192.168.195.131:8081/index.php
192.168.195.130
#修改nginx的配置文件
vim /usr/local/nginx/conf/nginx.conf
location ~ \.php$ { ##开启该模块
proxy_pass http://192.168.195.131:8081; ##修改ip地址
}
nginx -s reload #重载nginx
#验证
http://192.168.195.130/index.php
http://192.168.195.130/index.html
php是动态请求, html是静态请求。如果是静态请求,Nginx直接进行处理,若是动态请求,nginx自动将动态请求转发给Apache处理。
虚拟主机配置
基于域名的虚拟主机
两个域名指向同一个 nginx 服务器,用户访问不同的域名时显示不同的内容。
#创建html目录
mkdir /usr/local/nginx/ceshi1
mkdir /usr/local/nginx/ceshi2
#分别在两个目录中创建不同的index.html文件用于区分
echo "welcome to test1" >> ceshi1/index.html
echo "welcome to test2" >> ceshi2/index.html
#编辑nginx的配置文件,添加下列两个server模块
server {
listen 80;
server_name ceshi1.com; ##设置监听域名
location / {
root ceshi1; ##设置默认访问目录
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name ceshi2.com;
location / {
root ceshi2;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#检查语法并重载
nginx -t
nginx -s reload
#验证
##linux验证
curl ceshi1.com
curl ceshi2.com
##window验证
###修改C:\Windows\System32\drivers\etc\hosts文件
192.168.195.130 ceshi1.com
192.168.195.130 ceshi2.com
修改后在浏览器输入配置的网址
http://ceshi1.com/
http://ceshi2.com/
基于ip的虚拟主机
由于基于域名的虚拟主机实验中已创建目录,这里不再创建新的目录。
#创建一个虚拟ip
ifconfig ens33:1 192.168.195.135 netmask 255.255.255.0 up
#修改nginx配置
server {
listen 80;
server_name 192.168.195.130; ##设置监听ip
location / {
root ceshi1; ##设置默认访问目录
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name 192.168.195.135; ##设置监听ip
location / {
root ceshi2; ##设置默认访问目录
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#重载
nginx -s reload
#验证
在浏览器上分别输入:
http://192.168.195.130/
http://192.168.195.135/
出现不同返回则成功
基于端口的虚拟主机
由于基于域名的虚拟主机实验中已创建目录,这里不再创建新的目录。
#修改nginx配置
server {
listen 8001; ##修改监听端口
server_name 192.168.195.130;
location / {
root ceshi1;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 8002; ##修改监听端口
server_name 192.168.195.130;
location / {
root ceshi2;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#重载
nginx -s reload
#验证
浏览器输入不同端口查看返回值
http://192.168.195.130:8001/
http://192.168.195.130:8002/
更多推荐




所有评论(0)