Windows 10의 WSL (Ubuntu-18.04)에서 LEMP 스택 구성하기

Windows 10의 WSL (Ubuntu 18.04)에서 Nginx, MySQL, PHP 7.3을 설치하고 새로운 Drupal9의 개발 환경을 구성해 보려고 합니다.

설치 👈

리눅스 배포판의 갱신

먼저 리눅스 배포판을 갱신하고 업데이트 합니다.

sudo apt-get update && sudo apt-get upgrade

Nginx의 설치와 실행

sudo apt install nginx
sudo service nginx start

이제 리눅스나 윈도우의 인터넷 브라우저를 띄우고 http://localhost 를 접근하면 Nginx Welcome 페이지를 볼 수 있습니다. 윈도우에서 접근이 가능한 이유는 WSL을 위한 Hyper-V Virtual Ethernet Adapter를 사용하고 있기 때문이죠.

MySQL 서버의 설치와 실행

sudo apt install mysql-server
sudo usermod -d /var/lib/mysql/ mysql
sudo service mysql start

작성 시점(2020-10-04)에서 설치 시 문제가 발생합니다. WSL의 버그로 보여지며 이것을 해결하기 위해서는 아래 Troubleshooting에서 확인합니다.

mysql의 root에는 기본적인 패스워드가 없습니다. 패스워드 설정을 다음과 같이 진행합니다.

sudo mysql_secure_installation  ## 패스워드 설정

이때 VALIDATE PASSWORD PLUGIN을 최초에 물어보는데 no를 하고 패스워드를 입력합니다. 로컬 환경에는 필요 없기 때문이죠. 😏

PHP 7.3의 설치

Drupal 9은 최소한 PHP 7.3버전의 환경을 요구합니다. 다음과 같이 설치합니다.

sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php7.3 php7.3-fpm php7.3-mysql php7.3-curl php7.3-json php7.3-mbstring php7.3-xml php7.3-bcmath
sudo service php7.3-fpm start

서버의 설정

모든 서버의 시작

이제 필요한 준비가 완료 되었습니다. 필요시 다음과 같은 내용을 ~/.bashrc나 ~/.zshrc에 넣어 터미널 시작 시 서버를 시작시킬 수 있습니다.

sudo /etc/init.d/nginx start
sudo /etc/init.d/php7.3-fpm start
sudo /etc/init.d/mysql start

Nginx 서버의 설정

PHP-FPM서비스를 사용할 수 있도록 다음과 같이 수정합니다.

sudo vi /etc/nginx/sites-available/default

다음 내용을 찾아서 변경합니다.

server {
        index index.php index.html index.htm index.nginx-debian.html;

...
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;

                # Make sure unix socket path matches PHP-FPM configured path above
                fastcgi_pass unix:/run/php/php7.3-fpm.sock;

                # Prevent ERR_INCOMPLETE_CHUNKED_ENCODING when browser hangs on response
                fastcgi_buffering off;
        }
...
}

서버를 다시 시작합니다.

sudo service nginx restart

다음과 같이 PHP 정보를 띄우도록 테스트 합니다.

sudo vi /var/www/html/info.php

<?php
phpinfo();
?>

이제 info.php를 인터넷 브라우저에서 실행해봅니다.

LEMP의 디버깅

이제 서버에서 LEMP가 뿌리는 로그를 다음 파일을 통해 확인하면서 디버깅 할 수 있습니다.

MySQL: /var/log/mysql/error.log
Nginx: /var/log/nginx/error.log
PHP: /var/log/php7.3-fpm.log

PHP-FPM은 성능을 이유로 로깅을 위한 설정이 기본적으로 비활성화 상태일 수 있습니다. 다음 파일에서 활성화 합니다.

sudo vi /etc/php/7.3/fpm/pool.d/www.conf
   catch_workers_output = yes  ## 코멘트 해제


sudo nano /etc/php/7.2/fpm/php-fpm.conf
   log_level = notice  ## 로그레벨 범위를 지정

## 설정을 적용하기 위해 재시작
sudo service php7.3-fpm reload

 

Troubleshooting

캐시 생성 에러

WSL을 사용하는 경우 myql을 시작하려고 할 때 다음과 같은 에러 발생

╰─❯ sudo service mysql start
 * Starting MySQL database server mysqld
No directory, logging in with HOME=/
mkdir: cannot create directory ‘//.cache’: Permission denied

다음과 같이 해결합니다.

## /etc/profile.d/wsl-integration.sh 파일 편집
# Check if we have HOME folder
if [ "${HOME}" = "/" ]; then
  return
fi


WSL_INTEGRATION_CACHE=$HOME/.cache/wslu/integration`
...

포트 에러

가끔 시작하지 못하는 경우 윈도우에서 이미 mysql이 구동중일 수 있습니다. 윈도우 혹은 리눅스의 포트번호를 변경합니다.

유닉스 소켓 에러

Ubuntu-18.04의 WSL에서는 다음과 같은 에러가 발생할 수 있습니다.

Cannot open /proc/net/unix: No such file or directory

/var/log/mysql/error.log 를 살펴보면 WSL에서는 AIO 인터페이스가 지원되지 않는 경우를 확인할 수 있습니다.

/etc/mysql/conf.d/no_native_aio.conf을 생성하고 다음과 같이 작성해 둡니다.

[mysqld]
innodb_use_native_aio = 0

이제 mysql을 구동시켜 봅니다.

sudo service mysql start

 

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

참고: https://stackoverflow.com/questions/39281594/error-1698-28000-access-den...

WSL에서는 UNIX 소켓 구현에 버그가 있는 듯 합니다. 따라서 mysql의 auth_socket을 기본적으로 인증을 사용하고 있는데 다음과 같이 변경해야 합니다.

$ sudo mysql -u root # 최초에는 sudo를 사용해 접근해야 함

mysql> USE mysql;
mysql> SELECT User, Host, plugin FROM mysql.user;

+------------------+-----------------------+
| User             | plugin                |
+------------------+-----------------------+
| root             | auth_socket           |
| mysql.sys        | mysql_native_password |
| debian-sys-maint | mysql_native_password |
+------------------+-----------------------+

mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;

$ service mysql restart
$ sudo mysql_secure_installation  ## 암호를 다시 설정하기

 

sean's picture

Language

Get in touch with us

"If you would thoroughly know anything, teach it to other."
- Tryon Edwards -