Vadimushka / wsl-web-server.md
Предполагается, что вы только что настроили WSL в своей системе и установили чистую ubuntu 18.04 LTS.
Почему не apache? С точки зрения производительности, быстродействия, а как следствие — нагрузки — связка nginx + php-fpm показывает себя гораздо лучше. Есть в этом решении и минусы — мы лишаемся удобного .htaccess и все необходимые настройки будем вынуждены производить в конфигах nginx и php, но оно того стоит.
Статья в первую очередь ориентирована на так называемых upper-junior , хотя бы поверхностно знакомых с linux и используемым стеком.
Установка необходимых пакетов
Устанавливаем и запускаем nginx
$ sudo apt update $ sudo apt install nginx $ sudo /etc/init.d/nginx start
Если вы все сделали верно, по ссылке http://127.0.0.1/ в браузере должна отобразиться стартовая страница «Welcome to nginx!».
На этом пока с nginx остановимся, вернемся уже на этапе конфигурации площадки.
$ sudo apt install mysql-server $ sudo /etc/init.d/mysql start
Хоть у нас и локальная площадка, нужно сразу привыкать к правильному — запускаем штатный скрипт настройки политик безопасности mysql (установка паролей, требования к валидации, анонимный доступ и все такое):
$ sudo mysql_secure_installation
$ sudo apt install php-fpm php-mysql $ sudo /etc/init.d/php7.2-fpm start
Идем в папку с конфигами сайтов nginx и на базе дефолтного конфига создаем свой. Файлы с конфигами лучше всего называть по домену, а для локальных проектов использовать какую-нибудь отдельную доменную зону, чтобы в дальнейшем не было путаницы — проект открыт локально или на удаленном сервере. Я обычно использую зону .local .
$ cd /etc/nginx/sites-available/ $ sudo cp default blog.local
server < listen 80; root /mnt/f/my/web/blog/public; index index.php index.html index.htm index.nginx-debian.html; server_name blog.local; location / < try_files $uri $uri/ =404; > location ~ \.php$ < fastcgi_buffering off; include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; > location ~ /\.ht < deny all; > >
Так как у нас все-таки WSL 1 — будем использовать файловую системы основной системы. Логические диски внутрь WSL монтируются в /mnt — узнать список разделов можно командой ls -la .
Если хотите видеть свой сайт по тому же http://127.0.0.1/ или http://localhost/ — оставьте значения server_name и listen по умолчанию. В таком случае не получится завести несколько разных площадок, но и настраивать hosts не придется.
Чтобы сайт заработал, его конфиг нужно разместить в папке /etc/nginx/sites-enabled/ , сделаем симлинк:
$ sudo ln -s /etc/nginx/sites-available/blog.local /etc/nginx/sites-enabled/
Заодно выключаем сайт по умолчанию, он нам больше не нужен:
$ sudo unlink /etc/nginx/sites-enabled/default
Тестируем конфиг (должно быть ok) и обновляем nginx:
$ sudo nginx -t $ sudo /etc/init.d/nginx reload
Чтобы браузер понимал наш домен blog.local — он должен откуда-то получить ip-адрес сервера, связанного с этим доменом. В большом интернете этим занимаются DNS-сервера, а нам достаточно прописать соответствие в hosts (C:\Windows\System32\drivers\etc\hosts) .
Добавляем следующую строку (нужны права администратора):
Если папка под проект к этому моменту еще не существует — стоит этим заняться.
$ echo '' > /mnt/f/my/web/blog/public/index.php
Теперь открываем наш сайт в браузере — http://blog.local/. В случае успеха мы увидим текст Hello world! .
Также у нас есть возможность просмотреть все настройки сервера, phpinfo предоставляет нам такую возможность:
$ echo '' > /mnt/f/my/web/blog/public/phpinfo.php
Открываем http://blog.local/phpinfo.php и видим свои настройки.
Важно! Не используйте данную возможность на боевых серверах и тем более не оставляйте подобный файл лежать с доступом для всех. В выводе есть версии всех используемых дистрибутивов, это более чем достаточная информация если не для взлома сервера, так для направленной атаки, использующей уязвимости конкретных версий.
Проще всего, особенно для каки-то самописных проектов поставить админку. Для тех, кому это кажется лишним — можно создать пользователя для проекта и БД напрямую в консоли mysql.
Устанавливаем phpmyadmin вместе с необходимыми расширениями php и рестартим php-fpm, чтобы расширения включились.
$ sudo apt install phpmyadmin php-mbstring php-gettext $ sudo /etc/init.d/php7.2-fpm restart
На вопрос «web-server to reconfigure automatically» не выбираем ничего, жмем Tab и Ok. В окне «Configuring phpmyadmin» выбираем Yes и создаем пользователя для утилиты.
Теперь нам нужно настроить nginx, создаем еще один конфиг для хоста phpmyadmin:
$ cd /etc/nginx/sites-available/ $ sudo cp default phpmyadmin $ sudo nano phpmyadmin
Содержимое (админка будет доступна по http://127.0.0.1/pma):
server < listen 80 default_server; listen [::]:80 default_server; root /var/www/html/; index index.php index.html index.htm index.nginx-debian.html; server_name _; location /pma < alias /usr/share/phpmyadmin/; location ~ \.php$ < fastcgi_buffering off; fastcgi_pass unix:/run/php/php7.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; include fastcgi_params; fastcgi_ignore_client_abort off; > location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ < access_log off; log_not_found off; expires 1M; > > >
Включаем сайт, проверяем конфиг и релоадим nginx:
$ sudo ln -s /etc/nginx/sites-available/phpmyadmin /etc/nginx/sites-enabled/ $ sudo nginx -t $ sudo /etc/init.d/nginx reload
Открываем http://127.0.0.1/pma, пользователь phpmyadmin , пароль тот, что вводили при установке.
Если вдруг пользователь phpmysql оказался ограничен в правах (не может создать БД или других пользователей) — эти права всегда можно выдать вручную.
И выдаем нужные права (в данном случае все возможные):
GRANT ALL PRIVILEGES ON *.* TO 'phpmyadmin'@'localhost' WITH GRANT OPTION;
Идем обратно в phpmyadmin и перезаходим в учетку, права должны быть на месте. Для демонстрации корректной работы всех пакетов добавим пользователя blog и БД blog с таблицей test произвольного формата (кодировку следует выбирать utf8_general_ci ).
Чтобы наши сервисы запускались автоматически при старте ubuntu — запускаем следующие команды:
$ sudo update-rc.d nginx defaults $ sudo update-rc.d php7.2-fpm defaults $ sudo update-rc.d mysql defaults
Проверяем корректность работы
Подключаемся к БД из php и выводим на экран содержимое таблицы test (думаю, не стоит лишний раз упоминать, что доступы в открытом виде в коде указывать нельзя, для этого умные люди придумали .env файлы):
query('SELECT * from test') as $row) < echo "
"; print_r($row); echo ""; > $dbh = null; > catch (PDOException $e) < print "Error!: " . $e->getMessage() . "
"; die(); >Открываем еще раз наш http://blog.local и видим содержимое таблицы на экране.
В итоге у нас все работает, причем у нас в windows (!) есть привычная командная строка linux с привычными пакетами, которые используются в продакшне. То, для чего раньше ставились чрезвычайно медленные виртуалки, теперь доступно из коробки и заводится даже без танцев с бубнами. В удивительное время живем!
ERR_NAME_NOT_RESOLVED (не удается получить доступ к сайту)
Браузер не смог найти указанный домен. Возможные причины:
- вы неправильно настроили конфиг сайта;
- вы не прописали в hosts домен или прописали его неверно;
- вы не сделали nginx reload после создания/изменения конфига сайта — это действие обязательно нужно выполнять после любых правок в конфиге.
Ошибка связана с тем, что nginx не получает ответа от бэкенда, в данном случае от php-fpm.
- php-fpm не запущен;
- неверно указаны параметры php в настройках хоста nginx;
- ошибка непосредственно в php-скрипте.
Лучшие ваши помощники в устранении любой неполадки — логи:
/var/log/nginx/access.log - лог запросов к nginx /var/log/nginx/error.log - лог ошибок nginx /var/log/php7.2-fpm.log - лог php-fpm
Очень долгая загрузка страниц (ERR_INCOMPLETE_CHUNKED_ENCODING)
Проверьте наличие директивы fastcgi_buffering off; в секции location ~ \.php$ конфига сайта.
upstream sent too big header while reading response header from upstream
Поднимите размер буфера в секции php
fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;
Установка локального WSL2 сервера (Ubuntu 20.04, Nginx, PHP8, MySQL)
В этой статье мы настроим рабочее окружение для разработки веб-проектов на основе Windows Subsystem for Linux (WSL2). Данный подход намного более гибкий, чем установка готовых пакетов, например WAMP или Open Server. Он также проще и не так сильно нагружает систему, как Docker или создание отдельных виртуальных машин.
Оглавление
Привет. В этой статье мы настроим рабочее окружение для разработки веб-проектов на основе Windows Subsystem for Linux (WSL2). Данный подход намного более гибкий, чем установка готовых пакетов, например WAMP или Open Server. Он также проще и не так сильно нагружает систему, как Docker или создание отдельных виртуальных машин. Вообщем, одни плюсы. Давайте приступать.
Системные требования
Для корректной работы WSL2 необходимо, чтобы ваша система отвечала некоторым требованиям:
1. На устройстве должна быть установлена Windows 10 (сборки не ниже 19041) или Windows 11. Версию системы можно посмотреть по пути:
en: Start > Settings > System > About
ru: Пуск > Параметры > Система > О системе
2. Устройство должно поддерживать виртуализацию Hyper-V и функция должна быть включена. Для того, чтобы проверить, есть ли в системе Hyper-V и включена ли эта функция, найдите в Пуск следующий пункт:
en: Turn windows features on or off
ru: Включение или отключение компонентов Windows
3. Должны быть включены компоненты WSL. Активировать их нужно также в этой панели.
Если вы включали какие-либо компоненты, стоит перезагрузить компьютер. Если все требования выполнены мы можем приступать к установке.
Установка
Для установки и настройки компонентов мы будем использовать Windows PowerShell. Найдите программу в меню Пуск и запустите от имени Администратора.
Команда для установки следующая:
wsl —install — пока не выполняйте эту команду
Команда включит функционал для запуска WSL и установки дистрибутива Ubuntu. Дистрибутив по умолчанию можно изменить, в таком случае команда будет выглядеть так:
Чтобы узнать список возможных дистрибутивов, выполните команду
И уже после этого установите WSL для необходимой версии. Мы как правило устанавливаем Ubuntu 20.04 LTS
После завершения установки вам будет необходимо перезагрузить компьютер.
Использование
Для запуска и взаимодействия с образом на повседневной основе удобнее всего пользоваться программой Windows Terminal. Для запуска компонентов WSL2 и работы с образом после установки в выпадающем списке возможных программ выберите установленный вами образ:
Также в настройках программы можно выставить программу, которая будет запускаться по умолчанию при запуске Windows Terminal:
Далее нам необходимо установить все компоненты, необходимые нам для локальной разработки. Сделать это можно, руководствуясь нашей статьей Развертывание Laravel проекта на сервере Ubuntu 20.04. Здесь нужно сделать несколько важных замечаний:
1. WSL образ не запускает установленные пакеты после установки. Например, после установки mysql вам нужно запустить этот пакет командой sudo service mysql start. И так с любым другим пакетом.
2. WSL не запускает установленные пакеты при запуске системы.. После перезагрузки компьютера и старта WSL образа вам нужно запустить все необходимые для вас пакеты. Чтобы не писать каждый раз все эти команды, проще в корневой папке (папке ~), откуда стартует ваш образ, создать файл start.sh:
#!/bin/bash
service nginx start
service mysql start
service php8.0-fpm start
service php8.1-fpm start
service php7.4-fpm start
service redis-server start
service cron start
Далее сохраняем этот файл. Теперь после старта WSL для того, чтобы выполнить все команды из этого файла, нам нужно выполнить команду:
Последнее, что нам осталось — прописать нужный нам домен (домены) в файле C:\Windows\System32\drivers\etc\hosts (не забывайте открывать от имени Администратора) следующим образом:
После этого домен ilavista.test будет вести на локальную машину, таким образом его можно будет обработать Nginx (или Apache) вашего WSL образа.
Полезные команды
Немедленно завершает работу всех запущенных дистрибутивов и утилиты виртуальной машины WSL 2. Эта команда может потребоваться в случаях, когда требуется перезапустить среду виртуальной машины WSL 2, например, для изменения ограничений использования памяти или внесения изменений в ваш файл .wslconfig.
Завершить указанный дистрибутив или остановить его запуск.
Экспортирует дистрибутив в tar-файл.
Импортирует указанный tar-файл в качестве нового дистрибутива.
wsl —import Distribution_Name Install_Location FileName Копировать
Список дистрибутивов Linux, установленных на вашем компьютере с Windows, включая состояние (запущен дистрибутив или остановлен) и версию WSL, на которой запущен дистрибутив (WSL 1 или WSL 2).
Общая информация о вашей конфигурации WSL, такую как тип дистрибутива по умолчанию, дистрибутив по умолчанию и версия ядра.
Вручную обновите версию вашего ядра WSL Linux. Вы также можете использовать команду: wsl —update rollback для отката к предыдущей версии ядра WSL Linux.