我决定使用 Laravel 7 制作我的作品集。这样主页将成为登陆页面,并且可以使用管理面板更改其上的所有信息。 不是重点。 到了部署阶段。 我发现了一些关于如何在成熟的服务器上完成此操作的好教程,但遇到了所有的麻烦。 我在部署方面不是很强;我通常比全栈更靠前。 而且,如果我仍然可以用 PHP 编写和测试,那么在管理服务器之前等等。 我还没有长大。 但我必须弄清楚。
现在我们将完成所有步骤,从通过 SSH 启动到工作站点结束。 我们将尽力避免所有陷阱。
您也许可以在网上找到类似的说明。 毕竟我终于找到了。 确实,不是在一个地方,没有 StackOverflow 的帮助,而且几乎没有俄语。 我吃了苦。 这就是为什么我决定简化你的生活。
我们将用 DigitalOcean 上的 Droplet 来完成一切。 当然,这不是必需的;选择任何托管。 当您到达 Ubuntu 上的工作服务器时,请返回。 对于那些仍然决定在 DigitalOcean 上进行操作的人,将会有更多有关设置域的提示。 和
所有 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。 如果一切顺利,您应该会看到以下内容。
安装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
你应该看到这样的东西:
现在可以删除该文件: 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 特别感谢作者
PPS 如果您碰巧是一位用 bash 命令思考的顶级工程师,请不要严厉评判。 你可能会觉得这篇文章水平很低,但当我需要的时候我会很高兴找到一篇。 如果有改进的建议,我完全赞成。
来源: habr.com