搭建一个 Web + 数据库系统(Nginx+PHP+MySQL)

一、项目描述

负责搭建基于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)在浏览器查看是否配置成功

http://你的IP/info.php

(五)使用网页访问到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。

  1. 容许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

相关推荐
战族狼魂14 小时前
Powabase 新手快速入门与实战指南
数据库
whn197714 小时前
达梦数据文件的移动或改名
数据库
cfm_291414 小时前
了解Redis
数据库·redis·缓存
tang74516396214 小时前
MariaDB的mysql安装
数据库·mysql·mariadb
liuzhilongDBA14 小时前
当 PostgreSQL 成为 AI 的双手——Bruce Momjian 的 MCP Server 实战
数据库·人工智能·postgresql
AC赳赳老秦14 小时前
OpenClaw多Agent分工协作:按工作模块拆分Agent,实现全流程自动化闭环
java·大数据·数据库·python·自动化·php·openclaw
cyw899814 小时前
m3e向量化mysql某表
android·数据库·mysql
我是一颗柠檬14 小时前
【MySQL全面教学】MySQL视图与触发器Day12(2026年)
数据库·后端·mysql
山峰哥14 小时前
索引策略与SQL优化:从Explain对比到生产调优的完整方法论
android·java·数据库·sql·性能优化·深度优先