Skip to content

如何在 Debian 的 VPS 上安装 Laravel

要开始安装,您必须具备:

  • 一台运行 Debian 11 操作系统的服务器。
  • 具有安装和更新软件包权限的用户访问服务器。

安装 Apache

sh
apt-get install apache2 -y

您可以使用以下命令验证安装:

sh
apache2ctl -v

# 结果
Server version: Apache/2.4.48 (Debian)

安装 PHP 和其他必需的扩展

sh
apt-get install apt-transport-https gnupg2 ca-certificates -y

然后,我们添加必要的存储库以安装 PHP 8.0:

sh
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
sh
sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'

然后我们更新存储库并安装 PHP 和其他扩展:

sh
apt-get update -y
sh
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 已正确安装:

sh
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 文件。

sh
nano /etc/php/8.0/apache2/php.ini

我们删除以下扩展的分号以启用它们:

  • extension=pdo_mysql

安装 Composer

现在我们将安装 Composer 以便能够添加 Laravel 依赖项。

sh
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

现在我们将文件移动到操作系统二进制文件中,以便我们可以直接执行它:

sh
mv composer.phar /usr/local/bin/composer

我们验证安装:

sh
composer --version

# 结果
Composer version 2.1.6 2021-08-19 17:11:08

安装 MySQL/MariaDB

我们开始将 MariaDB 安装为数据库引擎。在终端中:

sh
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
  ...

我们可以使用以下命令验证已安装的版本:

sh
mariadb --version

# 结果
mariadb Ver 15.1 Distrib 10.5.11-MariaDB, for debian-linux-gnu (x86_64) using

我们验证服务状态:

sh
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/
     ...

如果由于某种原因数据库未运行,请使用以下命令启动它:

sh
systemctl start mariadb

现在我们以 root 身份运行 MariaDB 控制台以创建新的数据库用户:

sh
mysql -u root -p

# 结果  
password:
# 按 ENTER 键,因为我们尚未为 root 用户设置密码。

我们创建一个新用户,在本例中我们称之为 codalas,因为它将是访问系统数据库的目标用户。

sh
create user codalas@localhost identified by 'password';

我们授予其所有特权:

sh
GRANT ALL PRIVILEGES ON *.* TO 'codalas'@localhost IDENTIFIED BY 'password';

我们更新数据库特权:

sh
FLUSH PRIVILEGES;

警告

对于生产系统,建议只授予必要的特权。

现在我们创建将用于系统的数据库:

sh
CREATE DATABASE laravel;

创建非 root 用户以管理应用程序(如果尚不存在)

在操作系统控制台中,我们将使用以下命令创建一个非 root 用户,例如名为 codalas 的用户:

sh
adduser codalas

我们填写所请求的信息,例如密码、姓名等。创建非 root 用户的目的是能够安全地安装 Laravel 依赖项。

安装 Git(可选)

我们根据环境安装 Git,以便能够克隆并在开发阶段使用更改保持项目最新。

我们更新操作系统软件包索引:

sh
sudo apt update

我们安装 Git:

sh
sudo apt install git

我们验证安装:

sh
git --version

# 结果
git version 2.30.2

假设该项目已克隆到 /var/www/html/ 文件夹中,我们将使用 laravel 作为示例文件夹,我们继续管理文件夹的权限:

我们将非 root 用户添加到服务器的 www-data 用户组中。这是为了能够在项目中执行命令,而不会干扰服务器对 vendorstoragebootstrap 文件夹所需的所有权权限。

sh
usermod -a -G www-data codalas

然后我们将项目文件夹中所有文件的所有权更改为具有 www-data 组的 codalas

sh
cd html
sh
chown -R codalas:www-data laravel

我们更新文件夹的权限:

sh
chmod -R 775 laravel

完成此操作后,我们可以继续使用新创建的用户执行其余功能。这可以使用新用户登录或从 root 用户代表非 root 用户执行命令。

作为 root 用户,我们可以使用以下命令代表创建的用户执行命令:

sh
sudo -u codalas bash

这将启动一个 codalas 用户的终端。

我们继续创建具有环境变量的文件:

我们使用以下信息创建一个 .env 文件:

sh
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 以安装系统依赖项。

sh
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
  ...

刷新配置

我们继续刷新应用程序缓存:

sh
php artisan config:cache

# 结果
Configuration cache cleared!
Configuration cached successfully!
sh
php artisan route:cache

# 结果
Route cache cleared!  
Routes cached successfully!
sh
php artisan view:cache

# 结果
Compiled views cleared!
Blade templates cached successfully!

迁移

我们运行迁移以在数据库中创建表:

sh
php artisan migrate

配置 Apache

使用 root 用户,我们将为应用程序创建一个 虚拟主机 配置。

我们为 laravel 创建一个新的配置文件:

sh
nano /etc/apache2/sites-available/laravel.conf

我们使用以下内容修改文件:

sh
<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>

提示

根据服务器配置更新 ServerNameServerAdminDocumentRootDirectory 属性。

我们检查配置是否正确:

sh
apachectl configtest

# 结果
Syntax OK

我们启用创建的虚拟主机和重写模块:

sh
a2enmod rewrite
sh
a2ensite laravel.conf

提示

控制台将指示您在每个命令后重新启动服务器以使其生效。您可以在执行这两个命令后重新启动服务器。

我们重新启动服务器:

sh
systemctl restart apache2

配置防火墙

默认情况下,服务器仅打开端口 22,用于 SSH 连接。由于应用程序在端口 80 上运行,我们必须打开它,以便应用程序可以从外部访问。

我们验证防火墙状态:

sh
ufw status

# 结果
Status: active

To                         Action      From
--                         ------      ----  
22                         ALLOW       Anywhere

我们启用端口 80:

sh
ufw allow 80

如果我们再次检查状态,应该会显示新端口:

sh
ufw status

# 结果
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
80                         ALLOW       Anywhere
80 (v6)                    ALLOW       Anywhere (v6)

最后步骤

然后,在项目根目录中执行以下命令以更新文件夹的权限。

sh
sudo chown -R codalas:www-data storage

sudo chmod 775 -R storage

我们生成用于生成身份验证令牌的唯一标识符。

sh
php artisan key:generate

我们刷新应用程序配置。

sh
php artisan config:cache

# 结果
Configuration cache cleared!
Configuration cached successfully!
sh
php artisan route:cache

# 结果
Route cache cleared!
Routes cached successfully!
sh
php artisan view:cache

# 结果
Compiled views cleared!
Blade templates cached successfully!

我们通过 IP 或分配的 URL(如果有)访问端口 80 上的服务器地址。例如 http://localhost