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

在开发和部署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;
EOFmysql -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://xiahunao.cn/news/3281582.html

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

相关文章

一个接口未做超时处理,引发数据库hang了

前言 在代码开发过程中&#xff0c;你是否会经常遇到以下问题&#xff1f; 数据库连接被瞬间占用&#xff0c;出现性能瓶颈 系统资源被大量占用&#xff0c;出现锁等待或性能下降 事务日志大量增长 上述这些状况的出现可能是未提交事务引发的。该类事务开启后&#xff0c;…

什么是五力分析?5分钟带你了解它在企业财务经营中的应用与价值!

如今&#xff0c;随着全球化进程的不断加速&#xff0c;市场环境复杂多变&#xff0c;市场竞争日益激烈&#xff0c;财务经营已经成为了企业应对复杂市场环境、保持自身竞争力的关键。体系化的五力分析平台能够为企业提供一套全面的解决方案&#xff0c;帮助企业在盈利能力、偿…

【随机链表的复制】python刷题记录

R3-哈希表 参考k神题解 哈希表法&#xff1a; """ # Definition for a Node. class Node:def __init__(self, x: int, next: Node None, random: Node None):self.val int(x)self.next nextself.random random """class Solution:def copy…

Java红娘相亲交友平台系统源码小程序

&#x1f495;遇见真爱&#xff0c;从“红娘相亲交友平台系统”开始&#xff01;&#x1f46b; &#x1f339;【精准匹配&#xff0c;缘分不再擦肩而过】 还在为茫茫人海中找不到那个TA而烦恼吗&#xff1f;“红娘相亲交友平台系统”利用先进的大数据分析技术&#xff0c;根据…

电脑怎么压缩图片?6个简单实用的压缩方法分享(无损压缩)

电脑怎么压缩图片&#xff1f;面对电脑较大的图片&#xff0c;小编是建议大家进行压缩的。文件过大容易影响电脑存储空间&#xff0c;而且还不容易上传和传输。图片压缩有很多方法可以有效解决&#xff0c;简单几步就能将图片压缩变小&#xff0c;下面是相关的介绍&#xff0c;…

web期末大作业家乡-浙江

代码下载: https://pan.quark.cn/s/2e157769c4ad

android动态权限申请并告知权限申请的使用目的

随着工信部对APP的一系列整治&#xff0c;现在要求APP在申请相机、位置等敏感权限时需要向用户同步告知权限申请的使用目的。个大应用市场在APP上线审核中也会重点检查这项要求。 从Android 6.0开始&#xff0c;对于敏感权限的获取&#xff0c;APP需要调用系统提供的动态申请权…

借银行的贷款去还网贷,可以吗?

近日&#xff0c;有很多网友问我&#xff0c;他们申请的公积金贷款&#xff0c;能不能用这笔钱来还清信用卡和网贷&#xff0c;但又怕这么做会违法&#xff0c;或者银行会突然要求他提前还贷。 首先&#xff0c;放心&#xff0c;这么做不违法。但银行确实不太鼓励这么用贷款&am…

【扒模块】DFF

图 医学图像分割任务 代码 import torch import torch.nn as nnfrom timm.models.layers import DropPath # 论文&#xff1a;D-Net&#xff1a;具有动态特征融合的动态大核&#xff0c;用于体积医学图像分割&#xff08;3D图像任务&#xff09; # https://arxiv.org/abs/2403…

嵌入式开发问题总汇

1. 事情经过&#xff1a;有天快下班的时候&#xff0c;我们采购经理找到我&#xff0c;说&#xff0c;生成的bin文件通过软件上传烧录时&#xff0c;烧录就会重启&#xff0c;但是其他的板子就不会。最后他换了一个A厂家的flash芯片&#xff0c;就可以了。但是&#xff0c;B厂…

整箱排柜不返工?用易境通散拼系统就OK

想必困扰散货拼柜小伙伴们一大难题就是&#xff0c;怎么把错乱纷繁的货物有序地整箱排柜&#xff0c;并且要保证集装箱高效利用&#xff0c;运输成本尽量降低。这不仅要求操作者具备卓越的统筹规划能力&#xff0c;更需长期积累的实践经验和敏锐的应变能力。易境通散拼系统可以…

SSM城市垃圾分类管理系统-计算机毕业设计源码44582

摘 要 在当前全球环境问题日益突出的背景下&#xff0c;城市垃圾分类成为推动可持续发展和环境保护的重要举措之一。然而&#xff0c;传统的垃圾处理方式存在效率低下、资源浪费和环境污染等问题。因此&#xff0c;开发一个基于Java编程语言、MySQL数据库和HTML前端技术的高效…

前缀和与差分大总结!!!C++

学了忘忘了学o(╥﹏╥)o 题源acwing 讲解前缀和一维&#xff0c;用于序列二维&#xff0c;用于矩阵 讲解差分什么是差分数组&#xff1f;一维差分数组二维差分数组 题目一&#xff1a;前缀和题目二&#xff1a;子矩阵的和题目三&#xff1a;差分题目四&#xff1a;差分矩阵 讲…

中电金信:金融机构企业级客户中心建设指南

客户中心系统&#xff08;ECIF​&#xff09;承担了数字化转型的重要使命&#xff0c;管理和认识客户是内部运营和外部监管的共同需求。更为重要的是&#xff0c;客户数据需要全场景地参与到数字化运营中&#xff0c;几乎所有业务都围绕着客户展开&#xff0c;几乎所有场景都需…

无人机技术已应用至地理测绘,Infortrend存储助力测绘数据

--高扩展保存海量无人机数据&#xff0c;高性能支持快速调取建模&#xff0c;数据安全也有免费的备份功能&#xff0c;实实在在好用的存储设备。

KeePass密码管理工具部署

KeePass密码管理工具部署 安装包下载入口 双击执行&#xff0c;根据提示完成安装&#xff1a; 安装完成后如图&#xff1a;

什么是邮件安全证书?如何获取邮件安全证书?

国内药企要想获得GMP认证&#xff0c;除了需满足FDA对药品的审核标准之外&#xff0c;还明文规定需要使用邮件安全证书&#xff08;S/MIME证书&#xff09;与之进行加密邮件沟通。那么什么是邮件安全证书&#xff1f;如何获取邮件安全证书&#xff1f; 什么是邮件安全证书&…

C++ 右值 左值引用

一.什么是左值引用 右值引用 1.左值引用 左值是一个表示数据的表达式(如变量名或解引用的指针)&#xff0c;我们可以获取它的地址可以对它赋值。定义时const修饰符后的左值&#xff0c;不能给他赋值&#xff0c;但是可以取它的地址。左值引用就是给左值的引用&#xff0c;给左…

Java扫码点餐系统奶茶店类型堂食配送小程序源码

&#x1f964;【奶茶新风尚&#xff01;扫码点餐系统&#xff0c;堂食配送两不误】&#x1f964; &#x1f3e0;【堂食新体验&#xff1a;一键下单&#xff0c;即享美味】&#x1f3e0; 踏入心仪的奶茶店&#xff0c;不再需要排队等候点单&#xff0c;只需拿起手机&#xff0…

18730 涂色问题

这个问题可以通过动态规划来解决。我们可以定义一个状态dp[i][j]&#xff0c;表示前i个牛舍中最后一个牛舍的颜色是j的涂色方案数量。然后我们可以通过状态转移方程来更新dp[i][j]。 状态转移方程如下&#xff1a; dp[i][j] dp[i-1][k] (k ! j) 然后我们需要对所有的dp[i][…