Ubuntu系统上Laravel项目的部署步骤
部署Laravel项目到Ubuntu服务器涉及多个步骤,包括环境配置、依赖安装、服务器设置以及安全性优化。以下是一个详尽的指南,帮助您在Ubuntu系统上成功部署Laravel应用。
目录
前提条件
在开始部署之前,确保您具备以下条件:
- 一台运行Ubuntu(推荐20.04 LTS或更新版本)的服务器。
- 具有sudo权限的用户账户。
- 基本的Linux命令行操作知识。
- 已完成Laravel项目的开发,并已在本地环境中测试通过。
更新系统软件包
首先,确保您的系统软件包是最新的,以避免潜在的安全漏洞和兼容性问题。
sudo apt update && sudo apt upgrade -y
解释:
sudo
:以超级用户权限执行命令。apt update
:更新软件包列表。apt upgrade -y
:升级所有已安装的软件包,并自动确认。
安装必要的软件
安装Apache/Nginx
Laravel支持多种Web服务器,常用的有Apache和Nginx。以下分别介绍安装步骤。
安装Apache
sudo apt install apache2 -y
解释:
apt install apache2 -y
:使用APT包管理器安装Apache Web服务器,并自动确认。
安装完成后,启用并启动Apache服务:
sudo systemctl enable apache2
sudo systemctl start apache2
安装Nginx
sudo apt install nginx -y
解释:
apt install nginx -y
:安装Nginx Web服务器,并自动确认。
安装完成后,启用并启动Nginx服务:
sudo systemctl enable nginx
sudo systemctl start nginx
安装PHP及扩展
Laravel 需要PHP及其扩展的支持。以下步骤安装PHP 8.1及常用扩展。
sudo apt install php8.1 php8.1-fpm php8.1-mysql php8.1-xml php8.1-mbstring php8.1-curl php8.1-zip php8.1-gd -y
解释:
php8.1
:安装PHP 8.1主程序。php8.1-fpm
:安装PHP FastCGI Process Manager,用于Nginx。- 其他扩展如
php8.1-mysql
(MySQL支持)、php8.1-xml
(XML支持)等,确保Laravel的各项功能正常运行。
安装数据库(MySQL/MariaDB)
Laravel常用的数据库有MySQL和MariaDB。以下以MariaDB为例进行安装。
sudo apt install mariadb-server mariadb-client -y
解释:
mariadb-server
:安装MariaDB服务器。mariadb-client
:安装MariaDB客户端工具。
安装完成后,启动并启用MariaDB服务:
sudo systemctl enable mariadb
sudo systemctl start mariadb
安装Composer
Composer是PHP的依赖管理工具,Laravel依赖Composer来管理其依赖包。
sudo apt install curl -y
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer
解释:
apt install curl -y
:安装curl工具,用于下载Composer安装脚本。curl -sS https://getcomposer.org/installer | php
:下载并运行Composer安装脚本。mv composer.phar /usr/local/bin/composer
:将Composer移动到全局可执行路径。chmod +x /usr/local/bin/composer
:赋予执行权限。
验证安装:
composer --version
配置数据库
配置MariaDB以供Laravel使用。
sudo mysql_secure_installation
解释:
mysql_secure_installation
:运行MariaDB安全安装向导,设置root密码、删除匿名用户、禁止远程root登录及删除测试数据库。
接下来,登录MariaDB并创建数据库和用户:
sudo mysql -u root -p
在MariaDB命令行中执行以下命令:
CREATE DATABASE laravel_db;
CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'secure_password';
GRANT ALL PRIVILEGES ON laravel_db.* TO 'laravel_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
解释:
CREATE DATABASE laravel_db;
:创建名为laravel_db
的数据库。CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'secure_password';
:创建数据库用户laravel_user
,密码为secure_password
。GRANT ALL PRIVILEGES ON laravel_db.* TO 'laravel_user'@'localhost';
:授予该用户对laravel_db
数据库的所有权限。FLUSH PRIVILEGES;
:刷新权限,使更改生效。EXIT;
:退出MariaDB命令行。
获取Laravel项目代码
有多种方式获取Laravel项目代码,如通过Git克隆或直接上传代码包。以下以Git克隆为例。
首先,安装Git:
sudo apt install git -y
解释:
apt install git -y
:安装Git版本控制工具,并自动确认。
克隆项目代码:
cd /var/www
sudo git clone https://github.com/your-repository/laravel-project.git
sudo chown -R www-data:www-data laravel-project
解释:
cd /var/www
:切换到Web根目录。git clone https://github.com/your-repository/laravel-project.git
:克隆您的Laravel项目代码仓库。chown -R www-data:www-data laravel-project
:将项目目录的所有权更改为www-data
用户和组,确保Web服务器有权限访问。
配置环境文件
复制示例环境文件并进行配置。
cd /var/www/laravel-project
sudo cp .env.example .env
sudo nano .env
解释:
cp .env.example .env
:复制示例环境文件为实际使用的环境文件。nano .env
:使用Nano编辑器打开.env
文件进行编辑。
在 .env
文件中,配置数据库连接信息:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=secure_password
解释:
DB_CONNECTION
:数据库驱动,使用mysql
。DB_HOST
:数据库主机,通常为127.0.0.1
。DB_PORT
:数据库端口,MySQL默认端口为3306
。DB_DATABASE
、DB_USERNAME
、DB_PASSWORD
:前面创建的数据库名称、用户名及密码。
安装项目依赖
使用Composer安装Laravel项目的依赖包。
sudo composer install --optimize-autoloader --no-dev
解释:
composer install
:根据composer.json
文件安装依赖包。--optimize-autoloader
:优化自动加载,提高性能。--no-dev
:不安装开发环境依赖,适用于生产环境。
生成应用密钥
Laravel需要生成一个应用密钥,用于加密等功能。
sudo php artisan key:generate
解释:
php artisan key:generate
:生成一个新的应用密钥并更新.env
文件中的APP_KEY
。
配置Web服务器
根据选择的Web服务器,进行相应的配置。
Apache配置
启用必要的Apache模块,并配置虚拟主机。
sudo a2enmod rewrite
sudo systemctl restart apache2
解释:
a2enmod rewrite
:启用Apache的mod_rewrite
模块,支持URL重写。systemctl restart apache2
:重启Apache服务以应用更改。
创建虚拟主机配置文件:
sudo nano /etc/apache2/sites-available/laravel.conf
在文件中添加以下内容:
<VirtualHost *:80>
ServerName yourdomain.com
ServerAdmin webmaster@yourdomain.com
DocumentRoot /var/www/laravel-project/public
<Directory /var/www/laravel-project/public>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/laravel_error.log
CustomLog ${APACHE_LOG_DIR}/laravel_access.log combined
</VirtualHost>
解释:
ServerName
:您的域名。DocumentRoot
:指向Laravel项目的public
目录。<Directory>
块中,AllowOverride All
允许使用.htaccess
文件进行配置,Require all granted
允许所有请求。
启用虚拟主机并禁用默认站点:
sudo a2ensite laravel.conf
sudo a2dissite 000-default.conf
sudo systemctl reload apache2
解释:
a2ensite laravel.conf
:启用新的虚拟主机配置。a2dissite 000-default.conf
:禁用默认的Apache站点配置。systemctl reload apache2
:重新加载Apache配置。
Nginx配置
配置Nginx以服务Laravel应用。
创建虚拟主机配置文件:
sudo nano /etc/nginx/sites-available/laravel
在文件中添加以下内容:
server {
listen 80;
server_name yourdomain.com;
root /var/www/laravel-project/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php index.html index.htm;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
解释:
server_name
:您的域名。root
:指向Laravel项目的public
目录。location /
:处理所有请求,尝试文件存在性,若不存在则转发到index.php
。location ~ \.php$
:配置PHP处理,通过php-fpm
处理PHP请求。location ~ /\.(?!well-known).*
:禁止访问隐藏文件和目录,除非是.well-known
目录。
启用虚拟主机并测试配置:
sudo ln -s /etc/nginx/sites-available/laravel /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
解释:
ln -s
:创建符号链接,启用站点配置。nginx -t
:测试Nginx配置文件是否有语法错误。systemctl reload nginx
:重新加载Nginx配置。
设置文件权限
Laravel需要对 storage
和 bootstrap/cache
目录具有写权限。
sudo chown -R www-data:www-data /var/www/laravel-project
sudo find /var/www/laravel-project -type f -exec chmod 644 {} \;
sudo find /var/www/laravel-project -type d -exec chmod 755 {} \;
sudo chmod -R 775 /var/www/laravel-project/storage
sudo chmod -R 775 /var/www/laravel-project/bootstrap/cache
解释:
chown -R www-data:www-data
:将项目目录的所有权更改为www-data
用户和组。find ... -type f -exec chmod 644 {}
:将所有文件权限设置为644
。find ... -type d -exec chmod 755 {}
:将所有目录权限设置为755
。chmod -R 775
:对storage
和bootstrap/cache
目录赋予写权限。
优化Laravel配置
为了提高性能,执行以下优化命令:
sudo php artisan config:cache
sudo php artisan route:cache
sudo php artisan view:cache
解释:
php artisan config:cache
:缓存配置,提高加载速度。php artisan route:cache
:缓存路由,减少路由解析时间。php artisan view:cache
:缓存视图,提升视图渲染性能。
配置队列和缓存
Laravel支持多种队列和缓存驱动,推荐使用Redis或数据库驱动。以下以数据库驱动为例。
首先,创建队列表:
sudo php artisan queue:table
sudo php artisan migrate
解释:
queue:table
:生成队列表迁移文件。migrate
:运行迁移,创建队列表。
配置 .env
文件中的队列和缓存:
QUEUE_CONNECTION=database
CACHE_DRIVER=file
启动队列监听器:
sudo php artisan queue:work --daemon
解释:
queue:work --daemon
:启动队列工作进程,以守护进程模式运行,提高性能。
建议使用Supervisor管理队列进程:
安装Supervisor:
sudo apt install supervisor -y
创建Supervisor配置文件:
sudo nano /etc/supervisor/conf.d/laravel-queue.conf
添加以下内容:
[program:laravel-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/laravel-project/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/laravel-project/storage/logs/queue.log
解释:
command
:运行队列工作进程的命令。autostart
和autorestart
:确保队列进程在系统启动和失败时自动启动。user
:以www-data
用户运行队列进程。stdout_logfile
:队列日志文件路径。
更新Supervisor配置并启动队列进程:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-queue:*
启用HTTPS
为提高安全性,建议使用Let's Encrypt为您的域名配置SSL证书。
安装Certbot:
sudo apt install certbot python3-certbot-apache -y
解释:
certbot
:Let's Encrypt的官方客户端,用于获取和管理SSL证书。python3-certbot-apache
:Certbot的Apache插件。
获取并安装SSL证书:
sudo certbot --apache -d yourdomain.com -d www.yourdomain.com
解释:
--apache
:使用Apache插件自动配置SSL。-d
:指定需要保护的域名。
按照提示完成验证和安装。成功后,您的网站将通过HTTPS提供服务。
如果使用Nginx,安装相应插件并执行类似步骤:
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
常见问题排查
1. 权限错误
症状:
- 无法写入
storage
或bootstrap/cache
目录。 - 页面显示500内部服务器错误。
解决方法:
- 确认目录权限正确,确保
www-data
用户对相关目录有写权限。 使用以下命令重新设置权限:
sudo chown -R www-data:www-data /var/www/laravel-project sudo chmod -R 775 /var/www/laravel-project/storage sudo chmod -R 775 /var/www/laravel-project/bootstrap/cache
2. 数据库连接失败
症状:
- Laravel应用无法连接数据库,报错
SQLSTATE[HY000] [1045] Access denied for user
。
解决方法:
- 检查
.env
文件中的数据库配置是否正确。 - 确认数据库用户权限,确保用户有权访问指定的数据库。
使用以下命令测试数据库连接:
mysql -u laravel_user -p -h 127.0.0.1 laravel_db
3. 依赖安装失败
症状:
composer install
过程中出现错误,提示缺少某些PHP扩展。
解决方法:
根据错误提示安装缺失的PHP扩展。例如,缺少
openssl
扩展:sudo apt install php8.1-openssl -y sudo systemctl restart apache2/nginx
总结
在Ubuntu系统上部署Laravel项目涉及多个步骤,包括环境配置、依赖安装、数据库设置、Web服务器配置及安全性优化。通过本文提供的详细步骤,您可以系统地完成Laravel应用的部署,确保其在生产环境中稳定运行。
关键步骤包括:
- 系统更新与软件安装:确保系统软件包最新,并安装必要的软件如Web服务器、PHP、数据库和Composer。
- 数据库配置:创建数据库和用户,配置Laravel的
.env
文件。 - 获取与配置项目代码:通过Git克隆项目,安装依赖,生成应用密钥。
- Web服务器配置:根据使用的Web服务器(Apache或Nginx)进行相应配置,确保请求正确路由到Laravel应用。
- 权限与优化:设置适当的文件权限,优化Laravel的配置,提高应用性能。
- 安全性配置:启用HTTPS,确保数据传输安全。
- 问题排查:了解常见问题及解决方法,确保应用稳定运行。
通过遵循上述步骤,您将能够在Ubuntu服务器上成功部署并运行Laravel项目,满足生产环境的需求。
附录:常用命令汇总表
命令 | 功能描述 | 详细说明 |
---|---|---|
sudo apt update && sudo apt upgrade -y | 更新系统软件包 | 更新软件包列表并升级所有已安装的软件包。 |
sudo apt install apache2 -y | 安装Apache Web服务器 | 使用APT包管理器安装Apache,并自动确认。 |
sudo apt install nginx -y | 安装Nginx Web服务器 | 使用APT包管理器安装Nginx,并自动确认。 |
sudo apt install php8.1 php8.1-fpm php8.1-mysql ... -y | 安装PHP及扩展 | 安装PHP 8.1及其常用扩展,确保Laravel正常运行。 |
sudo apt install mariadb-server mariadb-client -y | 安装MariaDB数据库 | 安装MariaDB服务器和客户端工具。 |
sudo mysql_secure_installation | 配置MariaDB安全设置 | 设置MariaDB的root密码,删除匿名用户,禁止远程root登录等。 |
sudo apt install git -y | 安装Git版本控制工具 | 使用APT包管理器安装Git,并自动确认。 |
sudo apt install composer -y | 安装Composer依赖管理工具 | 安装Composer,以管理PHP依赖包。 |
sudo php artisan key:generate | 生成Laravel应用密钥 | 生成并设置Laravel应用的加密密钥。 |
sudo a2enmod rewrite | 启用Apache的rewrite模块 | 启用Apache的URL重写模块,支持Laravel的路由功能。 |
sudo systemctl restart apache2 | 重启Apache服务 | 重启Apache服务以应用新的配置。 |
sudo ln -s /etc/nginx/sites-available/laravel /etc/nginx/sites-enabled/ | 启用Nginx虚拟主机 | 创建符号链接,启用Nginx的虚拟主机配置。 |
sudo nginx -t | 测试Nginx配置文件 | 检查Nginx配置文件是否存在语法错误。 |
sudo systemctl reload nginx | 重新加载Nginx配置 | 重新加载Nginx配置,使更改生效。 |
sudo chown -R www-data:www-data /var/www/laravel-project | 设置项目目录所有权 | 将Laravel项目目录的所有权更改为 www-data 用户和组。 |
sudo chmod -R 775 /var/www/laravel-project/storage | 设置存储目录权限 | 赋予 storage 目录读写权限,确保Laravel可以写入日志和缓存。 |
sudo php artisan config:cache | 缓存Laravel配置 | 缓存配置文件,提高应用性能。 |
sudo php artisan route:cache | 缓存Laravel路由 | 缓存路由信息,减少路由解析时间。 |
sudo php artisan view:cache | 缓存Laravel视图 | 缓存视图文件,提升视图渲染性能。 |
sudo apt install supervisor -y | 安装Supervisor进程管理工具 | 安装Supervisor,用于管理Laravel队列进程。 |
sudo supervisorctl reread | 重新读取Supervisor配置 | 告知Supervisor配置文件有更新。 |
sudo supervisorctl update | 更新Supervisor配置 | 应用新的Supervisor配置。 |
sudo supervisorctl start laravel-queue:* | 启动Laravel队列进程 | 启动由Supervisor管理的Laravel队列工作进程。 |
sudo apt install certbot python3-certbot-apache -y | 安装Certbot(Apache) | 安装用于获取和管理SSL证书的Certbot工具,适用于Apache服务器。 |
sudo certbot --apache -d yourdomain.com -d www.yourdomain.com | 获取并安装SSL证书 | 使用Certbot为指定域名获取并配置SSL证书。 |
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com | 获取并安装SSL证书(Nginx) | 使用Certbot为指定域名获取并配置SSL证书,适用于Nginx服务器。 |
sudo php artisan queue:table | 生成队列表迁移文件 | 创建队列表的迁移文件,用于Laravel队列系统。 |
sudo php artisan migrate | 运行数据库迁移 | 执行数据库迁移,创建必要的表结构。 |
通过上述命令汇总表,您可以快速查阅和使用在Ubuntu上部署Laravel项目过程中常用的命令,提升操作效率。