赞
踩
在开发和部署Web应用时,LNMP(Linux、Nginx、MySQL、PHP)的组合是非常常见的。这篇博客将介绍如何通过一个简单的脚本,在CentOS 7上部署LNMP,并将PHP项目自动部署到服务器上。这不仅可以节省大量的时间,还能确保环境配置的一致性。这个一键部署的脚本不仅简化了部署过程,还能确保配置的正确性和一致性。使用这样的部署方法,可以极大地节省时间和精力,特别是对于频繁需要部署新环境的开发团队而言,效率提升显著。
LNMP是一种流行的Web服务架构,其中:
在实际项目中,PHP项目通常会与nginx和MySQL搭配使用,形成一个完整的Web应用架构。以下是一些常见的部署结构:
以下是这些结构的比较:
架构 | Web服务器 | 数据库 | 适用场景 |
---|---|---|---|
LAMP | Apache | MySQL | 需要.htaccess支持的项目 |
LNMP | Nginx | MySQL | 高并发和静态文件较多的项目 |
LEMP | Nginx | MariaDB | 需要更高性能和更多功能的项目 |
首先,我们需要清理现有的项目目录,删除/var/www/html
目录下的所有文件。这通常是Web项目的默认目录,清理这个目录可以避免旧项目文件的干扰。
sudo rm -rf /var/www/html
安装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
这里使用到的也是我创作的开源项目,感兴趣的朋友可以去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
创建并编辑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
导入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
创建数据库:在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
重启Nginx服务,使新配置生效,并确保Nginx可以正确处理和转发请求。
systemctl restart nginx
开放80端口:为了确保外部能够访问到我们的Nginx服务,需要开放80端口。使用firewall-cmd来配置防火墙,允许HTTP访问。
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
使用curl命令获取服务器的公网IP地址,并打印出来,方便通过该IP直接访问部署好的PHP项目。
IP=$(curl ifconfig.me)
echo "你的服务器公网IP地址是: $IP"
我们测试访问:
项目部署成功!
部署过程中涉及到的每个步骤都有其特定的作用:
下面是全部代码(可以直接一键部署):
#!/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项目。这个一键部署的脚本不仅简化了部署过程,还能确保配置的正确性和一致性。使用这样的部署方法,可以极大地节省时间和精力,特别是对于频繁需要部署新环境的开发团队而言,效率提升显著。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。