在 Ubuntu 和 Nginx 上将应用程序部署到 Laravel 7

在 Ubuntu 和 Nginx 上将应用程序部署到 Laravel 7

我决定使用 Laravel 7 制作我的作品集。这样主页将成为登陆页面,并且可以使用管理面板更改其上的所有信息。 不是重点。 到了部署阶段。 我发现了一些关于如何在成熟的服务器上完成此操作的好教程,但遇到了所有的麻烦。 我在部署方面不是很强;我通常比全栈更靠前。 而且,如果我仍然可以用 PHP 编写和测试,那么在管理服务器之前等等。 我还没有长大。 但我必须弄清楚。

现在我们将完成所有步骤,从通过 SSH 启动到工作站点结束。 我们将尽力避免所有陷阱。

您也许可以在网上找到类似的说明。 毕竟我终于找到了。 确实,不是在一个地方,没有 StackOverflow 的帮助,而且几乎没有俄语。 我吃了苦。 这就是为什么我决定简化你的生活。

我们将用 DigitalOcean 上的 Droplet 来完成一切。 当然,这不是必需的;选择任何托管。 当您到达 Ubuntu 上的工作服务器时,请返回。 对于那些仍然决定在 DigitalOcean 上进行操作的人,将会有更多有关设置域的提示。 和 100 美元推荐链接.

所有 DigitalOcean 特定的步骤都将在脚注中给出,如下所示。

我们开始吧。

TL;DR(仅限基本命令)

创建用户

  • ssh root@[IP-адрес вашего дроплета]
  • adduser laravel
  • usermod -aG sudo laravel
  • su laravel

添加 SSH 到它

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • 插入公钥
  • chmod 600 ~/.ssh/authorized_keys

防火墙

  • sudo ufw allow OpenSSH
  • sudo ufw enable
  • sudo ufw status

Nginx的

  • sudo apt update
  • sudo apt install -y nginx
  • sudo ufw allow 'Nginx HTTP'
  • sudo ufw status

MySQL的

  • sudo apt install -y mysql-server
  • sudo mysql_secure_installation, NYNNY
  • sudo mysql
  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';
  • SELECT user,authentication_string,plugin,host FROM mysql.user;
  • FLUSH PRIVILEGES;
  • exit

PHP

  • sudo apt update

  • sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https

  • sudo apt-add-repository ppa:ondrej/php

  • sudo apt update

  • 7.3年: sudo apt install -y php7.3-fpm php7.3-mysql

  • 7.4年: sudo apt install -y php7.4-fpm php7.4-mysql

  • sudo vim /etc/nginx/sites-available/<Ваш домен>

基本设置:

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name <Ваш домен или IP>;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ .php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        }

        location ~ /.ht {
                deny all;
        }
}

仅适用于 Laravel 的 HTTP 设置:

server {
    listen 80;
    listen [::]:80;

    root /var/www/html/<Имя проекта>/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name <Ваш домен или IP>;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
        deny all;
    }
}

Laravel 的 HTTPS 设置:

server {
    listen 80;
    listen [::]:80;

    server_name <Ваш домен> www.<Ваш домен>;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name <Ваш домен> www.<Ваш домен>;
    root /var/www/html/<Имя проекта>/public;

    ssl_certificate /etc/letsencrypt/live/<Ваш домен>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<Ваш домен>/privkey.pem;

    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php index.html index.htm index.nginx-debian.html;

    charset utf-8;

    location / {
            try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
            deny all;
    }

    location ~ /.well-known {
            allow all;
    }
}

  • sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • sudo unlink /etc/nginx/sites-enabled/default
  • sudo nginx -t
  • sudo systemctl reload nginx

Laravel

  • 7.3年: sudo apt install -y php7.3-mbstring php7.3-xml composer unzip

  • 7.4年: sudo apt install -y php7.4-mbstring php7.4-xml composer unzip

  • mysql -u root -p

  • CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • sudo mkdir -p <Имя проекта>

  • sudo chown laravel:laravel <Имя проекта>

  • cd ./<Имя проекта>

  • git clone <ссылка на проект> . / git clone -b <имя ветки> --single-branch <ссылка на проект> .

  • composer install

  • vim .env

APP_NAME=Laravel
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://<Ваш домен>

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=<Ваш пароль от MySQL>

  • php artisan migrate

  • php artisan key:generate

  • sudo chown -R $USER:www-data storage

  • sudo chown -R $USER:www-data bootstrap/cache

  • chmod -R 775 storage

  • chmod -R 775 bootstrap/cache

HTTPS

  • sudo add-apt-repository ppa:certbot/certbot

  • sudo apt install -y python-certbot-nginx

  • sudo certbot certonly --webroot --webroot-path=/var/www/html/<Имя проекта>/public -d <Ваш домен> -d www.<Ваш домен>

  • sudo nginx -t

  • sudo ufw allow 'Nginx HTTPS'

  • sudo ufw status

  • sudo systemctl reload nginx

在 DigitalOcean 上创建 Droplet 并注册新的 SSH 密钥

我坚信您会自己弄清楚如何在 DigitalOcean 注册。 这并不容易,有很多验证和其他事情。 如果您在使用文档验证时不断出现网络错误,请尝试通过 VPN 进行所有操作,这应该会有所帮助。

在顶部的菜单中,单击 创建->液滴... 我们选择 Ubuntu.

注册后,您的帐户将收到 100 美元。 但别被愚弄了。 你只有 60 天的时间来度过。 而且这个数量非常少。 您可能像我一样想要使用更昂贵的计划,以便稍后当真正的资金开始流动时,您可以切换到更便宜的计划。 我会立即告诉你这是行不通的。 你可以增加它,但你不能减少它。 就这样。 我选择 普通->$5.

我选择离我们最近的地区 法兰克福. VPC 网络->默认-fra1

我们将立即通过 SSH 执行身份验证。 点击 新的 SSH 密钥。 如果您没有 SSH,右侧有非常简单的说明。 打开 bash 终端并粘贴 ssh-keygen。 然后我们用公钥去文件 /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (或简单地说 cat ~/.ssh/id_rsa.pub),复制内容并将其粘贴到左侧窗口中。 任何名字。

我们为 Droplet 设计了一个主机名。

点击这里 创建水滴

创建一个新用户

  • ssh root@[IP-адрес вашего дроплета]
  • 您确定要继续连接吗(是/否/[指纹])? yes
  • 输入您的 SSH 密码
  • 创建用户 laravel: adduser laravel
  • 输入您的密码和其他信息(我只输入全名)
  • 将用户添加到 sudo 组: usermod -aG sudo laravel

新用户的 SSH

  • 切换到新用户: su laravel

我们代表 Laravel 用户进一步执行所有操作,直到文章结束。 因此,如果您突然中断,请重新登录并输入 su laravel

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys

我们在 Vim 中打开该文件。 如果你完全不熟悉,你可以在 Nano 工作,你没错.

最基本的 Vim 命令

为了在整篇文章中使用 Vim 编辑器,您只需要了解以下内容。

  • Vim 有不同的模式: 正常模式,您可以在其中输入命令并选择模式等。
  • 要退出任何模式并返回正常模式,只需按 Esc
  • 四处移动:您可以只使用箭头
  • 退出而不保存 <Normal mode>: :q!
  • 退出并保存 <Normal mode>: :wq
  • 切换到文本输入模式 <Normal mode>: i (来自英语。 )
  • 我们插入我们的公钥(我们上面做的)
  • 我们防止变化: chmod 600 ~/.ssh/authorized_keys

安装防火墙

  • 让我们看看所有可用的设置: sudo ufw app list
  • 允许 OpenSSH(否则它会锁定我们): sudo ufw allow OpenSSH
  • 让我们启动防火墙: sudo ufw enable, y
  • 检查: sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

没关系。

安装 Nginx

在安装过程中有时会询问“您确定吗?” 回答 y (好吧,只有当你确定的时候)。

  • sudo apt update
  • sudo apt install nginx

将 Nginx 添加到防火墙设置

  • sudo ufw app list
  • sudo ufw allow 'Nginx HTTP'
  • sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

转到您的 IP。 如果一切顺利,您应该会看到以下内容。

在 Ubuntu 和 Nginx 上将应用程序部署到 Laravel 7

安装MySQL

  • sudo apt install mysql-server
  • 启动自动保护脚本 sudo mysql_secure_installation

回答所提出的问题。 如果您不知道如何回答,这里有一些建议的选项:

  • 验证密码插件 - N

  • 删除匿名用户? — Y

  • 禁止远程root登录? — N

  • 删除测试数据库并访问它? — N

  • 现在重新加载权限表? — Y

  • 我们去MySQL: sudo mysql

  • 我们看一下访问方法: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • 设置root密码: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';

  • 我们再看看访问方法: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • 应用更改并退出 MySQL: FLUSH PRIVILEGES; и exit

  • 现在,要登录 MySQL,您需要使用 mysql -u root -p 并输入密码

安装PHP

让我们使用第三方存储库 昂德里·苏里

  • sudo apt update
  • sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https
  • sudo apt-add-repository ppa:ondrej/php
  • sudo apt update

现在我们来选择一下。 对于 Laravel 7,您可以选择 PHP 7.3 或 7.4。 唯一的区别在于数字 3 和 4。

  • 7.3年: sudo apt install -y php7.3-fpm php7.3-mysql
  • 7.4年: sudo apt install -y php7.4-fpm php7.4-mysql

PHP FastCGI 进程管理器 (fpm) 可处理 PHP 请求。 mysql,当然是为了使用MySQL。

从现在开始我将在7.4上做所有事情。

设置 Nginx

  • sudo vim /etc/nginx/sites-available/<Ваш домен>

输入域而不是“<您的域>”(例如, mysite.ru)您将来想使用的。 如果您还没有,请编写一个,然后在选择您的域时重复本章中的步骤。

输入以下内容:

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name <Ваш домен или IP>;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ .php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        }

        location ~ /.ht {
                deny all;
        }
}

如果您选择版本 7.3 php7.4-fpm.sock 写进 php7.4-fpm.sock.

监听80端口 server_name当我们到达根请求时 /var/www/html 获取索引文件。 如果之后 server_name 有东西,我们正在寻找这样的文件。 如果我们没有找到它,我们就会抛出 404。如果它以 .php, 跑过,匆匆处理 fpm。 如果有的话 .ht,禁止(403)。

  • 建立链接自 sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • 删除链接至 default: sudo unlink /etc/nginx/sites-enabled/default
  • 检查错误: sudo nginx -t
  • 重启: sudo systemctl reload nginx

检查工作:

  • sudo vim /var/www/html/info.php
  • 我们写: <?php phpinfo();
  • 继续前进 <Ваш IP>/info.php

你应该看到这样的东西:

在 Ubuntu 和 Nginx 上将应用程序部署到 Laravel 7

现在可以删除该文件: sudo rm /var/www/html/info.php

安装 Laravel

  • 7.3年: sudo apt install php7.3-mbstring php7.3-xml composer unzip

  • 7.4年: sudo apt install php7.4-mbstring php7.4-xml composer unzip

  • 我们去MySQL: mysql -u root -p

  • 创建一个数据库,名称为 laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • 我们提供 root 访问权限 laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • 为项目创建一个文件夹: sudo mkdir -p <Имя проекта>

  • 我们为用户提供 laravel 项目权利: sudo chown laravel:laravel <Имя проекта>

接下来您需要转移项目。 例如,从 Github 克隆。

  • cd ./<Имя проекта>
  • git clone <ссылка на проект> .

值得考虑的是,如果您没有保存静态文件(例如,来自 /public)在Github上,那么你自然不会有它们。 例如,我创建了一个单独的线程来解决这个问题 deploy,我已经从中克隆了: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • 安装依赖项: composer install
  • 创建.env: vim .env

它的基本版本如下所示:

APP_NAME=Laravel
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://<Ваш домен>

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=<Ваш пароль от MySQL>

如果复制 .env,请将 APP_ENV 替换为 Production,将 APP_DEBUG 替换为 false,并输入正确的 MySQL 设置。

  • 迁移数据库: php artisan migrate
  • 生成代码: php artisan key:generate

更改权限:

  • sudo chown -R $USER:www-data storage
  • sudo chown -R $USER:www-data bootstrap/cache
  • chmod -R 775 storage
  • chmod -R 775 bootstrap/cache

最后剩下的事情是为 Laravel 重新配置 Nginx:

sudo vim /etc/nginx/sites-available/<Ваш домен>

server {
    listen 80;
    listen [::]:80;

    root /var/www/html/<Имя проекта>/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name <Ваш домен или IP>;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
        deny all;
    }
}

和上次一样,如果您选择版本 7.3 php7.4-fpm.sock 写进 php7.4-fpm.sock.

在 DigitalOcean 上设置域

一切其实都很简单。 您购买域名(任何地方),切换到 DigitalOcean 创建->域名/DNS... 在现场 添加域名 您输入该域并单击“添加”。 然后转到域设置和字段 主机名 进入 @。 选择一个项目并单击 创建记录.
现在转到您购买域名的网站,在那里找到“DNS 服务器”(或类似的东西)并输入 DigitalOcean 服务器(即 ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com)。 现在您需要等待一段时间(或一段时间),直到这些设置被接受。 准备好!
唯一的问题是您的站点只能以 HTTP 方式打开。 要使用 HTTPS,请继续下一部分。

设置 HTTPS

安装 certbot 并向其传递域名(格式 mysite.ru) 和带有 www (www.mysite.ru).

  • sudo add-apt-repository ppa:certbot/certbot
  • sudo apt install python-certbot-nginx
  • sudo certbot certonly --webroot --webroot-path=/var/www/html/<Имя проекта>/public -d <Ваш домен> -d www.<Ваш домен>

现在您需要重新配置 Nginx(不要忘记替换您的值):

server {
    listen 80;
    listen [::]:80;

    server_name <Ваш домен> www.<Ваш домен>;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name <Ваш домен> www.<Ваш домен>;
    root /var/www/html/<Имя проекта>/public;

    ssl_certificate /etc/letsencrypt/live/<Ваш домен>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<Ваш домен>/privkey.pem;

    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php index.html index.htm index.nginx-debian.html;

    charset utf-8;

    location / {
            try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
            deny all;
    }

    location ~ /.well-known {
            allow all;
    }
}

我想您已经了解 PHP 7.3 需要更改哪些内容。

事实上,这里一切都很简单。 我们只需将所有请求从 HTTP(端口 80)重定向到 HTTPS(端口 443)。 我们所做的一切与以前相同,但采用了加密。

剩下的就是在防火墙中设置权限:

  • sudo nginx -t
  • sudo ufw app list
  • sudo ufw allow 'Nginx HTTPS'
  • sudo ufw status
  • sudo systemctl reload nginx

现在一切都应该正常进行。

[高级]安装Node.js

如果突然需要在服务器上直接运行npm命令,则需要安装Node.js。

  • sudo apt update
  • sudo apt install -y nodejs npm
  • nodejs -v

就这样,我就停在这个阶段了。 原则上,我对结果感到满意。 也许我会从 DigitalOcean 转向离俄罗斯更近、更便宜的地方。 但由于我已经完成了网站上的所有验证并完成了所有操作,因此我通过示例向他们展示了它们。 此外,他们的起价 100 美元是一个很好的培训跳板。

PS 特别感谢作者 这个要点,作为上述所有行动的基础。 在某些情况下,它不适用于 Laravel 7,我修复了它。

PPS 如果您碰巧是一位用 bash 命令思考的顶级工程师,请不要严厉评判。 你可能会觉得这篇文章水平很低,但当我需要的时候我会很高兴找到一篇。 如果有改进的建议,我完全赞成。

来源: habr.com

添加评论