개요
Nginx를 이용한 LEMP스택을 구성하기 위해서 도커라는 컨테이너 시스템을 이용하려고 한다. 이에 도커에 대한 개념과 사용방법에 대한 간단한 지식을 갖고 LEMP 스택에 대해 알아본 다음, 도커의 컨테이너라는 곳에서 LEMP 스택을 구성해보자.
도커란?
아래 글('도커란 무엇인가')을 참고하면 될 것이다. 아래 내용에는 다음과 같은 내용이 들어가있다
LEMP 스택
- 운영체제 : Linux
- 웹 서버 : Nginx(엔진엑스)
- 데이터베이스 : Mysql(MariaDB)
- php
위 4개의 구성요소를 가지고 서버를 구성하게 되는 것을 LEMP 스택이라 한다. 또한 Nginx 대신 Apache를 사용한다면, LAMP스택이라고 한다.왜 LEMP 스택인가? - PHP 코딩과 그를 통한 웹페이지 구성을 위한 서버의 기초 구성
- 워드프레스는 데이터베이스를 이용하여 동적인 콘텐츠를 생산하는 php 기반으로 돌아가는 프로그램이다. PHP는 인터넷 위에서 작동하므로 wordpress를 사용하려면 웹 호스팅을 사용하기엔 번거롭다. 이에 내 컴퓨터에 서버환경을 만들어 웹 호스팅과 같은 환경을 구축할 수 있다. 기본적으로 PHP 언어를 사용할 수 있어야 하기 때문에 PHP프로그램이 깔려있어야 하고, PHP로 만든 콘텐츠를 인터넷 사용자에게 전달하는 역할을 Apache 또는 Nginx가 해줄 것이다. 또한 방문자의 클릭에 따라 다르게 보여질 글들이 저장되는 데이터베이스도 필요하다. 이에 Linux에 Nginx + PHP + Mysql 로 서버를 구축하는 것이 좋다.
- 자세한 건 여기에서
LEMP 스택 시작하기
1 Linux
나는 linux 운영체제의 여러 배포판 중 하나인 debain os의 버스터 버전을 사용하겠다.
docker run -it -p 80:80 --name test1 debian
2 Nginx
apt-get 패키지를 활용하여 nginx를 설치하겠다.
apt-get update;
apt-get -y upgrade;
apt -y install nginx;
3 PHP 연동
nginx에서 .php스크립트 언어를 사용하려 한다. 따라서 php를 설치하고 /etc/nginx/sites-available/default 파일을 수정해야 한다.
apt-get -y install php7.3 php-fpm;
php-fpm이란?
위의 php-fpm은 FastCGI Process Manager의 약자로 간단히 말해서 CGI 보다 빠른 버전이다. 그럼 여기서 CGI란 무엇인가? CGI란 Common Gateway Interfae의 약자로 정적 페이지가 아닌 동적 페이지를 위한 양방향 정보교환을 위해 필요한 프로그램이다. CGI는 요청을 받아 외부 프로그램에 넘겨주어 외부 프로그램이 그 파일을 html로 변환하는 단계를 거치게 되는데, FastCGI는 요청할 때 이미 생성된 프로세스를 가지고 구동하게 되어 CGI보다 처리가 빠르다.
php-fpm이 왜 필요한가?
- 아파치(Apache)는 PHP모듈이 있기에 처리가 가능하다
- 그에 반해, Nginx는 php-fpm을 따로 설치하여 연동을 시켜줘야만 한다.
PHP 연동을 위한 Nginx 환경 설정
Nginx에 php 언어를 쓰기 위해, 그리고 php-fpm 프로그램을 사용하기 위해 설정 파일을 변경해줘야 한다.
설정파일은 /etc/nginx/sites-available/
의 경로에 default라는 이름으로 있을 것이다. 없다면 해당 경로를 모두 만들어 주고 설정파일을 생성해주어 설정해줘야 한다.
# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
.
.
.
중략
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html index.php; #index.php를 맨 끝에 넣어주었다.
.
.
중략
# pass PHP scripts to FastCGI server
#
location ~ \.php$ { # 주석을 없애주었다.
include snippets/fastcgi-php.conf; # 주석을 없애주었다.
#
# # With php-fpm (or other unix sockets):
fastcgi_pass unix:/run/php/php7.3-fpm.sock; # 주석을 없애주었다.
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
} # 주석을 없애주었다.
.
.
.
}
위의 설정에서 해당 주석을 풀고 PHP를 사용하려면 위에 index.php를 추가해주자.
PHP 연동 확인
도메인 루트(/var/www/html
)에 들어가 index.php를 만들어 연동이 잘 되었는지 체크해본다.
- index.php
<?php phpinfo(); ?>
service nginx restart
로 nginx 설정 적용 후 재시작service php7.3-fpm restart
으로 fastcgi 적용 및 php연동 후 재시작- 로컬 컴퓨터의 터미널에 'curl localhost/index.php`을 입력하여 웹서버 Nginx가 잘 돌아가는 지 확인
- 또는 도메인에 localhost/index.php를 입력하여 사이트로 이동하여 phpinfo()가 잘 나오는지 확인
- ※ 위 방법을 진행했는데 phpinfo 화면이 잘 안나왔을 시 아래 내용을 확인해보자.*
- 포트가 잘 연결되었는지 확인해보자.
- 위와 같은 이미지가 있으면 docker 를 실행했을 때, 포트포워딩이 잘 안되었다는 것.
service nginx restart
부분에서 진행이 안되었을 시, nginx 설정파일에서 오류가 난 것.- 주석처리가 안된 부분이 있는지 체크해준다.(가령 {} <- 이런 블럭들이 쌍을 이루어 잘 주석을 풀었는지 확인)
mysql 연동하기
mysql은 데이터베이스 프로그램이다. 여기에 wordpress 등에서 보여줄 데이터베이스를 구성해준다. 각 단계는 다음과 같다.
- mysql 설치
- mysql 실행
- root 계정의 비밀번호를 생성(mysqladmin 명령어를 사용)
- wordpress 데이터베이스 생성
- wordpress만 다룰 사용자 계정 생성(권한 주고 저장하는 것까지)
- mysql 재실행
1. mysql 설치
apt -y install php-mysql mariadb-server
2 mysql 실행
service mysql start
3. root 계정 생성
mysqladmin -u root -p password #입력 후
Enter password:
이와 같은 커맨드라인이 뜨면 처음 생성할 땐 그냥 엔터 또는 비밀번호를 변경할 땐 기존 비밀번호를 입력해주면 된다.
그 이후 변경 또는 생성할 비밀번호를 두번 입력해준다
4. wordpress 데이터베이스 생성
mysql -u root -p
입력후 비밀번호 입력 -> mysql 로 들어가는 명령어(보안상 좋다 -> 비밀번호를 안보이게 입력할 수 있어서)
mysql -u root -p 1234
와 같이 비밀번호를 바로 입력하게 되면 바로 들어갈 수 있다. (하지만 보안엔 좋지 못함(비밀번호가 보여서))
mysql>
과 같은 커맨드라인이 뜬 후에
CREATE database IF NOT EXISTS wordpress;
: wordpress 데이터베이스 생성
SHOW databases;
: databases 목록에 wordpress가 있으면 성공적으로 생성한 것.
5. wordpress만 다룰 사용자 계정 생성(권한 + 저장)
mysql -u root -p
: 입력 후 비밀번호 입력
CREATE USER 'gildong'@'%' identified by '1234';
: 사용자 및 사용자의 비밀번호 설정(사용자: gildong, 비밀번호: 1234)
GRANT all privileges on wordpress.* to 'gildong'@'%' identified by '1234' WITH GRANT OPTION;
- grant : 권한을 승인해줌
- ALL PRIVILEGES : 모든 권한을
- on wordpress.* : wordpress 데이터베이스(스키마)에 대한 모든 테이블에 관한
- 'gildong'@'%' : gildong의 @ 모든 host에 대해서('%') => 내부 localhost 뿐만이 아니라 외부 ip로의 접속도 허용하게 해줌.
- identified by '1234' : gildong의 비밀번호인 1234로 확인: 변경사항을 바로 저장해준다.
FLUSH privileges;
6. mysql 재실행
service mysql restart
wordpress 설치 및 연동하기
wordpress는 apt 패키지에 없기 때문에 wget이나 curl 로 브라우저에서 다운을 받아야 한다. 아래와 같이 단계별로 실행해보자.
- wordpress 설치
- wordpress 소유자 변경
- wordpress 의 설정 파일 변경
wordpress 설치 및 압축해제 + 도메인 루트로 이동
wget https://wordpress.org/latest.tar.gz
tar -xvf latest.tar.gz
mv /wordpress/ /var/www/html
이제 localhost/wordpress로 접속이 가능해진다.
wordpress 소유자 변경 - wordpress 설정파일에 접근하기 위한 변경
chown -R www-data:www-data /var/www/html/wordpress
www-data
는 user 권한을 www-data로 바꿔줌.:www-data
는 group 권한을 www-data로 바꿔줌.
wordpress 의 설정 파일 생성
cp -p /var/www/html/wp-config-sample.php /var/www/html/wordpress/wp-config.php
이후 설정파일을 아래처럼 변경
wp-config.php
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );
/** MySQL database username */
define( 'DB\_USER', 'jungwkim' );
/** MySQL database password */
define( 'DB\_PASSWORD', '1234' );
/** MySQL hostname */
define( 'DB\_HOST', 'localhost' );
/** Database Charset to use in creating database tables. */
define( 'DB\_CHARSET', 'utf8' );
/** The Database Collate type. Don't change this if in doubt. */
define( 'DB\_COLLATE', '' );
www-data:www-data로 소유자 변경을 해주는 이유
- wp-config.php 파일을 수정 및 생성을 위한 권한을 주기 위해서
- wordpress GUI 서버를 통해 업로드 및 삭제를 하기 위해
- www-data란? 그리고 왜 사용해야 하는가?
- 위 링크를 통해 좀더 알아가자.
- www-data : 간단히 설명하자면, Ubuntu 의 웹서버(apache, nginx 등)가 기본적으로 일반 작업에 사용하는 사용자이다.
- 왜 사용해야하는지? : 간단히 설명하자면, 웹서버 프로세스는 www-data 파일에 엑세스 할 수 있고, 이 외의 중요한 점은 없다고 한다.
- Some web servers run as www-data. Web content should not be owned by this user, or a compromised web server would be able to rewrite a web site. Data written out by web servers will be owned by www-data.
추가 - phpmyadmin으로 데이터베이스를 쉽게 관리하자
phpmyadmin이란?
웹페이지에서 곧바로 자신의 리눅스 서버에 있는 DB 내용을 read, write, create, edit 등 DB에 관한 모든 걸 할 수 있는 웹어플리케이션이다.
서버에 데이터베이스 프로그램과 PHP, 웹서버가 모두 설치되어 있으면 사용할 수 있다.
DB 관리 툴이란?
- 보통은 CLI에서 SQL 문법을 입력하여 DB현황을 보고 명령어를 입력
- DB 관리 툴로 DB 제어를 클릭으로 컨트롤 가능
- GUI 사용
- SQL문을 직접 넣어서 실행 가능
- 클릭 등으로 데이터 검색등을 했을 때 그 동작에 해당하는 SQL문을 보여줌 → SQL문 공부도 가능
ex) Valentina Studio(발렌티나 스튜디오 - 맥앱. 맥 앱스토어), Sequel Pro (시퀄 프로. 맥 앱)
phpMyAdmin 의 장점
- 웹페이지로 접속 가능 → 언제 어디서나 사용 가능
- 무료
- 한글 지원
- 서버 입장에서는 로컬 접속이기 때문에 DB 외부 접속 설정이나 포트 방화벽 설정 같은 추가 설정을 해줄 필요 X → 곧바로 웹에서 로그인해서 사용하면 됨.
phpMyAdmin의 단점
- 웹상에서의 툴이라 한계가 분명함.
- 보안상 불안함을 지울 순 없다.
→ 누군가 웹페이지로 로그인하면 내 DB로의 접근이 가능)
phpmyadmin 연동하기
phpmyadmin은 docker container환경에서 apt 패키지로 설치가 안된다(애초에 apt 패키지가 안되는 건지 까지는 잘 모르겠다). 따라서 wget이나 curl 명령어를 통해 웹 사이트에서 다운 받아와야 한다.
phpmyadmin 압축파일을 다운 후에 압축 해제 후 해당하는 폴더(도메인 루트: /var/www/html)에 넣어준다.
wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.tar.gz
tar -xvf phpMyAdmin-5.0.2-all-languages.tar.gz -C /var/www/html
rm -rf *.tar.gz
mv /var/www/html/phpMyAdmin-5.0.2-all-languages /var/www/html/phpmyadmin
- tar 의 -C 옵션: 압축 파일을 풀 디렉토리를 설정한다.
- rm -rf *.tar.gz: 압축된 본 파일을 삭제해서 컨테이너 용량을 최대한 줄여준다.
- 도메인 루트에 넣어준 이유: localhost/phpmyadmin으로 접속할 수 있게 하기 위해서
- 이름 변경 이유 : phpmyadmin으로 접속할 수 있게 하기 위해서
※ 보안을 위한 설정
모든 개발자들이 phpmyadmin을 다음과 같이 해당 사이트 주소에 /phpmyadmin 이라고만 치면 들어갈 수 있게끔 해놓는다면 데이터베이스로의 접근이 보다 쉬워질 수 있다. 그래서 보통은 phpmyadmin 폴더를 /var/www 폴더에 두고 /var/www/html 폴더에 새로운 폴더를 만들어 phpmyadmin으로의 symbolic link(바로가기와 같은)를 걸어둔다.
mv /var/www/html/phpmyadmin /var/www/
ln -s /var/www/phpmyadmin /var/www/html/logindb
위와 같이 심볼릭 링크를 걸어두게 되면 localhost/logindb로 접속 할 수 있게 된다. 물론 해당 폴더 이름은 원하는대로 바꿀 수 있다.
작동 확인
이제 모든 설정이 끝났으니 Nginx와 php7.3-fpm, mysql을 재실행 하여 제대로 작동하는지 확인해준다.
service nginx restart
service php7.3-fpm restart
service mysql restart
- localhost 로 접속해보기
- localhost/logindb 로 접속해보기
- 로그인 해서 만들어둔 데이터베이스가 있는지 확인하기
- localhost/wordpress 로 접속해보기
※ 팁
.sql 파일 사용하기
mysql 로 들어가서 여러 명령어를 사용할 때 .sql 파일을 만들어 한번에 처리할 수 있다.
init.sql 파일
gildong 이라는 유저 생성(비밀번호는 1234 로 설정)
CREATE user 'gildong'@'%' IDENTIFIED BY '1234';
gildong 에게 모든 데이터베이스에 대한 모든 권한을 승인.
GRANT all PRIVILEGES on wordpress.\* to 'gildong'@'%' IDENTIFIED BY '1234' WITH GRANT OPTION;
변동 사항을 바로 저장.
FLUSH PRIVILEGES;
phpmyadmin 과 wordpress 데이터베이스를 생성해준다.
CREATE database IF NOT EXISTS wordpress;
그 이후에
mysql < init.sql
위와 같이 mysql 에 파일 하나만으로 적용할 수 있다. 쉘 스크립트에 넣어 여러가지 명령어를 한번에 실행할 때 mysql < init.sql
이 한 명령어만 넣어주면 되서 유용하다.
mysql root 비밀번호 없이 사용하기
쉘 스크립트를 통해 모든 것을 해결해야하는 것이라면 비밀번호를 설정할 때 대화형 쉘 창이 번거롭게 할 것이다. 이 때, mysqladmin으로 root 계정의 비밀번호 생성 없이 작업을 할 수가 있다.
echo "CREATE DATABASE IF NOT EXISTS wordpress;" \
| mysql -u root --skip-password
echo "CREATE USER IF NOT EXISTS 'gildong'@'localhost' IDENTIFIED BY '1234!';" \
| mysql -u root --skip-password
echo "GRANT ALL PRIVILEGES ON wordpress.* TO 'gildong'@'localhost' WITH GRANT OPTION;" \
| mysql -u root --skip-password
위와 같이 --skip-password
로 비번 생성 없이 작업을 진행할 수 있게된다.
nginx 설정파일에 관하여
/etc/nginx/sites-available
과 /etc/nginx/sites-enabled
폴더는 긴밀한 관계가 있다. 각 관계는 이러하다. 여러 설정 파일들을 sites-available 폴더에 담아놓고 설정하고픈 설정 파일을 하나 골라 sites-enables 폴더에 심볼링 링크를 하나 생성해 주는 것이다. 즉, sites-available 폴더엔 가능한 설정파일들을(즉, sites-available의 설정파일은 적용이 안된다.), sites-enabled 폴더엔 적용할 설정파일을 넣어 적용시켜준다.
ln -s /etc/nginx/sites-available/nginx.conf /etc/nginx/sites-enabled/nginx.conf
- sites-available 폴더는 단지 설정을 적어두는 용도 -> 적용이 안된다.
- 적용을 시켜줄려면 sites-enabled 폴더에 넣어두어야 하기 때문에 적용할 설정 파일만 sites-enabled에 넣어두고 심볼릭 링크를 걸어두는 것이다.
※ 참고: https://forteleaf.tistory.com/entry/nginx-site-enabled-site-availablemd
마무리하며
이상으로 LEMP스택을 활용하여 도커 컨테이너 안에서 웹서버를 구성해보았다. 아직 ssl 인증서를 통한 https 프로토콜을 사용하는 것과 autoindex 적용 및 https 로의 리다이렉션 까지는 정리하지 못했다. 다음 번엔 보다 안전하게 사용하기 위한 https 프로토콜과 보다 편하게 사용하기 위한 autoindex와 redirection까지 구현해보자.
'개발 > Web' 카테고리의 다른 글
Nginx(엔진엑스)란? - 1편: 개념 (2) | 2021.02.21 |
---|