安装依赖

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/

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐