一、项目描述
负责搭建基于Linux的Web服务环境,集成监控与自动化运维,实现系统稳定运行与快速部署。
二、技术栈
Linux、Nginx、MySQL、Prometheus、Grafana、Ansible
三、职责
部署Nginx Web服务并配置访问
搭建MySQL数据库服务
使用Prometheus + Grafana实现系统监控
使用Ansible实现批量自动化部署
配置防火墙与SELinux保障系统安全
四、搭建项目的具体过程
(一)nginx
(1)安装nginx
root@Server \~# yum install -y nginx
(2)实现nginx服务开机自启及开启服务
root@Server \~# systemctl enable --now nginx.service

(3)写一个网页
root@Server \~# echo "this is my first project" > /usr/share/nginx/html/index.html
(4)访问网页
发现无法访问
本地可以访问

(5)排查错误
1.检查nginx监听端口
root@Server \~# netstat -tunlp | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5993/nginx: master
tcp6 0 0 :::80 :::* LISTEN 5993/nginx: master
这一步没有问题,nginx是被所有的ip(0.0.0.0)地址所监听。
##如果不是被所有的ip监听,可在/etc/nginx下找到配置文件并进行修改
2.查看防火墙配置
root@Server \~# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
发现问题,发现防火墙并没有放行nginx,http服务。
3.防火墙放行http,https服务。
root@Server \~# firewall-cmd --permanent --add-service=http
success
root@Server \~# firewall-cmd --permanent --add-service=https
success
root@Server \~# firewall-cmd --reload
Success
4.查看一下nginx的日志
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log ##这个是错误的日志
5.放行防火墙
root@Server \~# firewall-cmd --permanent --add-service=http
success
root@Server \~# firewall-cmd --permanent --add-service=https
success
root@Server \~# firewall-cmd --reload
success
6.再次访问网页
成功访问

(二)MySQL
(1)安装mysql以及mysql-server服务
root@Server \~# yum install -y mysql
root@Server \~# yum install -y mysql-server.x86_64
(2)启动mysqld并实现开机自启
root@Server \~# systemctl enable --now mysqld.service

(3)进入到mysql里面
root@Server \~#mysql -uroot -p
##我们没有设置密码直接进来的,到需要输入密码的时候直接回车即可
(4)设置root用户密码
mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
(5)创建数据库并查看
mysql> create database opsdb;
mysql> show databases ;

(6)创建普通用户并授予权限
mysql> create user 'opsdb'@'%' identified by '12345';
mysql>grant all privileges on opsdb.* to 'opsdb'@'%';
mysql> flush privileges; ##刷新权限

(7)创建一张表并插入数据并且查询
mysql>use opsdb;
mysql>CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
role VARCHAR(50)
);
mysql>INSERT INTO users (name, role) VALUES ('admin', 'ops');
mysql>INSERT INTO users (name, role) VALUES ('dev', 'developer');
mysql>SELECT * FROM users;

(8)连接navicat

无法连接
1.查看root用户权限。
mysql>SELECT user, host FROM mysql.user;
2.必须要实现:root %
mysql>CREATE USER 'root'@'%' IDENTIFIED BY '123456';
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES;
3.修改mysql监听的地址
root@Server \~# vim /etc/my.cnf
修改为 bind-address=0.0.0.0
root@Server \~#systemctl restart mysqld.server
4.开放防火墙端口
root@Server \~#firewall-cmd --add-server=mysql --permanent
root@Server \~#firewall-cmd --reload
5.测试端口是否开发
root@Server \~# ss -tlnp | grep mysql
LISTEN 0 151 *:3306 *:* users:(("mysqld",pid=7975,fd=23))
LISTEN 0 70 *:33060 *:* users:(("mysqld",pid=7975,fd=21))
6.测试连接
连接成功
(三)应用层PHP
(1)安装PHP及相关的依赖
root@Server \~# yum install php php-fpm php-mysqlnd -y
(2)启动php-fpm服务
root@Server \~# systemctl enable --now php-fpm

(四)让nginx支持php
(1)修改nginx配置文件
root@Server \~#vim /etc/nginx/nginx.conf
(2)在server{}里添加内容
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
root@Server \~#systemctl restart nginx.service
(3)输入内容到info.php文件中
root@Server \~#echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/info.php
(4)在浏览器查看是否配置成功

(五)使用网页访问到mysql数据
(1)确保opsdb表中有数据

(2)创建PHP页面
root@Server \~# vim /usr/share/nginx/html/users.php
root@Server \~# cat /usr/share/nginx/html/users.php
<?php
$conn = new mysqli("127.0.0.1", "opsdb", "12345", "opsdb");
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
$sql = "SELECT * FROM users";
$result = $conn->query($sql);
echo "<h2>User List</h2>";
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"]. " - Name: " . $row["name"]. " - Role: " . $row["role"]. "<br>";
}
} else {
echo "没有数据";
}
$conn->close();
?>
(3)输入http://你的ip/users.php
发现问题
1.如果出现"连接失败: Permission denied"
这是因为selinux阻挡了
解决方法:
1.直接关闭selinux。
- 容许php连接mysql setsebool -P httpd_can_network_connect_db 1
(六)收集nginx日志
我们使用tail -f /var/log/nginx/access.log。会看见以下内容
192.168.41.1 - - 04/May/2026:20:54:54 +0800 "GET /users.php HTTP/1.1" 200 105
(1)基础日志分析
1.统计访问最多的IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
root@Server \~# awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
24 192.168.41.1
1 ::1
2.统计访问最多的页面
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
root@Server \~# awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
17 /users.php
2 /favicon.ico
2 /
1 /user.php
1 /poweredby.png
1 /nginx-logo.png
1 /info.php
3.统计状态码
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c
root@Server \~# awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c
22 200
3 404
200多 → 正常
404多 → 有问题
500多 → 严重问题
(2)错误日志分析
tail -f /var/log/nginx/error.log
常见错误:
permission denied(权限问题)
connect failed(后端问题)
(3)写一个分析脚本
root@Server \~# cat /root/nginx_log_analysis.sh
#!/bin/bash
echo "=== Top IP ==="
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
echo "=== Top URL ==="
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
echo "=== Status Code ==="
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c
root@Server \~# chmod a+x /root/nginx_log_analysis.sh
root@Server \~# ./nginx_log_analysis.sh
=== Top IP ===
24 192.168.41.1
1 ::1
=== Top URL ===
17 /users.php
2 /favicon.ico
2 /
1 /user.php
1 /poweredby.png
1 /nginx-logo.png
1 /info.php
=== Status Code ===
22 200
3 404
(七)Ansible自动化部署nginx
(1)设置免密登录等前提条件以提前做好。
(2) 编写playbook
vim /etc/ansible/nginx.yml
- name: install nginx
hosts: nginx
become: yes
tasks:
- name: install nginx
dnf:
name: nginx
state: present
- name: start nginx
service:
name: nginx
state: started
enabled: yes


(3)修改网页内容
- name: deploy index
copy:
content: "Hello from Ansible"
dest: /usr/share/nginx/html/index.html
再次执行playbook
(八)自动化部署php
(1)编写playbook
vim/etc/ansible/php.yml
- name: install php
hosts: nginx
become: yes
tasks:
- name: install php packages
yum:
name: "{{ item }}"
state: present
loop:
- php
- php-fpm
- php-mysqlnd
- name: start php-fpm
service:
name: php-fpm
state: started
enabled: yes

(九)Prometheus+Grafana

