Programming/Technic

[Docker Server] 도커 기반의 PHP 웹 서비스 구성

minarae7 2023. 2. 3. 13:09
728x90
반응형

예전에는 PHP를 통해서 웹 서비스를 구성하는 것을 APM이라고 불렀다. Apache + PHP + Mysql의 앞 글자를 따서 이렇게 이름을 불렀던 것이다. 아파치는 굉장히 훌륭한 프로그램이고 기능도 다양하기 때문에 막강한 프로그램이다. 하지만 이렇게 기능이 많다는 얘기는 무겁고 설정이 어렵다는 의미가 되기도 한다.

실제로 아파치의 모든 설정을 다 알기는 쉽지 않다. 아파치는 다른 프로그램과 연동도 다양하기 진행할 수 있고 많은 역할을 할 수 있기 때문에 이에 대한 설정들은 꽤 복잡하고 어렵다.

그래서 그 대항마로 만들어진 것이 nginx라고 할 수 있을 것이다. nginx는 꽤 간단하고 설정도 간편하게 할 수 있지만 그렇다고 성능이 떨어지는 것도 아니였다. 그래서 10년여전부터 php 서비스를 구성할 때 아파치 대신 nginx를 사용하고 있다. 그리고 실무에서도 많은 곳에서 nginx가 사용되면서 다양한 레퍼런스를 만들어나가고 있다.

이 글 시리즈에서는 앞서 얘기했던 APM에서 Apache 대신 그 자리에 Nginx로 대체하고 이렇게 되면서 php도 일단 PHP가 아닌 단독으로 동작할 수 있는 PHP-Fpm을 설치하게 될 것이다.

검색을 해보면 보통 nginx + php-fpm + mysql 이렇게 세 가지 서비스를 모두 도커에 올려서 사용하도록 하고 있지만 이 글에서 도커에 올라가는 서비스는 php-fpm만이다. 실제로 nginx는 도커에 올렸을 때 드라마틱한 장점이 눈에 띄지 않고 mysql은 여러모로 장단이 있지만 도커로 운영하는 것이 호스트에 직접 설치하여 사용하는 것에 비해서 큰 이득이 없다고 판단한다. 물론 다른 서비스로 이관하거나 버전에 대한 이슈를 해결하기 위해서는 도커를 사용하는 것이 꽤 많은 이득이 있을 것이다. 하지만 이미 기존 환경으로 잘 운영하고 있다면 굳이 이 서비스를 도커로 옮겨서 퍼포먼스적인 손해를 볼 필요가 없을 것이다. 더군다나 RDBMS는 연산량이 많기 때문에 호스트의 자원을 온전히 사용하는 것이 유리하다고 판단한다.

그럼 nginx -> mysql -> php docker 설정과 같은 순으로 프로그램을 설정해나가도록 하겠다.

설치는 가급적 ubuntu 기본 명령어인 apt를 사용할 것이며 부득이한 경우에 한해서만 패키지를 직접 설치할 예정이다.

1. nginx 설치

다음 명령어를 입력하여서 먼저 nginx를 설치하도록 한다.

$ sudo apt update
$ sudo apt install -y nginx

위의 명령어로 nginx를 설치하고 브라우저에서 해당 서버에 접근하게 되면 아래 이미지와 같은 화면을 볼 수 있다.

해당 이미지는 nginx가 설치되고 나면 기본으로 보여지는 페이지이며 파일의 경로는 /var/www/html/index.nginx-debian.html 이다.  해당 파일을 열어보면 다음과 같이 위의 화면을 볼 수 있는 코드가 들어있다.

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

nginx는 이렇게 간단하게 설치만 하고 이후에 PHP 도커를 생성한 이후에 해당 Container와 연결하는 작업을 할 것이다.

2. mysql 설치

mysql도 nginx와 마찬가지로 apt을 통해서 설치할 것이다. 다음의 명령어를 통해서 mysql-server와 mysql-client를 설치한다.

$ sudo apt install -y mysql-server mysql-client

mysql-server를 설치하게 되면 패키지 관리자가 의존성을 확인하고 관련 필요한 패키지를 자동으로 설치해준다. Ubuntu 22.04 기준으로 설치되는 mysql-server의 버전(2023.02.01 기준)은 8.0.23이다.

설치가 완료되었다면 이제 mysql 관련 설정을 해주어야 한다. 우선 시스템이 재시작될 때 자동으로 프로그램이 실행되도록 설정한다.

$ sudo service start mysql
$ sudo systemctl start mysql.service

이렇게 해서 프로그램을 실행하고 재시동시 자동으로 프로그램이 올라오도록 한다. 이제 mysql에 접속해서 관련 설정을 진행한다.

우선 현재 root가 아닌 권한에서는 mysql root 권한으로 접근하는 것이 막혀있다. sudo를 통해서 root 권한을 획득한 후에 mysql에 접근하여야 한다. 이 때는 따로 패스워드를 지정하지 않아도 root로 접속할 수 있다. 아래 3 가지 명령어 모두 접속이 가능하다.

$ sudo mysql
$ sudo mysql -u root
$ sudo mysql -u root -p

-p 옵션을 붙이지 않으면 패스워드 없이 로그인이 되며 -p 옵션을 붙이면 현재 로그인한 사용자의 패스워드를 통해서 root로 접속이 가능하다. 우리는 이제 패스워드 없이 root로 로그인하는 것을 막고 다른 사용자를 추가하도록 할 것이다. 먼저 root로 패스워드 없이 로그인하는 것부터 막을 것이다. 아래 명령어를 입력하면 패스워드 없이 root로 로그인 하는 것을 막을 수 있으며 sudo로 시스템 root 권한을 취득하지 않은 상태에서 mysql에 root로 접근이 가능하다.

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

이전에는 IDENTIFIED 뒤에 붙는 WITH을 사용하지 않았지만 최근에는 어떤 방식의 인증을 사용할지 지정하도록 한다. 지정하지 않으면caching_sha2_password로 지정되는데 이렇게 되면 추후에 프로그램을 접근할 때 문제가 소지가 있어서 가급적 mysql_native_password 방식을 사용한다.

이제 보안을 위해서 다음 명령어를 입력한다.

$ sudo mysql_secure_installation

이 명령어를 입력하면 mysql을 위한 몇 가지 보안 설정이 진행된다. 아래를 참조하면 된다.

Securing the MySQL server deployment.

Enter password for user root: 

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: 
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) : 

 ... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : 

 ... skipping.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : 

 ... skipping.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : 

 ... skipping.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : 

 ... skipping.
All done!

여기서는 모두 기본값으로 설정하였다. 내용을 읽어보면 1. 패스워드의 유효성 체크를 할 것인지? 2. 익명의 사용자가 추가되어 있는데 이를 삭제할 것인지? 3. 원격에서 root로 접속하는 것을 차단할 것인지? 4. 누구나 접속할 수 있는 test database가 있는지 이를 삭제하고 ㅎ권한을 차단할 것인지? 5. 권한 설정을 즉시 반영할 것인지?를 묻고 있다. 기본값은 모두 Y이며 여기서는 모두 Y로 처리하였다.

마지막으로 원격에서 접속할 수 있도록 열어주어야 한다. 그래야 다른 서버에서 구동되는 프로그램에서 mysql로 접근이 가능하다.

$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

해당 파일을 열어서 아래와 같이 주석 처리를 해준다.

# bind-address            = 127.0.0.1

해당 설정은 로컬에서만 접속이 가능하도록 하는 설정이다. 여기를 #으로 주석처리하고 파일을 닫고 mysql을 재시작한다.

$ sudo service mysql restart

여기까지 정리하면 PHP를 제외한 기본적은 웹 서비스 서버의 구성을 마쳤다고 할 수 있다.

mysql에 관련된 내용은 이보다 복잡한 것들이 많기 때문에 여기서 이러게 기본적인 내용만 다루고 별도의 포스팅을 통해서 해당 내용을 정리하도록 하겠다.

mysql 관련해서는 아래 사이트는 참조하면 많은 도움이 될 것이다.

 

How To Install MySQL on Ubuntu 22.04 | DigitalOcean

 

www.digitalocean.com

 

728x90
반응형