如何在 Debian 的 VPS 上安装 Laravel
要开始安装,您必须具备:
- 一台运行 Debian 11 操作系统的服务器。
- 具有安装和更新软件包权限的用户访问服务器。
安装 Apache
apt-get install apache2 -y
您可以使用以下命令验证安装:
apache2ctl -v
# 结果
Server version: Apache/2.4.48 (Debian)
安装 PHP 和其他必需的扩展
apt-get install apt-transport-https gnupg2 ca-certificates -y
然后,我们添加必要的存储库以安装 PHP 8.0:
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
然后我们更新存储库并安装 PHP 和其他扩展:
apt-get update -y
apt-get install libapache2-mod-php php php-common php-xml php-gd php8.0-opcache php-mbstring php-tokenizer php-json php-bcmath php-zip php-curl unzip curl -y php-mysql
我们验证 PHP 已正确安装:
php --version
# 结果
PHP 8.0.11 (cli) (built: Sep 23 2021 22:04:05) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.11, Copyright (c) Zend Technologies
with Zend OPcache v8.0.11, Copyright (c), by Zend Technologies
现在我们开始编辑 php.ini
文件。
nano /etc/php/8.0/apache2/php.ini
我们删除以下扩展的分号以启用它们:
- extension=pdo_mysql
安装 Composer
现在我们将安装 Composer 以便能够添加 Laravel 依赖项。
curl -sS https://getcomposer.org/installer | php
# 结果
All settings correct for using Composer
Downloading...
Composer (version 2.1.6) successfully installed to: /root/composer.phar
Use it: php composer.phar
现在我们将文件移动到操作系统二进制文件中,以便我们可以直接执行它:
mv composer.phar /usr/local/bin/composer
我们验证安装:
composer --version
# 结果
Composer version 2.1.6 2021-08-19 17:11:08
安装 MySQL/MariaDB
我们开始将 MariaDB 安装为数据库引擎。在终端中:
apt install mariadb-server
# 结果
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
galera-4 gawk libconfig-inifiles-perl libdbi-perl libmariadb3 libmpfr6 libsigsegv2 libsnappy1v5 mariadb-client-10.5 mariadb-client-core-10.5 mariadb-common
...
我们可以使用以下命令验证已安装的版本:
mariadb --version
# 结果
mariadb Ver 15.1 Distrib 10.5.11-MariaDB, for debian-linux-gnu (x86_64) using
我们验证服务状态:
systemctl status mariadb
# 结果
● mariadb.service - MariaDB 10.5.11 database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2021-08-17 23:38:11 CEST; 21min ago
Docs: man:mariadbd(8)
https://mariadb.com/kb/en/library/systemd/
...
如果由于某种原因数据库未运行,请使用以下命令启动它:
systemctl start mariadb
现在我们以 root
身份运行 MariaDB 控制台以创建新的数据库用户:
mysql -u root -p
# 结果
password:
# 按 ENTER 键,因为我们尚未为 root 用户设置密码。
我们创建一个新用户,在本例中我们称之为 codalas
,因为它将是访问系统数据库的目标用户。
create user codalas@localhost identified by 'password';
我们授予其所有特权:
GRANT ALL PRIVILEGES ON *.* TO 'codalas'@localhost IDENTIFIED BY 'password';
我们更新数据库特权:
FLUSH PRIVILEGES;
警告
对于生产系统,建议只授予必要的特权。
现在我们创建将用于系统的数据库:
CREATE DATABASE laravel;
创建非 root 用户以管理应用程序(如果尚不存在)
在操作系统控制台中,我们将使用以下命令创建一个非 root 用户,例如名为 codalas
的用户:
adduser codalas
我们填写所请求的信息,例如密码、姓名等。创建非 root 用户的目的是能够安全地安装 Laravel 依赖项。
安装 Git(可选)
我们根据环境安装 Git,以便能够克隆并在开发阶段使用更改保持项目最新。
我们更新操作系统软件包索引:
sudo apt update
我们安装 Git:
sudo apt install git
我们验证安装:
git --version
# 结果
git version 2.30.2
假设该项目已克隆到 /var/www/html/
文件夹中,我们将使用 laravel
作为示例文件夹,我们继续管理文件夹的权限:
我们将非 root 用户添加到服务器的 www-data
用户组中。这是为了能够在项目中执行命令,而不会干扰服务器对 vendor
、storage
和 bootstrap
文件夹所需的所有权权限。
usermod -a -G www-data codalas
然后我们将项目文件夹中所有文件的所有权更改为具有 www-data
组的 codalas
:
cd html
chown -R codalas:www-data laravel
我们更新文件夹的权限:
chmod -R 775 laravel
完成此操作后,我们可以继续使用新创建的用户执行其余功能。这可以使用新用户登录或从 root
用户代表非 root 用户执行命令。
作为 root 用户,我们可以使用以下命令代表创建的用户执行命令:
sudo -u codalas bash
这将启动一个 codalas
用户的终端。
我们继续创建具有环境变量的文件:
我们使用以下信息创建一个 .env
文件:
APP_NAME="Laravel"
APP_ENV=local
APP_DEBUG=true
APP_URL=https://localhost
APP_KEY=
LOG_CHANNEL=stack
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=codalas
DB_PASSWORD=password
MAIL_MAILER=smtp
MAIL_FROM_ADDRESS=
MAIL_FROM_NAME=
MAIL_HOST=
MAIL_PORT=587
MAIL_ENCRYPTION=tls
MAIL_USERNAME=
MAIL_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DRIVER=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
安装系统依赖项
我们运行 composer install
以安装系统依赖项。
composer install
# 结果
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 117 installs, 0 updates, 0 removals
- Installing doctrine/inflector (2.0.3): Extracting archive
- Installing doctrine/lexer (1.2.1): Extracting archive
- Installing symfony/polyfill-ctype (v1.23.0): Extracting archive
- Installing webmozart/assert (1.10.0): Extracting archive
- Installing dragonmantank/cron-expression (v3.1.0): Extracting archive
- Installing symfony/polyfill-php80 (v1.23.1): Extracting archive
- Installing symfony/polyfill-mbstring (v1.23.1): Extracting archive
...
刷新配置
我们继续刷新应用程序缓存:
php artisan config:cache
# 结果
Configuration cache cleared!
Configuration cached successfully!
php artisan route:cache
# 结果
Route cache cleared!
Routes cached successfully!
php artisan view:cache
# 结果
Compiled views cleared!
Blade templates cached successfully!
迁移
我们运行迁移以在数据库中创建表:
php artisan migrate
配置 Apache
使用 root
用户,我们将为应用程序创建一个 虚拟主机
配置。
我们为 laravel
创建一个新的配置文件:
nano /etc/apache2/sites-available/laravel.conf
我们使用以下内容修改文件:
<VirtualHost *:80>
ServerName http://localhost
ServerAdmin example@example.com
DocumentRoot /var/www/html/laravel/public
<Directory /var/www/html/laravel>
Options +Indexes +MultiViews
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/html/laravel/public>
Options +Indexes +MultiViews
AllowOverride None
Require all granted
<IfModule mod_rewrite.c>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
提示
根据服务器配置更新 ServerName
、ServerAdmin
、DocumentRoot
和 Directory
属性。
我们检查配置是否正确:
apachectl configtest
# 结果
Syntax OK
我们启用创建的虚拟主机和重写模块:
a2enmod rewrite
a2ensite laravel.conf
提示
控制台将指示您在每个命令后重新启动服务器以使其生效。您可以在执行这两个命令后重新启动服务器。
我们重新启动服务器:
systemctl restart apache2
配置防火墙
默认情况下,服务器仅打开端口 22,用于 SSH 连接。由于应用程序在端口 80 上运行,我们必须打开它,以便应用程序可以从外部访问。
我们验证防火墙状态:
ufw status
# 结果
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
我们启用端口 80:
ufw allow 80
如果我们再次检查状态,应该会显示新端口:
ufw status
# 结果
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
80 ALLOW Anywhere
80 (v6) ALLOW Anywhere (v6)
最后步骤
然后,在项目根目录中执行以下命令以更新文件夹的权限。
sudo chown -R codalas:www-data storage
sudo chmod 775 -R storage
我们生成用于生成身份验证令牌的唯一标识符。
php artisan key:generate
我们刷新应用程序配置。
php artisan config:cache
# 结果
Configuration cache cleared!
Configuration cached successfully!
php artisan route:cache
# 结果
Route cache cleared!
Routes cached successfully!
php artisan view:cache
# 结果
Compiled views cleared!
Blade templates cached successfully!
我们通过 IP 或分配的 URL(如果有)访问端口 80 上的服务器地址。例如 http://localhost