[소소한 개발 일지] serverless-nextjs를 통해 개발, 상용 스테이지로 나눠서 배포하기
ubuntu환경에서 nginx + php7 + mysql 설치하고 wordpress를 마이그레이션 합니다.
2018-01-19
Explanation
ubuntu 환경에서 nginx, php7, mysql 을 설치하고 기존의 wordpress를 마이그레이션하는 방법에 대해 적어보려합니다.
2019.05.30 참고사항
최근에 다시 해보니..
$ apt-get install php7.0-… // 7.0 버전이 설치가 되지 않아서, 저는
$ apt-get install php7.2-… // 로 설치하였습니다
ubuntu는 16.04.3 버전을 사용하며 wordpress 마이그레이션은 ‘Duplicator’ 플러그인을 사용합니다.
(글의 간략화를 위하여 명령어들은 슈퍼유저로 권한 상태로 가정하여 ‘sudo’ 명령어를 사용하지 않습니다.)
Duplicator 플러그인 : https://wordpress.org/plugins/duplicator/
1 2 3 4 5 6 7 |
// 비밀번호 생성 $ sudo passwd root // 비밀번호 입력 // 슈퍼유저로 접근 $ su // 비밀번호 입력 |
1 |
$ apt-get update |
$ apt-get update : 설치 가능한 패키지의 버전 리스트를 업데이트 합니다.
$ apt-get upgrade : 설치된 패키지들을 버전 리스트의 최신 버전으로 업데이트 합니다.
1 2 3 4 5 6 |
$ apt-get install nginx // 버전확인 $ nginx -v // ex. // nginx version: nginx/1.10.3 (Ubuntu) |
1 2 3 4 5 6 7 8 9 |
$ apt-get install php7.0-fpm // 버전확인 $ php -v // ex. // PHP 7.0.22-0ubuntu0.16.04.1 (cli) ( NTS ) // Copyright (c) 1997-2017 The PHP Group // Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies // with Zend OPcache v7.0.22-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend Technologies |
그냥 php를 설치하지 않고 php-fpm을 설치하는 이유는 아래의 php-fpm에 대한 설명을 참고하시면 조금 도움이 될 것 같습니다.
참고 : https://conory.com/blog/42956
1 |
$ apt-get install mysql-server mysql-client |
AWS RDS를 사용한다거나 외부 DB에 연결하여 사용한다면 mysql-client만 설치해도 되었던 것으로 기억합니다.
nginx의 가상호스트 설정의 구조는 크게 아래와 같습니다.
1 2 3 4 5 6 |
http { server { location { } } } |
아래의 파일이 nginx의 기본 설정입니다. 로그 파일 경로를 설정하거나 gzip 설정등.. 몇가지가 보입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ vi /etc/nginx/nginx.conf [/etc/nginx/nginx.conf] http { ... ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf include /etc/nginx/sites-enabled/* } |
가상 호스트에 관한 설정은 /etc/nginx/sites-enabled/ 디렉토리 안에 파일들을 인클루드해서 구성하는게 기본 설정입니다. 여기에서 /etc/nginx/sites-available(이하 sites-available)와 /etc/nginx/sites-enabled(이하 sites-enabled)의 디렉토리가 있는데, sites-available에 설정 파일을 추가, 작성하며 실제로 서버에 적용하고자 하는 속성 파일을 sites-enabled로 심볼링크를 만들어 서버에 적용합니다.
예를 들자면 sites-available에 aaa, bbb, ccc, ddd 라는 속성들을 선언하고 sites-enabled에 서버에 설정하고자 하는 aaa, bbb속성의 심볼링크를 생성하여 서버에 적용합니다.
1 2 |
$ ln -s /etc/nginx/sites-available/aaa /etc/nginx/sites-enabled/ $ ln -s /etc/nginx/sites-available/bbb /etc/nginx/sites-enabled/ |
워드프레스 공식 홈페이지에서 설명해주는 호스트 설정은 아래와 같습니다.
참고 : https://codex.wordpress.org/Nginx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# WordPress single site rules. # Designed to be included in any server {} block. # Upstream to abstract backend connection(s) for php upstream php { server unix:/tmp/php-cgi.socket; server 127.0.0.1:9000; } server { ## Your website name goes here. server_name domain.tld; ## Your only path reference. root /var/www/wordpress; ## This should be in your http block and if it is, it's not needed here. index index.php; location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } location / { # This is cool because no php is touched for static content. # include the "?$args" part so non-default permalinks doesn't break when using query string try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini include fastcgi.conf; fastcgi_intercept_errors on; fastcgi_pass php; fastcgi_buffers 16 16k; fastcgi_buffer_size 32k; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } } |
위 설정 그대로 적용해서는 실제로 워드프레스가 동작하지는 않고 저는 몇가지 수정을 하여 적용하였습니다.
(nginx 설정에 대해 지식이 얕아 아는 선에서 간단하게 작성하겠습니다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# upstream php { # server unix:/tmp/php-cgi.socket; # server 127.0.0.1:9000; # } # upstream 을 사용하지 않았습니다. server { listen 8000; # 8000번 포트로 접근하는 server_name cheolguso.com; # cheolguso.com 도메인은 root /home/ubuntu/cgs; # /home/ubuntu/cgs 디렉토리의 index index.php index.html; # index.php이나 없다면 index.html 파일을 시작점? 으로 설정 한다. location ~ \.php$ { # 접근한 URL이? .php 로 끝난다면 include snippets/fastcgi-php.conf; # fastcgi-php.conf 를 불러와서 fastcgi_pass unix:/run/php/php7.0-fpm.sock; # php 언어로 해석한다. } ... } |
대략 위와 같은 설정 파일을 /etc/nginx/sites-available/ 에 cgs라는 이름으로 작성하고 심볼링크 생성(ln -s /etc/nginx/sites-available/cgs /etc/nginx/sites-enabled/) 하였습니다.
Duplicator 으로 생성한 installer.php 파일과 ~~.zip 파일을 위 예제를 기준으로 /home/ubuntu/cgs/ 디렉토리에 업로드 한 후에 브라우저에서 http://cheolguso.com:8000/installer.php로 접속하면 플러그인에서 안내하는 절차에 따라 마이그레이션이 진행이 됩니다.
하지만 바로 접속하면 몇가지 오류가 뜨며 진행이 되질 않습니다.
‘mysql_connect’ 오류?? 인가가 뜨는데 아마도 이게 php7에서는 사라지고 다른것으로 대체되었던 것으로 기억이 나는데… 그게 아니라면 php와 mysql를 연결이 되지 않아서 생기는 오류였던것 같습니다. 아래와 같이 php7.0-mysql을 설치하면 해결이 됩니다.
1 |
$ apt-get install php7.0-mysql |
php에서 zip 파일의 압축을 풀 수 있도록 ZipArchive Library를 설치합니다.
1 |
$ apt-get install php7.0-zip |
그리고 수호신 보안에 관한 오류가 뜨는데 이부분 역시 php7에서는 기본적으로 포함하고 있는 것으로 알고 있습니다, 아마도 디랙토리 권한에 따른 설치 오류로 생각됩니다. 이부분은 일시적으로 파일의 권한을 수정해 줌으로써 해결합니다. 위 예제의 디렉토리를 기준으로 /home/ubuntu/cgs 디렉토리 이하의 모든 소유자와 그룹을 www-data로 수정해줍니다.
1 |
$ chown www-data:www-data /home/ubuntu/cgs -R |
위의 상황은 보안적으로 문제가 있을 수 있습니다. 마이그레이션 이후에 아래 8번을 참고하여 수정합니다.
위의 사항들을 수정 후 http://cheolguso.com:8000/installer.php로 접속하면 플러그인에서 안내하는 절차를 따라 진행하면 성공적으로 마이그레이션 될 것입니다.
워드프레스 디렉토리의 모든 파일과 디렉토리의 권한을 www-data로 하면 wordpress와 플러그인을 설치하거나 업데이트하기에 유용할 수 있지만, 이는 혹시 모를 php스크립트의 부실한 부분으로 누군가 접근하여 웹사이트 자체에 문제를 야기할 수 있습니다.
저는 개인적으로 모든 소유자와 그룹을 관리자 계정으로 하며, 일반적으로 사용하는 권한 디렉토리 755, 파일 644로 설정합니다.
1 2 |
$ find ./ -type d -exec chmod 755 {} \; $ find ./ -type f -exec chmod 644 {} \; |
그리고 예외적으로 ./wp-content/upload의 그룹은 www-data로 설정해주고 권한은 775를 설정해줍니다.
1 2 |
$ chown :www-data /home/ubuntu/cgs/wp-content/uploads -R $ chmod 775 /home/ubuntu/cgs/wp-content/uploads -R |
웹에서 이미지는 올릴수 있어야 하기에..
그리고 wordprss를 업그레이드 하거나, 플러그인을 추가하거나 할때에만 권한을 수정하여 적용하고 다시 되돌리며 사용하고 있습니다.