Nginx
February 20, 2023

Установка LEMP стека в YC

LEMP стек - это набор сервисов, состоящий из шести программ: Linux, Nginx, MySQL, PHP, php-fpm, PhpMyAdmin. Данный стек применяется для работы с сайтами.

Установим последовательно все компоненты. Поехади!

SA у нас уже готов: https://teletype.in/@cameda/w93lPMPQWS4
Выберем зону доступности А: https://teletype.in/@cameda/S34zdiTcbUM
Сеть и подсети создали ранее: https://teletype.in/@cameda/ZbTkF70KWK9
SG будем использовать со стандартными открытыми портами: https://teletype.in/@cameda/WIoqKmpMNLM

export SG=$(yc vpc sg get cam-default --format=json | jq -r '.id')
export FOLDER_ID=$(yc config get folder-id)
export ZONE=ru-central1-a
export SUBNET_ID=$(yc vpc subnet get subnet-a --format json | jq -r '.id')
export SA=$(yc iam service-account get cam-instance-sa --format json | jq -r '.id')

Создадим скрипт для cloud-init:

#cloud-config
  version: v1
  package_update: true
  package_upgrade: true
  write_files:
   - encoding: b64
     content: VGVzc3R0dC4uLg==
     owner: root:root
     path: /opt/test
     permissions: '0644'
  packages:
  - git
  - htop
  - mc
  - tree
  - make
  - iftop
  - iotop
  - dstat
  - gcc
  - gdb
  datasource:
   Ec2:
    strict_id: false
  users:
  - default
  - name: cameda
    gecos: Alexey Volkov
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    lock_passwd: false
    passwd: $6$rounds=4096$WhW2cxlj/QX90$Jic1yPwlpiWV98oX8akplpOX4e7pgJlWHCfKAyPiMf7xP1AqI7iocN/gjWQNX9WuIUf14LVgxJluajfOInk.u.
    ssh_authorized_keys:
      - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDI98mJDBN9cnp6HOdBYTQILeAhUSDvDfoqA9iLmVPDyPLFRWs7tE4BjCAcFD6a3M50QIboCaohfa7h+PWksYibab7I3QHOR7y9pCW8FGonGRw2ACvt906qlaWHFj7jWOxuihFoiRROKqLCW5YE/Yc4XFIvW1gu3JQdvQ1wemWvujsI8EHE6PI1pEg7/41y6kn3IhNHIr8WRLe4dPyPGjwc4LpBCcaRSJiX4YjVXynSIHNk365UrL+nGv8ix7bW5FNCgGqSgfUTVCfMYLzQ/gYHPVQrcIvCeHjkwluH8Z3gXeN3OliejBjpLi+IWIzd9K6UADSUNU8oL+9941tDidp8APoe7RbB4h3bY6k8Bhy0yxohgQS2OWSYd1mjeEx8Ba5wzJKqfpUgmcPdrBJnBwLgLMFQyEfYG6vTPkYWAKEvkkJ6ZiA4tdoQvCb+B0xJV/ivHyLtoi3LFE59mbQFDUy8O51vX9JjBDLwzyTEeslWp7uOP66Ti5Q5ucNXbs5yXTU= cameda@cameda-osx"

Резервируем IP:

yc vpc address create \
   --folder-id $FOLDER_ID \
   --name lemp-ip \
   --description "LEMP IP" \
   --external-ipv4 zone=$ZONE \
   --labels work=lemp \
   --async

Создадим ВМ с Ubuntu 20.04:

export IP=$(yc vpc address get lemp-ip --format=json | jq -r ".external_ipv4_address" | jq -r ".address")
yc compute instance create \
--folder-id $FOLDER_ID \
--name cam-lemp \
--description "LEMP" \
--hostname cam-lemp \
--zone $ZONE \
--labels work=lemp \
--platform standard-v3 \
--create-boot-disk image-family=ubuntu-2004-lts,size=60,type=network-ssd,block-size=8K \
--image-folder-id standard-images \
--memory 4 \
--cores 2 \
--core-fraction 100 \
--network-settings type=standard \
--network-interface subnet-id=$SUBNET_ID,nat-ip-version=ipv4,nat-address=$IP,security-group-ids=$SG \
--metadata serial-port-enable=1 \
--metadata-from-file='user-data=cloud-init.yaml' \
--service-account-id $SA \
--async
login: cameda
password: Pa$w0rd

Подключимся к ВМ:

ssh cameda@$IP
sudo -i
ping ya.ru - проверим что корректно работает DNS.
apt -y update && apt -y upgrade
hostnamectl - проверим, что версия ОС и имя ВМ корректны.

Установим Nginx:

apt -y install nginx
nginx -v - смотрим какая версия nginx
nginx version: nginx/1.18.0 (Ubuntu)

nginx -t - смотрим, что конфигурация верная
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

systemctl status nginx - должно быть active.
systemctl enable nginx

Проверим, что стартовая страничка открылась: http://IP

Воспользуемся доменом, который уже зарегистрировали: https://teletype.in/@cameda/editor/DtL0osUlczH

И поправим конфигурацию nginx для работы с этим доменом.

echo "" > /etc/nginx/sites-available/default
vi /etc/nginx/sites-available/default
server {
  listen 80 default_server;
  server_name cameda.ru;
  index index.html;
  access_log off;

  location / {
    root /var/www/html/cameda.ru;
  }
}

Если своего домена нет, то можно сделать так:

server {
  listen 80 default_server;
  server_name $IP;
  index index.html;
  access_log off;

  location / {
    root /var/www/html/cameda.ru;
  }
}

Здесь вместо $IP нужно будет подставить реальный адрес ВМ.
Это совсем простенькая конфигурация, говорящая о том, что надо слушать 80 порт, файл index.html находится по адресу /var/www/html/cameda.ru и редирект на эту страницу переходит при обращении к сайту по его доменному имени - cameda.ru. Или как в случае без домена по IP.

nginx -t
systemctl restart nginx

Создадим директорию для сайта:

mkdir -p /var/www/html/cameda.ru
touch index.html
echo "Hello, Cameda" > /var/www/html/cameda.ru/index.html

curl cameda.ru
Hello, Cameda!

curl $IP
Hello, Cameda!

Nginx установлен и работает.

Установим MySQL.

apt -y install mysql-server mysql-client
systemctl enable mysql
mysql -V
mysql  Ver 8.0.30-0ubuntu0.20.04.2 for Linux on x86_64 ((Ubuntu))
mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'Pa$word';
quit
mysql_secure_installation
Pa$word
Меняем пароль на свой любимый.
Далее везде "у".
mysql -u root -p
CREATE DATABASE camDB;
CREATE USER 'cameda'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON camDB.* TO 'cameda'@'localhost';
FLUSH PRIVILEGES;
SELECT user,host FROM mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| cameda           | localhost |
| debian-sys-maint | localhost |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| camDB              |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
quit

MySQL установлен и работает.

Установим PHP 8.1 + php-fpm:

apt -y install php8.1-fpm php8.1-mysqlnd php8.1-gd php8.1-curl php8.1-opcache php8.1-cli php8.1-readline php8.1-mbstring
php -v
systemctl status php8.1-fpm
vi /etc/php/8.1/fpm/pool.d/www.conf - конфигурация php-fpm

Обновим кокфигурацию Nginx для работы с php:

server {
  listen 80 default_server;
  server_name cameda.ru;
  root /var/www/html/cameda.ru;
  access_log off;

  location / {
    index index.php index.html;
  }
  
  ######## PHP section unix socket #################
  location ~ \.php$ {
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;
  }
  
  ######## PHP section tcp socket #################
#  location ~ \.php$ {
#    fastcgi_pass 127.0.0.1:8080;
#    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#    include fastcgi_params;
#    include snippets/fastcgi-php.conf;
#  }
  
  location ~ /\.ht {
    deny all;
  }
}
nginx -t
systemctl reload nginx
chown -R www-data:www-data /var/www/html/cameda.ru
chmod -R 755 /var/www/html/cameda.ru
mv /var/www/html/cameda.ru/index.html /var/www/html/cameda.ru/index.php
echo "" > /var/www/html/cameda.ru/index.php
vi /var/www/html/cameda.ru/index.php
<?php phpinfo(); ?>
php /var/www/html/cameda.ru/index.php
curl http://cameda.ru/index.php

Php и php-fpm установлены и работают.

Установим PhpMyAdmin.

PhpMyAdmin - это веб интерфейс для работы с MySQL.

apt -y install phpmyadmin
Во время установки нужно будет выбрать название базы, в которой будут храниться данные phpmyadmin;
пользователя, который будет работать с базой и пароль для входа.
chown -R www-data:www-data /usr/share/phpmyadmin
chmod -R 755 /usr/share/phpmyadmin
ln -s /usr/share/phpmyadmin /var/www/html/cameda.ru/phpmyadmin
http:/cameda.ru/phpmyadmin