Настройка веб-сервера

Периодически приходится создавать новые серваки, поэтому записал небольшую шпаргалку из часто используемых команд.

Дисклеймер: я не несу ответственности, если вы ввели команды с этого сайта, и всё сломалось.

Информация актуальна на январь 2024.

Содержание

Обновление системы

Обновим репозитории и проапгрейдимся

apt-get update && apt-get upgrade

Установка основных пакетов, которые ну полюбасу пригодятся

apt-get install -y sudo mc curl gnupg2 ca-certificates lsb-release apt-transport-https git htop bsdmainutils

Установим имя сервера

hostnamectl set-hostname pentagon

Пропишем его в hosts

mcedit /etc/hosts
127.0.0.1 pentagon

Настройка ssh ключей

Сгенерируем ключ для входа без пароля

ssh-keygen -t ssh-ed25519 -f ~/.ssh/id_rsa && cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && cat ~/.ssh/id_rsa

Если второй юзер уже добавлен, и находится в группе sudo, можно отключить вход для рута

mcedit /etc/ssh/sshd_config
PermitRootLogin no

Проверим, что вход по публичному ключу разрешён:

PubkeyAuthentication yes

Чекним синтаксис

sshd -t

Перезапустим сервис

service sshd restart

Управление пользователями

Создание пользователя

NEWUSER=blog && useradd -d /home/$NEWUSER -m -s /bin/bash $NEWUSER \
&& usermod -a -G $NEWUSER $NEWUSER \
&& passwd $NEWUSER

Случайный пароль:

Сгенерируем ключ для входа без пароля (уже под созданным юзером, через su)

ssh-keygen -t ssh-ed25519 -f ~/.ssh/id_rsa && cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && cat ~/.ssh/id_rsa

Работа с SSH-ключами

Добавить юзера в группу sudo

usermod -a -G sudo blog

Удалить пользователя

userdel blog

Bash: поиск по истории через up/down

echo -e '"\e[B": history-search-forward\n"\e[A": history-search-backward' > ~/.inputrc

Установка NginX 1.26.0

Добавим репозиторий

echo "deb https://nginx.org/packages/debian/ `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list

Проверяем версию

apt update && apt-cache policy nginx

Импортируем официальный ключ, используемый apt для проверки подлинности пакетов:

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys KEY_FROM ERROR

Устанавливаем NginX

apt-get update && apt-get install -y nginx

Запускаем:

service nginx start

Теперь по адресу сервера должна отображаться стартовая страница NginX.

Настройка NginX

Дефолтный конфиг NginX находится по адресу:

mcedit /etc/nginx/conf.d/default.conf

Для того, чтобы работал PHP заменяем его на это:

server {
  listen 80;
  server_name _;
  root /var/www/default;
  charset utf8;
  index index.html;
  location / {
      try_files $uri $uri/ =404;
  }
}
server {
  listen 80;
  server_name _;
  root /var/www/default/public;

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

  index index.php;

  charset utf-8;

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

  location = /favicon.ico { access_log off; log_not_found off; }
  location = /robots.txt  { access_log off; log_not_found off; }

  error_page 404 /index.php;

  location ~ \.php$ {
      fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
      fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
      include fastcgi_params;
  }

  location ~ /\.(?!well-known).* {
      deny all;
  }
}
server {
  listen 80;
  server_name _;

  location / {
      proxy_pass http://localhost:3000;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Real-IP $remote_addr;
  }
}

Для более удобной настройки можно добавить следующий файл:

mcedit /etc/php/7.4/fpm/pool.d/cvp.su.conf
[cvp.su]

listen = /run/php/cvp.su.sock
listen.mode = 0666

user = blog
group = blog

pm = dynamic
pm.max_children = 380
pm.start_servers = 20
pm.min_spare_servers = 16
pm.max_spare_servers = 32
pm.max_requests = 800

chdir = /var/www/cvp.su/

php_admin_value[open_basedir] = /var/www/cvp.su/
php_admin_value[upload_tmp_dir] = /var/www/cvp.su/storage/app/public/
php_admin_value[date.timezone] = Europe/Moscow

php_admin_value[memory_limit] = 4G
php_admin_value[upload_max_filesize] = 150M
php_admin_value[post_max_size] = 150M

И обновить в файле настроек nginx строку `fastcgi_pass`:

fastcgi_pass unix:/run/php/cvp.su.sock;

Перезапускаем сервис:

service php7.4-fpm restart

Для более удобной настройки можно добавить следующий файл:

mcedit /etc/php/8.2/fpm/pool.d/cvp.su.conf
[cvp.su]

listen = /run/php/cvp.su.sock
listen.mode = 0666

user = blog
group = blog

pm = dynamic
pm.max_children = 380
pm.start_servers = 20
pm.min_spare_servers = 16
pm.max_spare_servers = 32
pm.max_requests = 800

chdir = /var/www/cvp.su/

php_admin_value[open_basedir] = /var/www/cvp.su/
php_admin_value[upload_tmp_dir] = /var/www/cvp.su/storage/app/public/
php_admin_value[date.timezone] = Europe/Moscow

php_admin_value[memory_limit] = 4G
php_admin_value[upload_max_filesize] = 150M
php_admin_value[post_max_size] = 150M

И обновить в файле настроек nginx строку `fastcgi_pass`:

fastcgi_pass unix:/run/php/cvp.su.sock;

Перезапускаем сервис:

service php8.2-fpm restart

Для более удобной настройки можно добавить следующий файл:

mcedit /etc/php/8.3/fpm/pool.d/cvp.su.conf
[cvp.su]

listen = /run/php/cvp.su.sock
listen.mode = 0666

user = blog
group = blog

pm = dynamic
pm.max_children = 380
pm.start_servers = 20
pm.min_spare_servers = 16
pm.max_spare_servers = 32
pm.max_requests = 800

chdir = /var/www/cvp.su/

php_admin_value[open_basedir] = /var/www/cvp.su/
php_admin_value[upload_tmp_dir] = /var/www/cvp.su/storage/app/public/
php_admin_value[date.timezone] = Europe/Moscow

php_admin_value[memory_limit] = 4G
php_admin_value[upload_max_filesize] = 150M
php_admin_value[post_max_size] = 150M

И обновить в файле настроек nginx строку `fastcgi_pass`:

fastcgi_pass unix:/run/php/cvp.su.sock;

Перезапускаем сервис:

service php8.3-fpm restart

Для сжатия данных при передаче можно создать файлик ```mcedit /etc/nginx/conf.d/gzip_append``` и инклюдить его в основной файл конфига ```include conf.d/gzip_append;```

gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_proxied any;
gzip_buffers 16 8k;
gzip_types
  text/plain
  text/css
  text/js
  text/xml
  text/javascript
  application/javascript
  application/x-javascript
  application/json
  application/xml
  application/rss+xml
  image/svg+xml/javascript;
gzip_vary on;
location ~* ^.+\.(jpg|jpeg|gif|png|ico|webp)$ {
  expires 30d; # кешируем у клиента на 30 дней
}

location ~* ^.+\.(css|js)$ {
  expires 1d; # кешируем у клиента на 1 день
}
fastcgi_cache_path /var/nginx_cache levels=1:2 keys_zone=nginx_cache:100m max_size=10g inactive=10m use_temp_path=off;
server {
  location ~ \.php$ {
    # Настройка уникального ключа кэша на основе запроса с GET - параметрами
    fastcgi_cache_key "$scheme$request_method$host$request_uri$is_args$args";
    fastcgi_cache nginx_cache;
    fastcgi_cache_valid 200 301 302 30m;
    fastcgi_cache_valid 404 1m;
    add_header X-Cache $upstream_cache_status;

Soon

Перезапускаем nginx:

service nginx restart

SSL на сайте

Установим сертбот:

apt-get install -y python3-certbot-nginx

Установим сертификат на домен:

certbot --nginx -d example.com

Чтобы не продлять сертификаты руками можно добавить в крон запись:

43 6 1 * * certbot renew

Установка PHP

Добавляем репозиторий

 echo "deb https://packages.sury.org/php/ `lsb_release -cs` main" | tee /etc/apt/sources.list.d/php.list
 echo "deb https://debian.octopuce.fr/sury-php/ `lsb_release -cs` main" | tee /etc/apt/sources.list.d/php.list

Забираем ключ репозитория:

 wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg

Обновляемся и проверяем версию кандидата:

apt-get update && apt-cache policy php

Устанавливаем fpm версию и дополнительные пакеты:

apt install -y php7.4-fpm php7.4-curl php7.4-gd php7.4-mysql php7.4-mbstring php7.4-xml php7.4-zip php7.4-intl php7.4-gmp php7.4-xdebug

Проверяем:

service php7.4-fpm status

Теперь нужно настроить fpm

mcedit /etc/php/7.4/fpm/pool.d/www.conf

Меняем пользователя www-data на nginx

sed -i 's/www-data/nginx/' /etc/php/7.4/fpm/pool.d/www.conf

Уберём потенциальную дыру в безопасности:

sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/7.4/fpm/php.ini

Перезапускаемся:

service php7.4-fpm restart

Для переключения между консольными версиями PHP:

update-alternatives --set php /usr/bin/php7.4

Устанавливаем fpm версию и дополнительные пакеты:

apt install -y php8.1-fpm php8.1-curl php8.1-gd php8.1-mysql php8.1-mbstring php8.1-xml php8.1-zip php8.1-intl php8.1-gmp php8.1-xdebug

Проверяем:

service php8.1-fpm status

Теперь нужно настроить fpm

mcedit /etc/php/8.1/fpm/pool.d/www.conf

Меняем пользователя www-data на nginx

sed -i 's/www-data/nginx/' /etc/php/8.1/fpm/pool.d/www.conf

Уберём потенциальную дыру в безопасности:

sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/8.1/fpm/php.ini

Перезапускаемся:

service php8.1-fpm restart

Для переключения между консольными версиями PHP:

update-alternatives --set php /usr/bin/php8.1

Устанавливаем fpm версию и дополнительные пакеты:

apt install -y php8.2-fpm php8.2-curl php8.2-gd php8.2-mysql php8.2-mbstring php8.2-xml php8.2-zip php8.2-intl php8.2-gmp php8.2-xdebug

Проверяем:

service php8.2-fpm status

Теперь нужно настроить fpm

mcedit /etc/php/8.2/fpm/pool.d/www.conf

Меняем пользователя www-data на nginx

sed -i 's/www-data/nginx/' /etc/php/8.2/fpm/pool.d/www.conf

Уберём потенциальную дыру в безопасности:

sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/8.2/fpm/php.ini

Перезапускаемся:

service php8.2-fpm restart

Для переключения между консольными версиями PHP:

update-alternatives --set php /usr/bin/php8.2

Устанавливаем fpm версию и дополнительные пакеты:

apt install -y php8.3-fpm php8.3-curl php8.3-gd php8.3-mysql php8.3-mbstring php8.3-xml php8.3-zip php8.3-intl php8.3-gmp php8.3-xdebug

Проверяем:

service php8.3-fpm status

Теперь нужно настроить fpm

mcedit /etc/php/8.3/fpm/pool.d/www.conf

Меняем пользователя www-data на nginx

sed -i 's/www-data/nginx/' /etc/php/8.3/fpm/pool.d/www.conf

Уберём потенциальную дыру в безопасности:

sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/8.3/fpm/php.ini

Перезапускаемся:

service php8.3-fpm restart

Для переключения между консольными версиями PHP:

update-alternatives --set php /usr/bin/php8.3

MySQL 8.0

Забираем MySQL APT репозиторий

wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.30-1_all.deb && dpkg -i mysql-apt-config_0.8.30-1_all.deb && rm mysql-apt-config_0.8.30-1_all.deb

Обновляемся и проверяем версию кандидата:

apt-get update && apt-cache policy mysql-server

Если ругается - импортируем официальный ключ, используемый apt для проверки подлинности пакетов:

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys KEY_FROM ERROR

Устанавливаем:

apt install -y mysql-server

Случайный пароль:

PhpMyAdmin

Забираем архив

wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip && mv phpMyAdmin-5.2.1-all-languages.zip pma.zip

Распакуем

unzip pma.zip && rm pma.zip && mv phpMyAdmin-5.2.1-all-languages pma

Настраиваем

cd pma && cp config.sample.inc.php config.inc.php && mcedit config.inc.php

Устанавливаем blowfish фразу

sed -i 's/$cfg['blowfish_secret'] = '';/$cfg['blowfish_secret'] = '';/' config.inc.php

Composer

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php && php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer

NodeJS

mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list

Обновляемся и проверяем версию кандидата:

apt-get update && apt-cache policy nodejs

Устанавливаем:

apt install -y nodejs

OpenVPN

cd ~ && curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh && chmod +x openvpn-install.sh && ./openvpn-install.sh

Чтобы добавить клиент, запустить скрипт ещё раз:

./openvpn-install.sh

Проброс портов для реверс-прокси

OpenVPN client

Импортируем официальный ключ для проверки подлинности пакетов:

sudo mkdir -p /etc/apt/keyrings && curl -fsSL https://packages.openvpn.net/packages-repo.gpg | sudo tee /etc/apt/keyrings/openvpn.asc

Добавим репозиторий

echo "deb [signed-by=/etc/apt/keyrings/openvpn.asc] https://packages.openvpn.net/openvpn3/debian `lsb_release -cs` main" | sudo tee /etc/apt/sources.list.d/openvpn-packages.list

Проверяем версию

apt update && apt-cache policy openvpn3

Устанавливаем openvpn3

apt install -y openvpn3

Подключиться к серверу

openvpn3 session-start --config client.ovpn

Отключиться от сервера

openvpn3 session-manage --config client.ovpn --disconnect

Samba

Чтобы подключать папки с сервера как сетевые диски, можно использовать samba

apt-get install samba

Добавим новую shared - папку

mkdir ~/shared

Настроим конфиг:

mcedit /etc/samba/smb.conf

Добавим новый блок, где YOURUSER - ваш пользователь

[Files]
comment = A new share
path = /home/YOURUSER/share
browseable = yes
read only = no
guest ok = no
valid users = YOURUSER

Перезагружаемся

servive smbd restart 

Добавляем samba-пароль нашему пользователю:

smbpasswd -a YOURUSER

Всё, теперь можно идти по адресу \\YOUR_IP\Files

Дополнительно

При импорте большого SQL файла я столкнулся с проблемой mysql server has gone away. Ну ушёл и ушёл, я то тут причём? Решается добавлением в конфиг следующих строчек:

mcedit /etc/mysql/my.cnf
[mysqld]
wait_timeout=28800
interactive_timeout=28800
max_allowed_packet=4G

Добавить в гит информацию о юзере

git config --global user.name "Vadim N."
git config --global user.email "spam@vard.su"

Установка wordpress

cd /var/www && wget https://wordpress.org/latest.zip && unzip latest.zip
mv wordpress site
cd site
mkdir wp-content/uploads
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
chmod -R 775 wp-content/uploads
chmod 664 wp-config.php