PHP进阶-CentOS7部署LNMP服务架构的项目

news2024/11/13 7:54:24

在开发和部署Web应用时,LNMP(Linux、Nginx、MySQL、PHP)的组合是非常常见的。这篇博客将介绍如何通过一个简单的脚本,在CentOS 7上部署LNMP,并将PHP项目自动部署到服务器上。这不仅可以节省大量的时间,还能确保环境配置的一致性。这个一键部署的脚本不仅简化了部署过程,还能确保配置的正确性和一致性。使用这样的部署方法,可以极大地节省时间和精力,特别是对于频繁需要部署新环境的开发团队而言,效率提升显著。


一、架构简述

1. LNMP简介

LNMP是一种流行的Web服务架构,其中:

  • Linux是操作系统,用于托管Web服务器。
  • Nginx是一款高性能的HTTP和反向代理服务器,用于处理HTTP请求。
  • MySQL是一个关系型数据库管理系统,用于存储和管理应用数据。
  • PHP是一种服务器端脚本语言,用于生成动态Web内容。

2. 常见的PHP项目部署结构

在实际项目中,PHP项目通常会与nginx和MySQL搭配使用,形成一个完整的Web应用架构。以下是一些常见的部署结构:

  • LAMP(Linux、Apache、MySQL、PHP):使用Apache作为Web服务器,适合需要.htaccess支持的项目。
  • LNMP(Linux、Nginx、MySQL、PHP):使用Nginx作为Web服务器,适合高并发和静态文件较多的项目。
  • LEMP(Linux、Nginx、MariaDB、PHP):使用MariaDB替代MySQL,适合需要更高性能和更多功能的数据库需求。

以下是这些结构的比较:

架构Web服务器数据库适用场景
LAMPApacheMySQL需要.htaccess支持的项目
LNMPNginxMySQL高并发和静态文件较多的项目
LEMPNginxMariaDB需要更高性能和更多功能的项目

二、部署步骤

1. 移除现有的项目

首先,我们需要清理现有的项目目录,删除/var/www/html目录下的所有文件。这通常是Web项目的默认目录,清理这个目录可以避免旧项目文件的干扰。

sudo rm -rf /var/www/html

2. 安装并配置Nginx和PHP-FPM

安装Nginx和PHP-FPM。这两个软件是运行PHP应用的核心组件。

安装Nginx:Nginx是一款高性能的HTTP和反向代理服务器。我们将使用yum包管理器来安装Nginx。

yum install -y nginx

安装EPEL和yum-utils:EPEL(Extra Packages for Enterprise Linux)提供了高质量的附加软件包,yum-utils包含了yum-config-manager等实用工具。

yum install -y epel-release yum-utils

安装Remi仓库和PHP:Remi仓库提供最新版本的PHP。启用remi-php74仓库并安装PHP 7.4及其常用模块,如php-fpm、php-mysql、php-gd等。

yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum-config-manager --enable remi-php74
yum install -y php php-common php-cli php-fpm php-mysql php-gd php-xml php-mbstring php-json php-soap php-xmlrpc

配置PHP-FPM:修改PHP-FPM的配置文件,使其监听127.0.0.1的9000端口,这样Nginx可以通过这个端口与PHP-FPM通信。

sudo sed -i 's#listen = /run/php-fpm/www.sock#listen = 127.0.0.1:9000#' /etc/php-fpm.d/www.conf

启动并设置Nginx和PHP-FPM为开机自启:确保Nginx和PHP-FPM在服务器重启后自动启动。

systemctl start nginx
systemctl enable nginx
systemctl start php-fpm
systemctl enable php-fpm

3. 克隆PHP项目代码

这里使用到的也是我创作的开源项目,感兴趣的朋友可以去GItee上查看,CSDN资源也已上传,欢迎下载。
项目地址:https://gitee.com/damon_liu_code/WeeklyReport

在这里插入图片描述

下面,我们来发布这个项目到我们自己的服务器上。

安装git:git是一个分布式版本控制系统,我们将使用git从代码库克隆PHP项目。

sudo yum install -y git

创建项目目录并克隆代码:在/var/www/html目录下创建项目目录,并使用git克隆项目代码。

mkdir -p /var/www/html
sudo git clone https://gitee.com/damon_liu_code/WeeklyReport.git /var/www/html

设置权限:确保Nginx用户对项目目录有正确的权限。

chown -R nginx:nginx /var/www/html/WeeklyReport
chmod -R 755 /var/www/html/WeeklyReport

4. 创建Nginx配置文件

创建并编辑Nginx配置文件:配置Nginx处理PHP请求。设置根目录、索引文件、PHP文件处理方式等。

cat > /etc/nginx/nginx.conf << EOF
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" \$status \$body_bytes_sent "\$http_referer" "\$http_user_agent" "\$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        index index.php index.html index.htm;
        root         /var/www/html/WeeklyReport/public;

        location ~ \.php\$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
            include fastcgi_params;
        }

        location / {
            if (!-e \$request_filename){
                rewrite  ^(.*)\$  /index.php?s=\$1  last;
                break;
            }
        }

        location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md) {
            return 404;
        }

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)\$ {
            expires      30d;
            error_log /dev/null;
            access_log /dev/null;
        }

        location ~ .*\.(js|css)?\$ {
            expires      12h;
            error_log /dev/null;
            access_log /dev/null;
        }
    }
}
EOF

5. 安装并配置MySQL

导入MySQL GPG密钥和安装MySQL仓库:确保系统信任MySQL的安装包,并从官方仓库安装MySQL。

sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
sudo yum install -y https://repo.mysql.com/mysql57-community-release-el7.rpm

安装MySQL:使用yum包管理器安装MySQL社区服务器。

sudo yum install -y mysql-community-server

启动并设置MySQL为开机自启:确保MySQL在服务器重启后自动启动。

sudo systemctl start mysqld
sudo systemctl enable mysqld

获取MySQL初始临时密码:MySQL安装后会生成一个初始临时密码,我们需要获取这个密码以便进行后续配置。

TEMP_PASS=$(sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')

修改root用户密码:使用初始密码登录MySQL并修改root用户的密码,设置为简单易记的密码(如:root)。

mysql -u root -p"$TEMP_PASS" --connect-expired-password <<EOF
SET GLOBAL validate_password_policy=LOW;
SET GLOBAL validate_password_length=4;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
EOF

6. 导入SQL文件到数据库

创建数据库:在MySQL中创建项目所需的数据库。

mysql -u root -proot <<EOF
CREATE DATABASE IF NOT EXISTS weekly_report CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EOF

导入SQL文件:将项目的SQL文件导入到新创建的数据库中,完成数据库初始化。

mysql -u root -proot weekly_report < /var/www/html/WeeklyReport/weekly_report.sql

7. 重启Nginx服务

重启Nginx服务,使新配置生效,并确保Nginx可以正确处理和转发请求。

systemctl restart nginx

8. 配置防火墙

开放80端口:为了确保外部能够访问到我们的Nginx服务,需要开放80端口。使用firewall-cmd来配置防火墙,允许HTTP访问。

firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

9. 获取服务器公网IP地址

使用curl命令获取服务器的公网IP地址,并打印出来,方便通过该IP直接访问部署好的PHP项目。

IP=$(curl ifconfig.me)
echo "你的服务器公网IP地址是: $IP"

我们测试访问:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

项目部署成功!


三、部署总结

1. 步骤总结

部署过程中涉及到的每个步骤都有其特定的作用:

  • 清理现有的项目和软件,确保新部署不受旧环境的影响。
  • 安装和配置Nginx、PHP和MySQL,建立起Web服务器和数据库的基础环境。
  • 克隆项目代码并设置权限,使得Web服务器可以访问和执行项目代码。
  • 创建Nginx配置文件,定义Web服务器的行为,包括请求处理和静态资源缓存。
  • 初始化和配置MySQL数据库,导入项目所需的数据库结构和初始数据。
  • 配置防火墙,确保服务器对外部HTTP请求的访问。

2. 教程源码

下面是全部代码(可以直接一键部署):

#!/bin/bash

# 移除现有的项目
sudo rm -rf /var/www/html

# 移除现有的Apache
yum remove httpd -y

# 安装Nginx和PHP-FPM
yum install -y nginx
yum install -y epel-release yum-utils
yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum-config-manager --enable remi-php74
yum install -y php php-common php-cli php-fpm php-mysql php-gd php-xml php-mbstring php-json php-soap php-xmlrpc
sudo sed -i 's#listen = /run/php-fpm/www.sock#listen = 127.0.0.1:9000#' /etc/php-fpm.d/www.conf

# 启动并启用Nginx和PHP-FPM
systemctl start nginx
systemctl enable nginx
systemctl start php-fpm
systemctl enable php-fpm

# 创建PHP项目的目录并克隆代码库
sudo yum install -y git
mkdir -p /var/www/html
sudo git clone https://gitee.com/damon_liu_code/WeeklyReport.git /var/www/html
chown -R nginx:nginx /var/www/html/WeeklyReport
chmod -R 755 /var/www/html/WeeklyReport

# 创建Nginx配置文件
cat > /etc/nginx/nginx.conf << EOF
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" \$status \$body_bytes_sent "\$http_referer" "\$http_user_agent" "\$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        index index.php index.html index.htm;
        root         /var/www/html/WeeklyReport/public;

        location ~ \.php\$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
            include fastcgi_params;
        }

        location / {
            if (!-e \$request_filename){
                rewrite  ^(.*)\$  /index.php?s=\$1  last;
                break;
            }
        }

        location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md) {
            return 404;
        }

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)\$ {
            expires      30d;
            error_log /dev/null;
            access_log /dev/null;
        }

        location ~ .*\.(js|css)?\$ {
            expires      12h;
            error_log /dev/null;
            access_log /dev/null;
        }
    }
}
EOF

# 删除原有MySQL
sudo yum remove mysql57-community-release-el7 -y

# 安装并配置MySQL
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
sudo yum install -y https://repo.mysql.com/mysql57-community-release-el7.rpm
sudo yum install -y mysql-community-server
sudo systemctl start mysqld
sudo systemctl enable mysqld

# 获取MySQL初始临时密码
TEMP_PASS=$(sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')

# 使用初始密码登录并修改root用户密码
mysql -u root -p"$TEMP_PASS" --connect-expired-password <<EOF
SET GLOBAL validate_password_policy=LOW;
SET GLOBAL validate_password_length=4;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
EOF

# 导入SQL文件到数据库
mysql -u root -proot <<EOF
CREATE DATABASE IF NOT EXISTS weekly_report CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EOF

mysql -u root -proot weekly_report < /var/www/html/WeeklyReport/weekly_report.sql


# 重启Nginx服务
systemctl restart nginx

# 确保防火墙设置允许80端口访问
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

# 获取服务器公网IP地址
IP=$(curl ifconfig.me)
echo "你的服务器公网IP地址是: $IP"

echo "脚本执行完毕,请通过该IP访问你的PHP项目。"

通过这个脚本,我们可以轻松地在CentOS 7服务器上部署Nginx、PHP和MySQL,并自动配置和部署一个PHP项目。这个一键部署的脚本不仅简化了部署过程,还能确保配置的正确性和一致性。使用这样的部署方法,可以极大地节省时间和精力,特别是对于频繁需要部署新环境的开发团队而言,效率提升显著。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1962499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《系统架构设计师教程(第2版)》第13章-层次式架构设计理论与实践-03-中间层(业务层|逻辑层)架构设计

文章目录 1. 业务逻辑层组件设计1.1 业务逻辑组件的实现类1.2 业务逻辑组件的配置 2. 业务逻辑层工作流设计2.1 工作流2.2 工作流参考模型2.2.1 概述2.2.1 工作流参考模型 3. 业务逻辑层实体设计3.1 业务逻辑层实体概述3.2 逻辑层实体的表示方法3.2.1 XML表示业务层实体3.2.2 通…

Prometheus+Grafana 监控平台实践-搭建常用服务监控告警

前言 Prometheus 是一个开放性的监控解决方案,通过各种 Exporter 采集当前主机/服务的数据,和 Grafana 相结合可以实现强大的监控和可视化功能 本篇将分享使用 docker compose 构建 Prometheus+Grafana,并监控之前文章所搭建的主机&服务,分享日常使用的一些使用经验 文…

Qt基础 | UDP通信 | UDP单播、广播、组播的介绍与实现

文章目录 一、QUdpSocket 实现 UDP 通信1.UDP 通信概述2.UDP 单播和广播2.1 主窗口类定义和构造函数2.2 UDP通信实现 3.UDP 组播3.1 主窗口类定义和构造函数3.2 组播功能的程序实现 Qt 网络模块&#xff1a; Qt基础 | 主机信息查询 | QHostInfo的介绍和使用 | QNetworkInterfac…

排序算法:选择排序,golang实现

目录 前言 选择排序 代码示例 1. 算法包 2. 选择排序代码 3. 模拟排序 4. 运行程序 5. 从大到小排序 循环细节 外层循环 内层循环 总结 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行排序 假如 30 条数据进行排序 选择排序的适用场景 1. 数据规模…

SAP PowerDesigner@官网下载

背景 略 问题 略 解决 用户可以通过访问SAP支持网站的首页&#xff08;‌https://support.sap.com/home.html&#xff09;‌&#xff0c;‌然后导航到“Software Downloads”&#xff08;‌软件下载&#xff09;‌部分来访问SAP软件的下载入口。‌在这里&#xff0c;‌用户可…

HCIP笔记1

hcia复习 osi--开放式系统互联参考模型---7层参考模型 tcp/ip协议栈道---4或5层 osi: 应用层 抽象语言-->编码 表示层 编码-->二进制 会话层 提供应用程序的会话地址 上三层为应用程序对数据流量进行加工及处理的阶段 传输层 分段、端口号 tcp/udp 网…

Apache2 Ubuntu-XXE漏洞渗透

Apache2 Ubuntu-XXE漏洞渗透 Apache2 Ubuntu Default Page 是一个包含xxe漏洞的页面&#xff0c;如何找到和利用xxe漏洞&#xff0c;并找到flag呢&#xff1f; 第一步&#xff1a;先打开其网页 当安装好虚拟机环境后&#xff0c;打开虚拟机我们并不知道它linux的账号密码 因…

通配符https证书的申请途径和配置方法

一、通配符SSL证书的功能 通配符SSL证书&#xff0c;也被称为泛域名证书&#xff0c;是一种特殊类型的SSL证书&#xff0c;它能够保护一个主域名及其所有次级子域名&#xff08;不可跨级保护&#xff09;。例如&#xff0c;如果您的主域名是example.com&#xff0c;那么一个通…

Vue2从基础到实战(v-bind对于样式控制的增强-操作style,v-model在其他表单元素的使用)

v-bind对于样式控制的增强-操作style 语法&#xff1a;style"样式对象" <div class"box" :style"{ CSS属性名1: CSS属性值, CSS属性名2: CSS属性值 }"></div> 代码解析&#xff1a; HTML结构&#xff1a; 包含了一个div元素&…

什么是数据血缘?怎么做好数据血缘分析?

目录 一、什么是数据血缘&#xff1f; 二、数据血缘关系的四大特征 三、数据血缘分析怎么做&#xff1f; 1.定义元数据模型 2.收集元数据 3.建立血缘关系模型 4.追踪数据流动 5.可视化分析 6.集成到数据治理中 7.持续更新和维护 8.应用分析结果 四、数据血缘技术趋势 1.通用的血…

51单片机-第六节-LED点阵屏与_74HC595_

1.LED点阵屏的结构&#xff1a; 与数码管相同&#xff08;数码管只是把LED排成8字结构&#xff09;&#xff0c;8*8的点阵屏有8816个引脚。 双色点阵屏有82*824个引脚&#xff0c;结构如图&#xff1a; 注&#xff1a;点阵屏引脚多为乱序排列&#xff0c; 控制需看单片机说…

基于SpringBoot+Vue的大学生租房系统(带1w+文档)

基于SpringBootVue的大学生租房系统(带1w文档) 基于SpringBootVue的大学生租房系统(带1w文档) 该系统主要实现了用户和房主通过系统注册用户&#xff0c;登录系统后能够编辑自己的个人信息、查看首页&#xff0c;房屋信息&#xff0c;房屋评价&#xff0c;公告资讯&#xff0c;…

Linux第七节课gcc与g++

一、补充权限 普通用户无法执行sudo&#xff1a; 通过sudo执行后显示不在sudoers file中&#xff01;&#xff08;张三不被信任&#xff01;&#xff09; 需要修改配置文件&#xff08;白名单&#xff01;&#xff09; 配置文件位于以下目录&#xff1a; ls /etc/sudoers -…

[Day 40] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

強化學習概述 強化學習&#xff08;Reinforcement Learning, RL&#xff09;是一種機器學習方法&#xff0c;主要用於訓練智能體&#xff08;agent&#xff09;在特定環境&#xff08;environment&#xff09;中進行決策。智能體通過嘗試和錯誤來學習&#xff0c;以最大化其累…

【iOS】—— iOS持久化

iOS持久化 1. 数据持久化的目的2. iOS持久化的方案3. 数据持久化方式的分类内存缓存磁盘缓存 4. 沙盒机制5. 沙盒的目录结构获取应用程序的沙盒路径每次编译代码会生成新的沙盒路径&#xff0c;每次运行获得的沙盒路径都不一样。访问沙盒目录常用C函数介绍沙盒目录介绍 6. 持久…

浅谈线程组插件之bzm - Arrivals Thread Group

浅谈线程组插件之bzm - Arrivals Thread Group bzm - Arrivals Thread Group 是 JMeter 中的一个高级插件&#xff0c;由 BlazeMeter 提供&#xff0c;旨在为性能测试提供更灵活、更贴近实际场景的负载生成方式。与传统的线程组不同&#xff0c;Arrivals Thread Group 通过控制…

网上订餐系统2024((代码+论文+ppt)

网上订餐系统2024((代码论文ppt),编号:sp006 代码经过修正,确保可以运行,下载地址在文末 技术栈: springbottvuemysql 展示: 下载地址: CSDN现在上传有问题,有兴趣的朋友先收藏.正常了贴上下载地址 备注: 专业承接各种程序java,c,c,python,cuda,AI 运行有问题请私信我,…

互联网医院系统源码与医保购药APP开发的完整技术指南

本篇文章&#xff0c;笔者将详细介绍互联网医院系统与医保购药APP的开发全过程&#xff0c;帮助开发者理解其技术要点和实现路径。 一、互联网医院系统开发 1.需求分析与系统设计 需要明确系统的功能需求&#xff0c;如在线问诊、预约挂号、电子病历管理、远程医疗、支付系统…

木材缺陷数据集:从手工模式到智能时代的跨越

亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 引言 …

【运维指南】常见的防火墙端口操作

每当一个应用程序想通过网络访问自己时&#xff0c;它就会申请一个 TCP/IP 端口&#xff0c;这意味着该端口不能被其他任何程序使用。那么&#xff0c;如何检查开放的端口&#xff0c;看看哪个应用程序已经在使用它呢&#xff1f; Windows 查看端口使用情况和进程名称 netst…