-
Скачиваем отсюда https://nginx.org/ru/download.html и распаковываем куда-нибудь.
-
Дальше читаем тут https://nginx.org/ru/docs/windows.html
ВНИМАНИЕ: командуstart nginx
обязательно даем прямо из каталога, в котором лежит nginx.exe, в противном случае при дальнейшей работе будут ошибки (все пути в конфигурации прописаны как относительные, только поменяв их все, можно запускать откуда угодно).
Вообще рекомендуется держать консоль открытой в этом каталоге до самого конца выполнения инструкций, однако для работы nginx это необязательно — если её закрыть, он продолжит работать. -
Открываем http://localhost/ — должно заработать.
Установка PHP
-
Скачиваем с https://windows.php.net/download (ZIP-архив Non Thread Safe x64), замечаем номер в «VC(число)» — понадобится на следующем шаге.
Прописываем каталог в PATH. -
Открываем командную строку, запускаем
php -v
.
Должно выскочить окно с надписью «The program can’t start because VCRUNTIME140.dll».
Если запуск прошел без ошибок, пропускаем следующий пункт. -
Ищем на странице загрузки из п.1 в левой колонке ссылку на VC нужного номера. Скачиваем x64.exe, устанавливаем.
После этого возвращаемся на предыдущий пункт. На этот раз команда должна показать версию php.
Конфигурация локального сайта в nginx
-
Выбираем локальное имя хоста (как
localhost
, только какое-то другое, например,mysite
) и каталог, где будут находиться его файлы (например,D:\sites\mysite
). -
В конец файла
(каталог nginx)/nginx.conf
перед последней закрывающей скобкой добавляем раздел:server { listen 80; server_name mysite; root D:\sites\mysite; }
-
В консоли, находясь в каталоге nginx.exe, даем команду
nginx -s reload
, чтобыnginx
перечитал конфигурацию. -
Открываем файл
C:\Windows\System32\Drivers\etc\hosts
, добавляем строчку127.0.0.1 mysite
Файл защищен системой ото всех пользователей, кроме администратора, поэтому перед записью понадобится открыть его свойства и дать там нужные права и потом вернуть, как было.
-
Открываем в браузере ссылку http://mysite/ (обязательно с
http://
, иначе браузер станет отправлять в поисковые системы). Должна отобразиться страница 404 от nginx.
Налаживание взаимодействия nginx и PHP
-
В раздел
server
конфигурации добавляем такие строки:location ~\.php$ { fastcgi_pass 127.0.0.1:9123; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
(
9123
— номер порта, можно выбрать какой-нибудь другой)Из консоли даем команду
nginx -s reload
. -
В консоли переходим в каталог, куда распакован PHP. Даем команду
php-cgi.exe -b 127.0.0.1:9123
Закрывать окно консоли нельзя, иначе интерпретатор PHP перестанет работать.
Можно прописать путь к каталогу PHP в системной переменной
PATH
и запускать его без указания полного пути. -
Создаем файл
D:\sites\mysite\test.php
со следующим содержимым:<?php echo "This is PHP script on mysite";
Открываем http://mysite/test.php — текст должен отображаться.
Взаимодействие налажено!
См. также https://www.nginx.com/resources/wiki/start/topics/examples/phpfastcgionwindows/
PHP: ini-файл и модули расширений
Вышеуказанные процедуры позволяют успешно запустить и использовать PHP, однако он будет «голым» — без расширений (в т.ч. таких необходимых, как mysqli
, mbstring
и др.) и без настроек, т.к. он не прочитает ни одного ini-файла.
PHP может автоматически загрузить файл php.ini
из нескольких каталогов. Первое место, где он станет его искать — рядом с php.exe
. В пакете есть файл php.ini-development
. Нужно создать рядом его копию с именем php.ini
, открыть и внести следующие изменения:
-
Раскомментировать строку
extension_dir = "ext"
— в результате PHP станет искать модули расширений в подкаталогеext
рядом сphp.exe
(относительный путь интерпретируется именно от exe-, а не от самого ini-файла)Проверяем, подключился ли файл, с помощью команды
php --ini
. Результат должен быть примерно следующим:Configuration File (php.ini) Path: C:\Windows Loaded Configuration File: {каталог с дистрибутивом PHP}\php.ini Scan for additional .ini files in: (none) Additional .ini files parsed: (none)
Вторая строчка говорит о том, что ini-файл успешно загрузился.
На первую строчку (про С:\Windows) внимания обращать не следует, т.к. ini-файла по указанном адресу нет.
-
Найти нужные расширения и раскомментировать строки, где они подключаются. Например,
extension=mysqli
и т.д.Все расширения перечислены рядом, и найти нужные среди них несложно. Рекомендуется включить следующие:
- curl
- fileinfo
- gd
- mbstring
- exif
- mysqli
- soap
Просмотреть список подключенных расширений можно, дав команду
php -m
. Непустой изначально список после вышеописанной манипуляции пополнится.
PHP загружает расширения при запуске exe-файла интерпретатора. Если нужно подключить новое, следует остановить php-cgi.exe
(или php.exe
соответственно) и запустить его заново.
PHP и MySQL
Чтобы установить связь между PHP и MySQL, не требуется никаких специальных действий, кроме собственно создания соединения (разумеется, должен быть включен соответствующий модуль, например, mysqli
).
Проверить соединение можно так:
echo "Connecting to MySQL server... "; // $host = 'localhost'; // если соединяемся через named pipe (аналог Unix-сокета), $host = "."; // то в качестве хоста указываем "." $user = "someone"; $password = "a password"; $mysqli = new mysqli($host, $user, $password); if ($mysqli->connect_error) echo $mysqli->connect_error; else echo "Connected successfully!";
Об установке и минимальной настройке MySQL под Windows см. здесь.
Неудобства работы под Windows
-
в путях файловой системы используется обратный слэш (
\
), а не прямой (/
) — типаD:\sites\mysite\...
вместо/sites/mysite/...
, что влияет, в частности, на содержимое констант__DIR__
и__FILE__
;
как следствие, весь код, рассчитанный на разбор пути по слэшу, перестаёт работать -
невозможно установить русскую локаль с UTF-8:
setlocale(LC_ALL, 'rus')
всегда приводит к использованию windows-1251, и изменить это никак не получается
Installing a web server using a distribution package like XAMPP, and WinNMP are probably the easiest solution to make your localhost server works. But what if we wanted to make it from scratch? and avoid duplication whenever we install a composer, laravel and other development kit. Also, you’re free to upgrade them whenever a new version comes out.
The guide has been updated to run on the latest Windows 11, it should work on Windows 10, 8 and 7.
Table of Contents
- Nginx
- PHP
- MySQL
- Using Installer
- Using Zipped
- Add them to PATH environment
- Wrap Up
If you’re not running the latest Windows 11, you need to install the version of VC_Redist you can get it from at https://support.microsoft.com/en-us/topic/the-latest-supported-visual-c-downloads-2647da03-1eea-4433-9aff-95f26a218cc0, then look for Visual Studio 2015, 2017 and 2019, then download your either vc_redist.x86.exe or vc_redist.x64.exe. If you don’t have that, you’ll get this error message when using the PHP.
The code execution cannot proceed because VCRUNTIME140.dll was not found. Reinstalling the program may fix this problem.
or if you have a lower version of VC_Redist installed, you’ll get this error.
'vcruntime140.dll' 14.0 is not compatible with this PHP build linked with 14.16 in Unknown on line 0 - Google Search
That’s for installing the prerequisite. Let’s now install the latest version of NGINX 1.19.6 + PHP 8.0+ MySQL 8.0.22.
To install nginx, you need to download it from http://nginx.org/en/download.html. Select the Mainline version zip files. Currently, it’s nginx/Windows-1.19.6.
Once downloaded, create a folder in your computer. You may follow our naming convention or create your own. In our case we create a folder at C:\WebServer
.
After created a folder, create again a folder for our Nginx. It should be C:\WebServer\nginx
.
Unzip the downloaded nginx-1.19.6.zip at C:\WebServer\nginx
folder.
It’s all good for now, we can discuss later how we activate it.
PHP
To get binaries installation for PHP on Windows, you can grab it at https://windows.php.net/download/.
Then at the PHP 8.0, download the VS16 x64 Non Thread Safe zip file, so we can use it alongside with our Nginx and MySQL.
If you want to use the older version, PHP 7.4, download the VC15 x64 Non Thread Safe zip file.
Once downloaded, create a folder C:\WebServer\php
and extract the file at C:\WebServer\php
MySQL
There are two ways to install MySQL by its installer or via zip. Both has pros and cons. Installing using its installer is easier and will not allow you to set things. Advantage of using the zipped version is its portability, you can easily transfer everything in a new computer.
Using Installer
To install MySql, you can downloaded the installer version at https://dev.mysql.com/downloads/installer/. Pick the mysql-installer-web-community-8.0.23.0.msi.
Run the installation, and when you are asked to what to install. Just install MySQL Server, other module is not needed.
You’ll then asked to set your MySQL password. Just fill up the form and when finish, the MySQL will run automatically.
We also suggest to start MySQL when windows start.
Using Zipped
You can download the zipped version at https://dev.mysql.com/downloads/mysql/. Scroll down and look for Windows (x86, 32 & 64-bit), ZIP Archive.
Once done, create a folder and unzipped the downloaded file at C:/WebServer/mysql
.
Launch a command prompt as a Administrator and we can now initialize the MySQL setup.
cd C:/WebServer/mysql/bin
mysqld --initialize-insecure
You can then run the mysql using this command. Make sure to Allow Access when it asked for permission.
cd C:/WebServer/mysql/bin
mysqld --console
You need to open a new command prompt window to login to our MySQL. (Do not close the previous command prompt or else you’ll get an error saying ‘error 2003 (HYOO): Can’t connect to MySQL server on ‘localhost’ (10061))
cd C:/WebServer/mysql/bin
mysql -u root
In MySQL 8.0 and above, the default authentication plugin is caching_sha2_password which not allow you to connect to the mysql using the default native login in php. Most users will get this error message saying “Connection failed: The server requested authentication method unknown to the client”. To enable it back to native, we have to set your root password with mysql_native_password.
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';
FLUSH PRIVILEGES;
Add them to PATH environment
In order for us to call nginx, php and MySQL straight from the command line or Windows Powershell without going to its directory, this is needed for other module like Laravel and Composer. We need to add it in the PATH directory.
In the Search bar (Cortana) in your Windows taskbar, just search Edit the system environment variables.
At the bottom, Click the Environment Variables.
Then, you can either add both on User Variables for YOUR_USERNAME or System variables path. Look for Path then click Edit.
Now, we have to add these directories. If you use the installer for MySQL, no need to add the C:\WebServer\mysql\bin
.
C:\WebServer\nginx
C:\WebServer\php
C:\WebServer\mysql\bin
Once done, click OK.
To see if it works, try running these commands using the Windows Powershell or Command Prompt.
php -v
mysqld -V
nginx -v
You should get these output.
PHP 8.0.1 (cli) (built: Jan 5 2021 23:43:33) ( NTS Visual C++ 2019 x64 )
Copyright (c) The PHP Group
Zend Engine v4.0.1, Copyright (c) Zend Technologies
Ver 8.0.22 for Win64 on x86_64 (MySQL Community Server - GPL)
nginx version: nginx/1.19.6
You cannot call yet the nginx -t
at the command prompt, because this will cause an error which are looking for files on its relative directory. We can discuss this later on how to get rid of this using a batch command file.
nginx: [alert] could not open error log file: CreateFile() "logs/error.log" failed (3: The system cannot find the path specified)
2020/02/27 11:43:49 [emerg] 400#7148: CreateFile() "C:\WebServer/conf/nginx.conf" failed (3: The system cannot find the path specified)
nginx: configuration file C:\WebServer/conf/nginx.conf test failed
Wrap up
Now that we already added them to path. Let’s do some finishing touch.
To make PHP communicate with our MySQL. At C:\WebServer\php
, we need to add the module in our PHP. First, rename the php.ini-production to php.ini file
After renaming it, open the php.ini file, search for extension=/path/to/extension/mysqli.so and uncomment the line by removing the semi-colon “;”, then change its value to our mysqli dll (Unfortunately, we need to manually add the exact path of the dll because it is causing error when just using the default extension name).
; When the extension library to load is not located in the default extension
; directory, You may specify an absolute path to the library file:
;
extension=C:\WebServer\php\ext\php_mysqli.dll
You can then also enable other module extension (DLLs) that are needed for your program. Like the following that are needed for WordPress.
extension=C:\WebServer\php\ext\php_curl.dll
extension=C:\WebServer\php\ext\php_pdo_mysql.dll
extension=C:\WebServer\php\ext\php_mbstring.dll
extension=C:\WebServer\php\ext\php_gd.dll
extension=C:\WebServer\php\ext\hp_soap.dll
We also need to edit our loadable extensions module to avoid PHP Warning for our MySQL. Search and find the ;extension_dir = "ext"
then uncomment and replace the value with extension_dir = "c:\WebServer\php\ext\"
. (Credits to Mohamed for this tip)
; Directory in which the loadable extensions (modules) reside.
; http://php.net/extension-dir
;extension_dir = "./"
; On windows:
extension_dir = "c:\WebServer\php\ext\"
In the next step, we will be making a batch file. But there is a problem, running nginx and php-cgi in the batch command line will not allow us to execute the next line of code. Simply because the program is not yet closed for it to proceed on to the next line.
In order for us to run each lines of code of our batch file, we need to hide the command prompt windows by using RunHiddenConsole, you can download this at their official website (https://redmine.lighttpd.net/attachments/660/RunHiddenConsole.zip).
At C:\WebServer\nginx
, unzip the RunHiddenConsole.zip.
Then still at C:\WebServer\nginx
, we need to create a batch file called C:\WebServer\nginx\myserver.bat
. This is where we will start and stop our nginx and php-cgi by using a single command line. Add the following code. (Thank you to Mohamed for enhancing this code).
@echo off
cd C:\WebServer\nginx
IF "%1" == "stop" (
GOTO STOPSERVER
)else IF "%1" == "start" (
GOTO STARTSERVER
)else (
echo Use these commands:
echo.
echo myserver start
echo myserver stop
)
GOTO END
:STARTSERVER
QPROCESS * | find /I /N "mysqld.exe">NUL
IF "%ERRORLEVEL%"=="0" (
echo MYSQLD is already running.
)else (
RunHiddenConsole.exe mysqld --console
echo MYSQLD is now running.
)
QPROCESS * | find /I /N "nginx.exe">NUL
IF "%ERRORLEVEL%"=="0" (
echo NGINX is already running.
)else (
RunHiddenConsole.exe nginx
echo NGINX is now running.
)
QPROCESS * | find /I /N "php-cgi.exe">NUL
IF "%ERRORLEVEL%"=="0" (
echo PHP-CGI is already running.
)else (
RunHiddenConsole.exe php-cgi -b 127.0.0.1:9000
echo PHP-CGI is now running.
)
echo.
echo To stop, type "myserver stop"
GOTO END
:STOPSERVER
QPROCESS * | find /I /N "mysqld.exe">NUL
IF "%ERRORLEVEL%"=="0" (
taskkill /F /IM mysqld.exe>NUL
echo MYSQLD ended successfully.
)else (
echo MYSQLD is not running
)
QPROCESS * | find /I /N "nginx.exe">NUL
IF "%ERRORLEVEL%"=="0" (
::nginx -s stop
taskkill /F /IM nginx.exe>NUL
echo NGINX ended successfully.
)else (
echo NGINX is not running
)
QPROCESS * | find /I /N "php-cgi.exe">NUL
IF "%ERRORLEVEL%"=="0" (
taskkill /F /IM php-cgi.exe>NUL
echo PHP-CGI ended successfully.
)else (
echo PHP-CGI is not running
)
:END
After that, you can now use these commands for starting and stopping your server at the Command Prompt.
- myserver start – It will start Nginx, and PHP
- myserver stop – It will stop all instances of Nginx and PHP
But before running the commandline above, we have to edit some blocks on our C:/WebServer/nginx/conf/nginx.conf
.
First we have to make sure index.php is been recognized by our nginx. find the location / {} block and change it with the following:
location / {
root html;
index index.php index.html index.htm;
}
Next is we have to make sure nginx know where to run the php files. Find and uncomment the block that says location ~ .php$ {}, the one that says “pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000”. Change it with the following:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Once everything is good. Create a file in C:\WebServer\nginx\html\testing.php
. Then write this sample PHP codes with MySQL connection checker (Make sure to fill up your MySQL login, the default username is root).
<?php
echo "PHP works!<br/><br/>";
$servername = "localhost";
$username = "root";
$password = "";
// Create connection
$conn = mysqli_connect($servername, $username, $password);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected to MYSQL successfully";
?>
Then at the command prompt. Let’s start our server. (Do not forget to Allow Access when Windows Defender Firewall is asking for permission.)
myserver start
You should get example output below.
MYSQLD is now running.
NGINX is now running.
PHP-CGI is now running.
To stop, type "myserver stop"
Now to really check its indeed running. Check at your browser and access https://localhost/testing.php.
PHP works!
Connected to MYSQL successfully
Из данного HOWTO Вы узнаете как установить и настроить связку nginx + php (в режиме FastCGI) + СУБД MySQL для работы под операционной Microsoft Windows.
Мы подробно рассмотрим вопросы установки, базовой и расширенной настройки, а также безопасности.
В статье приводятся примеры скриптов запуска и остановки, а также примеры файлов конфигурации nginx и php.
Подробности смотрите под катом.
Шаг 1. Подготовка к установке
Для начала рекомендуем в корне системного диска создать каталог nginx (например, c:\nginx\), а в нём подкаталоги public_html, php и mysql. Лучше всего связка работает, когда все основные компоненты находятся в одном каталоге. В каталог php мы будем устанавливать интерпретатор PHP5, в mysql соответственно данную СУБД, а в public_html — файлы главного сайта.
Разместив все компоненты таким образом, Вы сделаете пакет перемещаемым (Portable) и готовым к работе с любого компьютера.
Шаг 2. Загрузка необходимых компонентов
Нам потребуются следующие компоненты:
- PHP — http://windows.php.net/download/. Вам необходимо скачать версию с инсталлятором (*.msi) в варианте Thread Safe;
- MySQL — http://dev.mysql.com/downloads/mysql/. Также скачайте версию с msi-инсталлятором;
- nginx — http://nginx.org/ru/download.html. Скачайте последнюю версию;
- RunHiddenConsole — http://redmine.lighttpd.net/attachments/660/RunHiddenConsole.zip.
Шаг 3. Установка компонентов
По окончании скачивания приступайте к установке компонентов согласно данному алгоритму:
- распакуйте архив с nginx в созданный на шаге 1 каталог в корне (например, c:\nginx\). Далее в данном HOWTO будет использоваться именно этот каталог, поэтому если Вы изменили путь, сделайте соответствующие правки;
- установите PHP в каталог c:\nginx\php\:
- на этапе выбора типа установки (Web Server Setup) обязательно выберите вариант «Other CGI«, иначе модули, необходимые для работы PHP в режиме FastCGI не будут установлены;
PHP — Web Server Setup - на этапе выбора необходимых модулей (Choose Items to Install) обязательно выберите MySQL, MySQLi и OpenSSL (если хотите далее настроить SSL). Также рекомендуется выбрать модули, необходимые для большинства CMS: bzip2, Curl, Exif, GD2, Gettext, XML. Если Вы забыли что-то нужное и оно Вам потребуется, Вы всегда сможете доустановить/удалить эти компоненты, снова запустив программу установки PHP и выбрав пункт Change.
PHP — выбор компонентов
- на этапе выбора типа установки (Web Server Setup) обязательно выберите вариант «Other CGI«, иначе модули, необходимые для работы PHP в режиме FastCGI не будут установлены;
- установите СУБД MySQL в каталог c:\nginx\mysql\. Здесь нет ничего сложного. В мастере конфигурации выберите стандартную конфигурацию и обязательно задайте пароль администратора (пароль встроенной учётной записи суперпользователя root);
- распакуйте архив RunHiddenConsole.zip в каталог c:\nginx\.
Шаг 4. Создание скриптов запуска и остановки
Для быстрого запуска набора Вам потребуется создать в каталоге c:\nginx\ 3 файла: start.cmd, shutdown.cmd и restart.cmd, предназначенные соответственно для запуска, остановки и перезапуска серверов.
Листинг файла start.cmd (запуск сервера):
@echo off echo Starting servers... set PHP_FCGI_MAX_REQUESTS=0 set SRVPATH=C:\nginx net start MySQL start /D%SRVPATH% nginx.exe %SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9000 -c %SRVPATH%/php/php.ini
Листинг файла shutdown.cmd (остановка сервера):
@echo off echo Shutting down servers... taskkill /IM nginx.exe /F taskkill /IM php-cgi.exe /F net stop MySQL
Листинг файла restart.cmd (перезапуск сервера):
@echo off echo Shutting down servers... taskkill /IM nginx.exe /F taskkill /IM php-cgi.exe /F net stop MySQL echo Starting servers... set PHP_FCGI_MAX_REQUESTS=0 set SRVPATH=C:\nginx net start MySQL start /D%SRVPATH% nginx.exe %SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9000 -c %SRVPATH%/php/php.ini
Если Вы изменили путь со стандартного C:\nginx\, на что-то другое, внесите соответствующие правки в скрипты.
Если требуется запускать сервер nginx+php+mysql при загрузке системы, то добавьте задание на автозапуск скрипта start.cmd с помощью оснастки Назначенные задания Windows.
Откройте файл c:\nginx\conf\nginx.conf в любом текстовом редакторе (я рекомендую Notepad++).
1. Измените строку:
worker_processes 1;
Здесь вместо 1 укажите количество рабочих процессов nginx. Рекомендуется указывать число, равное количеству ядер процессора.
2. Уберите символ комментария (решётку) у строки:
error_log logs/error.log;
Это позволит включить запись логов ошибок в файл error.log, который Вы всегда найдёте в каталоге c:\nginx\logs\.
3. Измените значение директивы server{} для nginx без использования SSL:
server { listen 80 default; server_name localhost; server_tokens off; #charset koi8-r; #access_log logs/access.log main; location / { root c:/nginx/public_html; index index.html index.htm index.php; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.ht { deny all; } #error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
Если Вы хотите использовать SSL, Вам потребуется совсем иной конфиг:
server { listen 443 default; server_name localhost; server_tokens off; ssl on; ssl_certificate C:/nginx/private/ssl_cert_domain.pem; ssl_certificate_key C:/nginx/private/ssl_cert_domain.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; #charset koi8-r; #access_log logs/access.log main; location / { root c:/nginx/public_html; index index.html index.htm index.php; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_param HTTPS on; } #error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ /\.ht { deny all; } }
Здесь C:/nginx/private/ssl_cert_domain.pem — файл сертификата SSL, а C:/nginx/private/ssl_cert_domain.key — закрытый ключ для него. Внимание! При старте сервера у Вас запросят пароль для расшифровки закрытого ключа, поэтому чтобы не вводить его постоянно, во время создания (получения) сертификата оставьте поле ввода пароля пустым (это конечно небезопасно, но экономит время во время запуска сервера). В новых версиях возможно появится функция указания пароля в конфиге (как у Apache).
Вы можете включить ведение логов доступа (access.log), убрав символ комментария у строки #access_log logs/access.log main;.
Вы также можете переопределить страницы ошибок 404, 500, 502, 503, 504 и 403 путём указания в директиве error_page кода ошибки и имени файла, который будет отображаться при её возникновении.
Шаг 6. Настройка php и безопасность
Откройте текстовый файл C:\nginx\php\php.ini в любом текстовом редакторе. Из соображений безопасности рекомендуем изменить строку
safe_mode = Off
на
safe_mode = On
Также найдите в файле строку
disable_functions =
и замените её на следующую:
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
Эти действия включат безопасный режим для PHP (Safe Mode), при котором запрещены большинство небезопасных функций и исполнение файлов, а также отключит ряд потенциально уязвимых функций. Внимание! Если Ваша CMS не работает при включённом режиме PHP Safe Mode, отключите его, либо поставьте правильную CMS ;-).
Если Вы являетесь разработчиком и хотите видеть ошибки и сообщения PHP, то найдите строку
display_errors = Off
и замените её на
display_errors = On
Для исправления опасной уязвимости в PHP, позволяющей выполнять PHP-код из загружаемых файлов, найдите в php.ini строку
;cgi.fix_pathinfo=1
уберите символ комментария (;) около неё и замените на следующую:
cgi.fix_pathinfo = 0
Дальнейшие настройки файла изменять не требуется — всё уже настроено оптимально для большинства применений программой установки PHP.
Шаг 7. Обработка нескольких PHP-файлов одновременно
К сожалению, PHP в Windows не умеет создавать копии своих экземпляров, поэтому придётся заранее запускать несколько копий и описать их использование в конфиге nginx.
В файле start.cmd пропишите запуск php-cgi.exe на разные номера портов:
%SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9000 -c %SRVPATH%/php/php.ini %SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9001 -c %SRVPATH%/php/php.ini %SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9002 -c %SRVPATH%/php/php.ini %SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9003 -c %SRVPATH%/php/php.ini %SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9004 -c %SRVPATH%/php/php.ini
Запустите столько процессов, сколько вам потребуется (обычно достаточно 5-20). В нашем примере используется 5 экземпляров с номерами портов 9000 — 9004.
Откройте файл nginx.conf в текстовом редакторе и перед директивой server {} пропишите следующие строки:
upstream backend { server 127.0.0.1:9000; server 127.0.0.1:9001; server 127.0.0.1:9002; server 127.0.0.1:9003; server 127.0.0.1:9004; }
Теперь откройте файл fastcgi_params и в самом начале пропишите следующее:
fastcgi_connect_timeout 1; fastcgi_next_upstream timeout; fastcgi_pass backend;
Обязательно уберите fastcgi_pass 127.0.0.1:9000; во всех директивах location.
Пример готового конфига nginx.conf:
worker_processes 4; error_log logs/error.log; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; upstream backend { server 127.0.0.1:9000; server 127.0.0.1:9001; server 127.0.0.1:9002; server 127.0.0.1:9003; server 127.0.0.1:9004; } server { listen 80 default; server_name localhost; server_tokens off; location / { root C:/nginx/public_html; index index.html index.htm index.php; location ~ \.php$ { include fastcgi_params; } } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ /\.ht { deny all; } } }
Пример конфига, использующего SSL:
worker_processes 4; error_log logs/error.log; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; upstream backend { server 127.0.0.1:9000; server 127.0.0.1:9001; server 127.0.0.1:9002; server 127.0.0.1:9003; server 127.0.0.1:9004; } server { listen 443 default; server_name localhost; server_tokens off; ssl on; ssl_certificate C:/nginx/private/ssl_cert_domain.pem; ssl_certificate_key C:/nginx/private/ssl_cert_domain.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; location / { root C:/nginx/public_html; index index.html index.htm index.php; location ~ \.php$ { include fastcgi_params; fastcgi_param HTTPS on; } } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ /\.ht { deny all; } } }
Пример файла fastcgi_params:
fastcgi_connect_timeout 1; fastcgi_next_upstream timeout; fastcgi_pass backend; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200; fastcgi_index index.php;
Шаг 8. Тестирование и заключение
Запустите серверы и создайте в каталоге C:\nginx\public_html\ файл test.php со следующим содержанием:
<?php phpinfo(); ?>
Откройте этот файл в браузере по адресу http://localhost/test.php и если Вы увидели информацию об установленном сервере, значит всё работает корректно и Вы можете приступать к использованию сервера.
Шаг 9. Готовые примеры файлов конфигурации
По многочисленным просьбам мы решили выложить примеры всех файлов конфигурации nginx в Git-репозитории. В данный момент доступно три разных готовых конфига:
- nginx_simple.conf — простейший конфиг для запуска одного сайта без поддержки SSL;
- nginx_ssl.conf — конфиг для запуска одного сайта с поддержкой SSL;
- nginx_vhosts.conf — специально настроенный конфиг с относительными путями, поддержкой SSL, виртуальных хостов (позволяет держать несколько сайтов на одном сервере) и отдельных логов.
Там же вы найдете готовые скрипты запуска и остановки сервера, а также файл конфигурации PHP.
Although Nginx is available for Windows 10/8/7, however, to really understand, experience, build or test web application around, I recommend using it on Linux. And the Windows 10 WSL is the best option to run Linux+Nginx+PHP+MySQL stack to get a complete Linux based web server without really installing a separate Linux distro.
Step 1: Install Windows 10 WSL for Nginx + phpStep 2: Choose Linux Distro App for WIndows 10 WSLStep 3: Run Ubuntu to install Nginx + PHPs on Windows 10 WSLStep 4: Start Nginx web server service on WSLStep 5: Test Nginx WebserverStep 6: Installing PHP for Nginx on Windows 10 WSLStep 7: Start PHP-fpm serviceStep 8: Nginx Error (optional)Configure PHP for Nginx Default site configurationStep 9: Create a test PHP fileStep 10: Access the PHP info on Nginx WSL Windows 10 webserverStep 11: Install MySQL with Nginx on Windows 10 (optional)
Thus, let’s see how to install Linux+Nginx+PHP+MySQL stack on Windows 10 WSL (Windows Subsystem for Linux).
What is Nginx?
Nginx (engine x) is a high-performance HTTP and reverse proxy web server that also provides IMAP/pop3/smtp services.
It is distributed under a BSD-like agreement and characterized by less memory and strong concurrent power. Nginx can be compiled and run on most Unix & Linux os and has a Windows port too.
In the case of high concurrency, Nginx is a good alternative to the Apache service: Nginx is one of the software platforms that dominating web hosting business supporting responses up to 50 000 concurrent connections thanks to Nginx for choosing Epoll and Kqueue as the development model.
The Nginx code is written entirely from the c language and has been ported to many architectures and operating systems including Linux, FreeBSD, Solaris, mac os x, AIX, and Microsoft windows.
Nginx has its own library of functions, and in addition to zlib, PCRE, and OpenSSL, standard modules only use system C library functions. Also, these third-party libraries may not be used if you do not need or consider potential authorization conflicts.
If you don’t have Windows 10 WSL (Windows Subsystem for Linux) enabled on your system yet, then simply go to the search section of Windows 10 and type “Turn Windows feature on or off” after that scroll and look for Windows subsystem for Linux option, check it and click on the OK button. This will enable it on your system. For step by step guide see this: How to enable WSL on Windows 10.
Step 2: Choose Linux Distro App for WIndows 10 WSL
Once you enabled WSL on your system, the next step is to procure some Linux distro app from Microsoft store. Here we are installing and using Ubuntu app on Windows 10 WSL. Just search for Microsoft store on your Windows 10 system and then in the search box type: Run Linux on Windows. The instructions of installing the Nginx stack will be the same for Debian and Kali Linux WSL images.
And select Ubuntu and then Get it.
Step 3: Run Ubuntu to install Nginx + PHPs on Windows 10 WSL
Once you open the Linux Ubuntu 18.04 WSL on your Windows 10 system it will exactly look and behave like any other Linux command terminal.
The first thing which we do is to update the Ubuntu Wsl, use the below-given command:
sudo apt-get update
sudo apt-get upgrade
Second is running of commands to install Nginx on Windows 10 Ubuntu WSL:
sudo add-apt-repository ppa:nginx/stable
sudo apt-get update
sudo apt-get install -y nginx
Step 4: Start Nginx web server service on WSL
We have successfully installed the Nginx on our Windows 10 WSL Linux app, now the thing which we have to do is starting off its service. For that use the below command
sudo service nginx start
Step 5: Test Nginx Webserver
Open your Windows 10 browser and type http:localhost:80
It will show the welcome screen of this web server as shown below in the screenshot.
"Welcome to nginx! If you see this page, the nginx web server is successfully installed and working. Further configuration is required. For online documentation and support please refer to nginx.org. Commercial support is available at nginx.com. Thank you for using nginx."
Step 6: Installing PHP for Nginx on Windows 10 WSL
The Webserver is ready now we have to install and configure PHP to use with Nginx open-source web server. Here we install modules PHP-FPM and PHP-MySQL to use PHP with both Nginx and MySQL.
Add repo:
sudo add-apt-repository ppa:ondrej/php
Check the latest PHP version available to install
sudo apt-cache show php
According to the available version, install the following PHP modules, in our case the latest version was php7.4
sudo apt-get install php7.4-cli php7.4-fpm php7.4-curl php7.4-gd php7.4-mysql php7.4-mbstring zip unzip
Check the installed version
php --version
Step 7: Start PHP-fpm service
Here is the command to start the installed PHP-fpm service
sudo service php7.4-fpm start
Step 8: Nginx Error (optional)
In case the following error such as occurs:
"502 Bad Gateway” “502 Bad Gateway NGINX” “502 Proxy Error” “502 Service Temporarily Overloaded” “Error 502” “HTTP Error 502 – Bad Gateway” “HTTP 502 Bad Gateway”
We have to configure PHP-fpm for Nginx otherwise PHP would not be able to contact Nginx:
Thus, open the php-fpm configuration file
sudo nano /etc/php/7.4/fpm/pool.d/www.conf
In the file find the PHP-fpm listening socket path:
listen = 127.0.0.1:9000
Change that to
listen= /run/php/php7.4-fpm.sock
Note: If you want to use some other version of PHP then replace the php7.4 with that version.
Configure PHP for Nginx Default site configuration
sudo nano /etc/nginx/sites-available/default
In the default site configuration, to use PHP with Nginx, first, we have to add index.php in that…
Find the below line and add index.php to the list.
index index.html index.htm index.nginx-debian.html;
# For example:
index index.php index.html index.htm index.nginx-debian.html;
Now find the below lines and do editing as mentioned below:
#location ~ \.php$ { # include snippets/fastcgi-php.conf; # # # With php-fpm (or other unix sockets): # fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # # With php-cgi (or other tcp sockets): # fastcgi_pass 127.0.0.1:9000; #}
Remove the # or uncomment the following things which as we have done here…
location ~ \.php$ { include snippets/fastcgi-php.conf; # # # With php-fpm (or other unix sockets): fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # # With php-cgi (or other tcp sockets): # fastcgi_pass 127.0.0.1:9000; }
After all the changes press CTRL+X and type Y and then press the Enter button to save the changes.
Restart Nginx and PHP-FPM services
sudo service nginx reload sudo service php7.4-fpm restart
Step 9: Create a test PHP file
Create an index.php file
sudo touch /var/www/html/index.php
Open it:
sudo nano /var/www/html/index.php
And add the following lines in that
<?php phpinfo();
Again press CTRL+X and type Y then press the enter button to save it.
Note: The root directory to save your project, so that you can call it using Nginx in the browser is just like Apache, i.e /var/www/
Step 10: Access the PHP info on Nginx WSL Windows 10 webserver
Finally, open the http:localhost or http:ip_address_of_your_system
Step 11: Install MySQL with Nginx on Windows 10 (optional)
If you also want to install MySQL on Windows WSL along with Nginx and PHP then here is the command:
sudo apt install mysql-server
To secure MySQL the command is:
sudo mysql_secure_installation
In this way, we can set up Linux, Nginx, PHP & MySQL on Windows WSL (Windows Subsystem for Linux)
Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров10K
Всем привет! В этой небольшой статье я очень сжато расскажу, как правильно настроить WSL в Windows 11 для локальной разработки Laravel-приложения. Мы собираемся установить php, mysql, nginx и composer, а также отредактировать файл hosts в самом Windows. Заранее прошу не гневаться на меня поклонников Docker, здесь я рассказываю именно про WSL.
Итак, без лишних промедлений, приступим. И начнем с того, что, как мы предполагаем, у нас есть Windows и всё. Если WSL уже установлен, львиную часть статьи можно пропустить.
Убедитесь в том, что ваша версия Windows совместима с WSL.
Установка WSL
Открываем PowerShell от имени Администратора и пишем:
wsl.exe --install
Подождем, когда установятся все компоненты, перезапустим компьютер, после чего окно WSL откроется автоматически и сразу запустится Ubuntu (по умолчанию установится именно Ubuntu) система попросит вас указать имя пользователя и пароль для WSL.
Устновка PHP
Мы будем устанавливать php 8.3. Для этого пишем по очереди:
sudo apt-get update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt install openssl unzip php8.3-cli php8.3-bcmath php8.3-curl php8.3-mbstring php8.3-mysql php8.3-tokenizer php8.3-xml php8.3-zip php8.3-fpm
Если никаких ошибок не возникнет, то всё, что нужно установится и мы можем продолжать.
Установка Composer
Чтобы нам установить Composer проводим следующие операции:
cd ~
curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
HASH=`curl -sS https://composer.github.io/installer.sig`
php -r "if (hash_file('SHA384', '/tmp/composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
sudo php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
Запустив команду composer -v мы должны будем получить примерно вот это:
Установка MySQL
Теперь установим БД:
sudo apt-get install mysql-server
После этого мы можем поменять пароль пользователя на password или любой другой, какой вам больше нравится. Для этого пишем:
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Пишем exit; и пробуем войти в БД с новым паролем. Должно всё получиться.
mysql -u root -p
Установка Laravel
Далее мы идем уже, скорее всего, по известному пути:
cd ~
mkdir dev
cd dev
composer create-project laravel/laravel test-app
Также для работы Laravel нам нужна БД, создаем и ее:
mysql -uroot -p -e "create database test"
Обязательно в самой папке приложения Laravel нам надо отредактировать .env файл, примерно так:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD=password
Теперь устанавливаем в БД необходимые для Laravel таблицы с помощью artisan:
cd test-app
php artisan migrate
У нас должно получиться примерно вот это:
Установка и конфигурация NGINX
Последнее, что нам осталось сделать — установить вебсервер. Для этого пишем:
sudo apt-get install nginx
Теперь важный момент: если мы хотим обращаться к нашему приложению по какому-то определенному адресу, тогда мы должны сделать некоторые правки в файле C:\Windows\System32\drivers\etc\hosts. Запускаем, к примеру, Блокнот обязательно от имени Администратора и добавляем в конце файла следующую запись:
127.0.0.1 test.test
Теперь давайте создадим конфигурационный файл nginx:
sudo nano /etc/nginx/sites-available/test.test.conf
В этом файле мы пишем следующее:
server {
listen 80;
listen [::]:80;
server_name test.test;
root /home/nikolay/dev/test-app/public;
add_header X-Frame-Options "SAMEORIGIN";
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/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
Поменяйте директивы server_name, root и, возможно, fastcgi_pass, если вы использовали другие пути и названия. После этого мы копируем созданный файл в директорию sites-enabled самого nginx.
sudo ln -s /etc/nginx/sites-available/test.test.conf /etc/nginx/sites-enabled/test.test.conf
Проверяем конфигурацию nginx:
sudo nginx -t
sudo nginx -s reload
Еще один важный момент: для того, чтобы у нас не было проблем с правами, мы должны немного изменить конфигурацию самого nginx:
sudo nano /etc/nginx/nginx.conf
Тут мы меняем самую верхнюю строчку, чтобы она совпадала с именем пользователя WSL (в моем случае — nikolay):
Также меняем группу пользователя и самого пользователя в fpm:
sudo nano /etc/php/8.3/fpm/pool.d/www.conf
Собственно и всё! Теперь остается только перезапустить fpm и nginx:
sudo service php8.3-fpm restart
sudo service nginx restart
И теперь если мы зайдем через любой браузер по адресу http://test.test мы увидим главную страницу свежеустановленного Laravel.
Спасибо за внимание, надеюсь, эта небольшая инструкция будет полезна.
P.S. Дорогие читатели, автор ни в коей мере не настаивает на такой реализации разработки под Windows. Данная статья писалась как решение конкретной задачи, а не как рекомендация к немедленному действию.