Вопросы по web-серверу

Привет все и вся :slight_smile:
Колдую вот с правами и владельцем, не пойму как правильно сделать. Делаю сервер на Дебиане. По разным статьям насобирал инфы.
Хочу уточнить что и как делать правильно. В принципе сервер работает и сайт крутится, но возникают проблемы с правами.

Итак, имеем:

  • есть сервер
  • есть один юзер /home/igor
  • есть два сайта - s1 и s2, то есть
    /var/www/html/s1
    /var/www/html/s2
  • есть 2 БД
  • есть 2 пользователя БД

По найденной инфе сделал:
mkdir -p /var/www/html/s1
chown igor:igor /var/www/html/s1
chown -R igor:www-data /var/www/html/s1
chmod 755 /var/www/html/s1

Ну базу я так создал:
CREATE DATABASE lp CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON lp.* TO ‘lpl’@‘localhost’ IDENTIFIED BY ‘1234’ WITH GRANT OPTION;

Возникли вопросы:

  • надо ли ещё создавать пользователей? Например /home/s1
  • правильно ли указан владелец chown igor:igor /var/www/html/s1
  • и тут не уверен chown -R igor:www-data /var/www/html/s1

Я потом Марию поменяю на Постгрес.

Какие?

Надо если надо для каких-то целей :slight_smile:

Отдельный пользователь для например веб-сервера нужен для некоторого улучшения безопасности: чтобы если будет найдена какая-то уязвимость в веб-сервере, то у злоумышленника не будет возможности выполнять команды от рута и он не сможет полностью захватить сервер.

Сейчас Docker модно использовать, это упрощает многое.
Тут разные полезные материалы по этой теме:
Re: Где найти хороший источник по установке и конфигурации LAMP?

Большое спасибо. Да, тогда буду делать отдельного юзера для каждого сайта. К ftp это тоже относится? Я тут пока не вник что к чему, но догадываюсь что тут тоже надо делать отдельных юзеров.

Про права доступа… Ну например иногда не могу в Filezila поменять 755 на 777, приходится лезть в консоль и вручную вбивать путь и указывать права. Иногда шаманю через домашнюю папку, закачиваю туда cms, а потом в нужную папку кидаю. Кароче, каша-малаша )

Про docker - погляжу что это такое. Но постоянно вижу как одна статья бродит по всем блогам, и всем похрен, что статья написана ботаником, и такие же ботаники массово копируют ошибки. Меня как-то заинтересовал перенос БД на другое место. Делаю как написано, проверяю, и хана. Долго не мог понять в чем прикол. А оказалось что написано с ошибкой - вместо /var/lib/mysql было написано /var/lib/mysql/mysql (два раза mysql).

А владелец правильно указан? То есть игорьдвоеточиеввв?

Я говорил о том, что сам процесс веб-сервера (apache httpd, nginx, …) должен работать не из под рута. Но это вроде бы так по умолчанию обычно и сделано.

А отдельный изолированный юзер для каждого своего сайта думаю не так важно, но при желании можно и сделать. В Апаче вроде бы как-то так: https://cloudkul.com/blog/apache-virtual-hosting-with-different-users/

А зачем он?
Файлы по SSH перекидывать можно (scp, …).
Код сайта лучше хранить в Git репозитории, редактировать локально, на сервер загружать либо например (самое простое, для начала) через git pull вручную на сервере, либо настроить, чтоб автоматически при push в определенную ветку (master, …).

https://guides.hexlet.io/git-guide/
https://guides.github.com/introduction/git-handbook/
https://docs.github.com/en/github/getting-started-with-github

Нужно пробовать с оф. документации начинать, бывает, что там и без блогов всё понятно )
Ну и сверяться с ней.
Или с каких-то известных источников.

:man_shrugging: Смотря что достичь надо.
Это установит владельцами юзера игорь и группу www-data. И еще chmod указывает какие права у юзера/группы/остальных.

Если хакер проник в систему, то его это не остановит. system(“sudo su”); и он с рутом. И всё потому, что в Линуксе права на процессы насследуются.

Этой строчкой Вы отменяет предыдущую, которая не нужна.
R - почему большая?

Это вообще не правильно.

Там нет маленькой )

chown --help

-R, --recursive operate on files and directories recursively

Для chmod кстати наверно тоже надо.

Почему? :thinking:

Что-то не понял откуда тут руту взяться.

image

Если б так было можно, то в правах не было бы никакого смысла )

Что именно не так?

Про ftp - да, можно и по ssh, но я решил потом не лазить на сервер, а сделать закачку фоток по ftp.

Поскольку я решил сделать каждому сайту своего юзера, то столкнулся с вопросом. Надо создать имя 100. Но adduser отказался делать с таким именем, предложил поменять правила. Зато useradd 100 сработало. Вот и возник вопрос - либо так оставить, хотя советуют adduser, либо покопаться в правилах, чтобы сработало adduser 100 ?

Да, как делать сервак для одного сайта понятно, а вот для нескольких сайтов уже многое умалчивается. Есть гений, который сайты на Debian 7 перенес в папку /home (типа для безопасности), не знаю не знаю…

А зачем такое странное имя?)

Это вроде бы может вызвать проблемы.
например https://unix.stackexchange.com/a/287079/360458

Some commands (eg chown ) can accept either a username or a numeric user ID, so allowing all-numeric usernames would break that.

A rule to allow names that start with a number and contain some alpha was probably considered not worth the effort; instead there is just a requirement to start with an alpha character.

А что за фотки? Откуда они и для чего на сервере?
Вручную перекидывать по фтп это ж всё равно “лазить” )
В зависимости от задачи я б поискал другие способы, автоматически синхронизировать чем-нибудь и т.д. Например Syncthing интересная и простая в использовании штука.

Это сайт японской техники на 100 вольт, потому и пришлось такое оставить, чтобы не путаться. Ах ёла )

Ммм… похоже что да. Ну как это называется тогда? Например, на сайте жму кнопку “Выбрать файл”, и кидаю на сайт с компа. В хтмл тег называется вроде бы инсерт, а вот ftp меня даже немного озадачил, но я сейчас в него не вникаю, и так обхожусь без него - кидаю по ssh.

Ну так от задачи зависит.
Но сейчас вряд ли для чего-либо есть смысл использовать FTP (точнее скорее FTPS, в FTP нет шифрования). Проще SCP/SFTP. GUI для них тоже полно: WinSCP, …

Есть только <input type="file"> )

Точно ) А я вот вспоминаю, вроде не так написал, давно не лазил в html )

Привет.
Есть такой вопрос. Я сайт скинул в папку public_html как пишут в статьях. И получилась такая хрень. То ли это вывпавится при подцеплении к домену, то ли надо ковырять настройки апача и указывать путь. Как я понял, у меня получилось типа vk.com/public_html вместо просто vk.com

Или папку public_html удалить нафиг? Может надо было делать просто /var/www/html/test? Ибо работаю с Filezilla или mc, и как-будто она лишняя как камень.

А как тут картинки вставлять? Никак что ль?

ServerName в httpd.conf какой указан?

Для примера

Пример создания виртуального хоста
При необходимости установки собственных виртуальных хостов сделайте следующее:
Откройте файл “httpd-vhosts.conf”, и создайте в нём блок, примерно, следующего содержания:
<VirtualHost *:80>
Папка, в которой будет корень вашего хоста.
DocumentRoot “C:/apache/test.ru/www”
Домен по которому вы сможете обращаться к виртуальному хосту.
ServerName test.ru
Алиас (добавочное имя) домена.
ServerAlias www.test.ru
Файл, в который будут записываться ошибки.
ErrorLog “C:/apache/test.ru/error.log”
Файл журнала доступа к хосту.
CustomLog “C:/apache/test.ru/access.log” common

Затем в каталоге “apache”, создайте папку “test.ru” (прямо так, с точкой), в которой, в свою очередь, создайте папку “www”.

Следующий шаг создания виртуального хоста – это изменение файла C:\WINDOWS\system32\drivers\etc\hosts операционной системы. Откройте данный файл и добавьте в него две строки:
127.0.0.1 test.ru
127.0.0.1 www.test.ru

Источник: Установка Apache HTTP Server

А где она лежит?

в каких?

Перетащить в поле ввода или через кнопку в середине панели. FAQ по функциональности форума

на сервере полный путь будет /var/www/html/test/public_html Вот думаю, может сайт из /var/www/html/public_html перенести в /var/www/html/ и не надо шаманить? Для первых проб вполне будет ок, а потом подправить при подцеплении домена.

Ну статьи разные, к примеру Драча или 8хост… Но повыше пример я понял, попробую перевести на линуксовый язык, то есть debian9.

Домену всё равно как папка называется.
По умолчанию да, вроде отдается из /var/www/html.
То есть mysite.com/image.jpg будет отдавать /var/www/html/image.jpg.

Если нужно отдавать несколько сайтов (доменов) из разных папок — надо настроить vhost'ы в конфиге.

1 симпатия

Навело на мысль. К примеру, я сделал два тестовых сайтах:
/var/www/html/test1/public_html
и
/var/www/html/test2 (без /public_html)
Оба варианта работают, но второй вариант в адресной строке выглядит покрасивее. Возникает вопрос - а для чего делают папку /public_html? Для безопасности? Типа эту папку прикрыть правами типа 555 или 644 или что-то типа того… В статьях не видел ответа. Сейчас порылся про эту папку, она нужна, хотя путь получается длинный. Хмм?

https://www.8host.com/blog/nastrojka-virtualnyx-xostov-apache-v-ubuntu-18-04/

Нужные каталоги можно создать при помощи команд:

sudo mkdir -p /var/www/example.com/public_html
sudo mkdir -p /var/www/test.com/public_html

Там нет /html. Ну и какого-то глубинного смысла тут тоже нет, просто такая структура папок для двух сайтов на одном сервере. В /var/www/example.com можно положить что-то еще, что не должно быть доступно пользователям сайта (.git, конфиги, скрипты вызываемые из public_html/index.php, …).

В результате виртуальный хост будет выглядеть так:

<VirtualHost *:80>
ServerAdmin admin@example.com
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Путь в DocumentRoot может быть любым другим, Апач не анализирует имена папок.

Например, вот типичный современный веб-фреймворк (не только в РНР): https://github.com/laravel/laravel

git clone https://github.com/laravel/laravel.git && cd laravel
ls -al
drwxrwxr-x  7 alex alex  4096 сен 30 12:22 app
-rwxrwxr-x  1 alex alex  1686 сен 30 12:22 artisan
drwxrwxr-x  3 alex alex  4096 сен 30 12:22 bootstrap
-rw-rw-r--  1 alex alex 36639 сен 30 12:22 CHANGELOG.md
-rw-rw-r--  1 alex alex  1608 сен 30 12:22 composer.json
drwxrwxr-x  2 alex alex  4096 сен 30 12:22 config
drwxrwxr-x  5 alex alex  4096 сен 30 12:22 database
-rw-rw-r--  1 alex alex   220 сен 30 12:22 .editorconfig
-rw-rw-r--  1 alex alex   778 сен 30 12:22 .env.example
drwxrwxr-x  8 alex alex  4096 сен 30 12:22 .git
-rw-rw-r--  1 alex alex   111 сен 30 12:22 .gitattributes
-rw-rw-r--  1 alex alex   163 сен 30 12:22 .gitignore
-rw-rw-r--  1 alex alex   974 сен 30 12:22 package.json
-rw-rw-r--  1 alex alex  1202 сен 30 12:22 phpunit.xml
drwxrwxr-x  2 alex alex  4096 сен 30 12:22 public
-rw-rw-r--  1 alex alex  3738 сен 30 12:22 README.md
drwxrwxr-x  6 alex alex  4096 сен 30 12:22 resources
drwxrwxr-x  2 alex alex  4096 сен 30 12:22 routes
-rw-rw-r--  1 alex alex   563 сен 30 12:22 server.php
drwxrwxr-x  5 alex alex  4096 сен 30 12:22 storage
-rw-rw-r--  1 alex alex   181 сен 30 12:22 .styleci.yml
drwxrwxr-x  4 alex alex  4096 сен 30 12:22 tests
-rw-rw-r--  1 alex alex   559 сен 30 12:22 webpack.mix.js
ls -al public/
-rw-rw-r--  1 alex alex    0 сен 30 12:22 favicon.ico
-rw-rw-r--  1 alex alex  603 сен 30 12:22 .htaccess
-rw-rw-r--  1 alex alex 1731 сен 30 12:22 index.php
-rw-rw-r--  1 alex alex   24 сен 30 12:22 robots.txt

Снаружи весь код приложения, конфиги, миграции БД, readme проекта и т.д.
В public только то, что надо просто отдавать напрямую: иконка, robots.txt. Можно положить туда статичные файлы типа картинок (логотип, …), иконок интерфейса. JS/CSS файлы скорее всего тоже туда попадут после сборки вебпаком.
И конфиг для Апача, что все остальные запросы надо перенаправлять в index.php.

index.php просто загружает autoload Composer’а из папки уровнем выше (../vendor/autoload.php) и передает управление приложению, которое анализирует запрос, в зависимости от адреса вызывает соотв. код для его обработки (контроллер) и т.д.

Это позволяет например использовать нормальные URL типа /shop/products/my-product/123, или тут /t/voprosy-po-web-serveru/1151/19 и /u/бармалей, вместо каких-нибудь /showthread.php?t=1151&p=19 и /member.php?u=123 на старых сайтах. (voprosy-po-web-serveru это необязательный Slug, запрос сработает и без него).

Ну а про безопасность тут разве что то, что в public не лежат секретные файлы и пользователи не смогут их получить при неправильной конфигурации веб-сервера разрешающей доступ к ним (ну и собственно не надо писать правила для запрета доступа к ним), чтоб не было как-то так: Около 390 тысяч сайтов оставили открытыми каталоги .git с кодом.