我決定使用 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.
我選擇離我們最近的地區 法蘭克福. 專有網絡網絡->預設-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 命令思考的頂級工程師,請不要嚴厲評判。 你可能會覺得這篇文章水平很低,但當我需要的時候我會很高興找到一篇。 如果有改進的建議,我完全贊成。
來源: www.habr.com