#5:Nginx核心使用技术
在CentOS7环境下高效部署和深度定制Nginx服务从未如此简单!本指南将带您从零开始完成Nginx的基础安装与系统服务集成,更通过Docker快速搭建多节点负载均衡集群实战环境。您将掌握如何利用环境变量和自动化脚本提升运维效率,学习基于请求头的智能版本路由配置技巧,并深入理解防盗链机制的工作原理——配套清晰的操作流程图和即用型配置模板,让您轻松应对生产环境中的各类流量管理需求。无论是初次接触Nginx的新手还是需要优化现有架构的开发者,都能在这套覆盖基础到高阶的全套解决方案中找到关键突破点。
一、入门
1.基本安装
服务器为CentOS7,如有变化还需自行替换依赖安装命令
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
wget https://nginx.org/download/nginx-1.26.1.tar.gz
tar -zxvf nginx-1.26.1.tar.gz
cd nginx-1.26.1
./configure --prefix=/usr/local/nginx
make && sudo make install
确认是否安装成功
ps -ef | grep nginx
2.注册到系统配置
cd /etc/systemd/system
vim nginx.service
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
3.基本使用
新建一个html文件
cp /usr/local/nginx/html/index.html /usr/local/nginx/html/hello.html \
&& sed -i 's/Welcome to nginx!/Hello World!/g' /usr/local/nginx/html/hello.html
修改conf目录下的配置文件
如果出现端口占用:
netstat -tulnp | grep :80
kill -9 /PID
此时访问88端口就是新的页面
二、负载均衡
1.集群准备
有条件可以使用多台主机去实现,这里我给出通过docker去模拟的情况
docker run --rm --name tmp-nginx nginx:1.26.1
docker cp tmp-nginx:/etc/nginx/. /usr/local/nginx_cluster/nginx1/
docker-compose.yml内容:
version: '3.8'services:nginx1:image: nginx:1.26.1container_name: nginx1ports:- "8081:80" # 宿主机8081端口映射到容器80端口volumes:- /usr/local/nginx_cluster/nginx1:/etc/nginx # 挂载整个Nginx配置目录- /usr/local/nginx_cluster/nginx1/logs:/var/log/nginx # 挂载日志目录- /usr/local/nginx_cluster/nginx1/html:/usr/share/nginx/htmlrestart: unless-stoppednetworks:- nginx-networknginx2:image: nginx:1.26.1container_name: nginx2ports:- "8082:80" # 宿主机8082端口映射到容器80端口volumes:- /usr/local/nginx_cluster/nginx2:/etc/nginx- /usr/local/nginx_cluster/nginx2/logs:/var/log/nginx- /usr/local/nginx_cluster/nginx2/html:/usr/share/nginx/htmlrestart: unless-stoppednetworks:- nginx-networknginx3:image: nginx:1.26.1container_name: nginx3ports:- "8083:80" # 宿主机8083端口映射到容器80端口volumes:- /usr/local/nginx_cluster/nginx3:/etc/nginx- /usr/local/nginx_cluster/nginx3/logs:/var/log/nginx- /usr/local/nginx_cluster/nginx3/html:/usr/share/nginx/htmlrestart: unless-stoppednetworks:- nginx-networknetworks:nginx-network:driver: bridge
分别给每个nginx配置不同的页面
echo "<h1>Welcome to Nginx1 on port 8081</h1>" > /usr/local/nginx_cluster/nginx1/html/index.html
2.配置设置
修改完conf文件后,要检查文件是否正确
/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
或者
cd /usr/local/nginx/sbin
./nginx -t
重启nginx
systemctl restart nginx
三、自定义命令(扩展)
很多时候需要先找到conf文件目录或者输入systemctl等繁杂的重复操作去更新nginx,所以可以指定环境变量或给命令起个别名
1.环境变量
cd /etc/profile.d
vim nginx.sh
export NGINX_HOME=/usr/local/nginx
export PATH=$PATH:$NGINX_HOME/sbin
chmod +x /etc/profile.d/nginx.sh
source /etc/profile
echo $PATH | grep nginx
2.别名定义
alias ns="/usr/local/nginx/sbin/nginx -t"
查看所有别名
alias
3.脚本定义
vim /usr/local/bin/n
在脚本文件里面填入命令
chmod +x /usr/local/bin/n
以后就可以在任意目录输入一个n即可执行更新nginx,大大提高开发效率
四、版本路由
通过定义路由映射,实现依据自定义的标识将请求路由到对应的服务,这里小编通过请求头的version来实现,读者可以自行实现
1.定义映射
2.路由转发
3.location的匹配优先级
4.防盗链
基本语法:
valid_referers none | blocked | server_names | string ...;
工作流程图解:
A[浏览器发起资源请求<br>GET /images/photo.jpg] --> B{Nginx服务器接收请求};
B --> C{检查请求头中是否存在Referer};
C -- 否 (Referer missing) --> D{valid_referers是否包含`none`?};
D -- 是 --> G[设置 $invalid_referer = ""];
D -- 否 --> H[设置 $invalid_referer = 1];
C -- 是 (Referer exists) --> E{Referer的值是否以 http:// 或 https:// 开头?};
E -- 否 --> F{valid_referers是否包含`blocked`?};
F -- 是 --> G;
F -- 否 --> H;
E -- 是 --> I{Referer的值是否在<br>valid_referers白名单中?};
I -- 是 --> G;
I -- 否 --> H;
G --> J{执行 if ($invalid_referer) 判断};
J -- $invalid_referer为空 --> K[正常返回资源<br>photo.jpg (HTTP 200)];
H --> J;
J -- $invalid_referer为1 --> L[执行if块内的操作<br>如返回403或警告图片];