2017년 9월 14일 목요일

nginx 가상 호스트 설정하기

이전 포스트에서 nginx, php7-fpm, mariadb 설치 하는 과정을
적어 보았다
이제 가상 호스트 설정 하는 방법을 알아 보자
가상 호스트는 한 서버에서
여러 도메인을 사용 할 수 있는 기능을 말한다.
예를 들어 그누보드, 워드프레스, xe, 마젠토등을 설치하고
각각의 사이트에 도메인을 부여해서 운영 할 수 있는 방법이다.

이전 포스트를 보았다면 # 표시는 명령어가 아니고
터미널 표시인것을 알았을 것이다
그러므로 아래 내용에서 # 이 있는 줄의 내용은
그대로 복사해서(#은빼고) 터미널에 붙여 넣고 엔터를 치면 된다.

# sudo -i
위 명령어로 root 권한을 얻는다. 당연히 root 비밀번호를 입력해야 한다.

워드 프레스 가상 호스트를 만들어 보자
# adduser wordpress
위 명령어로 비밀번호를 입력하고 이름 같은건 대충 알아서 입력하면 된다.

# mkdir /home/wordpress/www
# mkdir /home/wordpress/log
# chown www-data.www-data /home/wordpress/
# chown www-data.www-data /home/wordpress/*

위 명령어로 웹의 최상위 디렉토리 www 를 만들고
접속 로그 기록을 위한 log 디렉토리를 만들고
wordpress 디렉토리에 www-data 권한을 주었다
php-fpm 은 www-data 권한으로 실행한다.


자 이제 php-fpm pool 파일을 작성해야 한다.
뭔 내용인지 모르면 그냥 따라 하면 된다.
# vi /etc/php/7.0/fpm/pool.d/wordpress.conf
위 명령어로 파일을 하나 만들고
그 내용을 아래와 같이 입력한다.

[wordpress]

user = wordpress
group = wordpress

listen = /run/php/wordpress.sock

listen.owner = wordpress
listen.group = www-data

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

;php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/wordpress.log
;php_admin_flag[log_errors] = on

;php_admin_value[memory_limit] = 128M
;php_admin_value[max_execution_time] = 120
;php_admin_value[max_input_time] = 300

;php_admin_value[post_max_size] = 25M
;php_admin_value[upload_max_filesize] = 25M

위와 같이 입력 후 저장하고
Nginx 서버 구문을 작성해야 한다

# vi /etc/nginx/conf.d/wordpress.conf
위 명령어를 실행 후
파일 내용을 아래와 같이 입력

server {
    listen       80;
    server_name  mydomain.com *.mydomain.com;
    root   /home/wordpress/www;

    access_log /home/wordpress/log/access.log;
    error_log  /home/wordpress/log/error.log warn;

    location / {
        index  index.php index.html;
        try_files $uri $uri/ /index.php?$args;
    }

    # Block dot file (.htaccess .htpasswd .svn .git .env and so on.)
    location ~ /\. {
        deny all;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # Block .php file inside upload folder. uploads(wp), files(drupal, xe), data(gnuboard).
    location ~* /(?:uploads|files|data)/.*\.php$ {
        deny all;
    }

    # Add PHP handler
    location ~ \.php$ {
                include snippets/fastcgi-php.conf;
        #
        #       # With php7.0-cgi alone:
        #       fastcgi_pass 127.0.0.1:9000;
        #       # With php7.0-fpm:
                fastcgi_pass unix:/run/php/wordpress.sock;
    }
}

위처럼 저장하면 된다.
만약 이미지, css 파일같은 static 컨텐츠를 브라우저 캐쉬 설정할려면
server 블럭 안에  아래 코드를 추가 하면 된다.

location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|ogv|webm|htc)$ {
  expires 1M;
  access_log off;
  add_header Cache-Control "public";
}

location ~* \.(?:css|js)$ {
  expires 1y;
  access_log off;
  add_header Cache-Control "public";
}

위 코드중 expires 의 설정이 캐쉬 기간 설정이다
1y는 1년, 1M은 한달, 1d는 10일, 1h는 한시간

자 위처림 했다면 이제 php와 nginx 를 재시작 해 준다.
# service php7.0-fpm restart
# service nginx restart

여기 까지 왔으면 도메인을 구매 하고 그 도메인을 서버로 연결 하면 된다.

자 다음 포스트에는 우분투에 ftp 설치 하고 접속하는 법을 알아 보자

우분투 nginx, php7.0-fpm, mariadb 설치 - ubuntu 16.04

이 글은 우분투 16.04버전에서 
엔진x, php7-fpm, mariadb 설치한것을 기록한다.

본인은 리눅스 서버 접속시 putty를 사용해서 접속한다
putty 다운로드는 구글에서 검색하면 많이 나오기 때문에 생략

우분투는 기본적으로 root 계정을 사용하지 못한다
root 계정이 필요한 경우 sudo 명령으로 root 권한의 명령어를 실행할 수 있다.

아래는 내가 설치한 내용을 그대로 옮겨 적었다.
# 표시는 명령어가 아니고 터미널에 입력한 명령이란 뜻이다.
그러므로 아래 내용에서 # 이 있는 줄의 내용은
그대로 복사해서(#은빼고) 터미널에 붙여 넣고 엔터를 치면 된다.

# sudo -i   
위 명령어로 root 권한을 얻는다 비밀번호를 입력하고 나면 root 권한 획득


# uname -a   
# cat /etc/issue  
# df -h
# free -m
# cat /proc/cpuinfo | grep processor | wc -l  
위 명령어는 순서대로 설명하자면
리눅스 버전 체크,
Ubuntu 버전체크,
하드용량체크,
메모리 체크,
cpu 코어수 체크
nginx, php, mysql(mariadb) 시스템을 설치 하는 과정에서 
위 명령어를 사용 할 필요는 없지만
한번쯤 확인해 보는것도 나쁘지 않을것 같기에 기록함

이제 본격적으로 셋팅
# apt-get update && apt-get upgrade
# dpkg-reconfigure tzdata
# sudo apt-get install gcc g++
위 명령어 설명은
패키지 목록 갱신 &&  운영체제에 설치되어있는 프로그램 최신버전 패치
시스템 시간 설정(건너뛰어도 됨)
gcc 컴파일러 설치 


# apt-get install sendmail
위 명령어는 php 코드로 메일발송시 서버가 메일을 발송할 수 있게 sendmail을 설치한다
그누보드 같은경우 메일인증이 있기 때문에 위 명령어는 필수
사실 거의 모든 사이트에서 메일인증및 메일 보내기를 사용하기 때문에
무조건 설치 해야 할듯...
위 명령어 실행시 경고 문구가 뜨는데 상관없음
Warning: 3 database(s) sources
were not found, (but were created)
please investigate.

#vi /etc/mail/local-host-names
위 명령어로 vi 편집기를 열어서 
localhost 만 남기고 다 지운후 저장하고 빠져 나온다


아래는 방화벽 설정 
# ufw status 
# ufw status verbose 
# ufw allow 22/tcp
# ufw allow 80/tcp
# ufw allow 443/tcp
# ufw enable
방화벽 상태,  방화벽 상태 자세히 보기, 
22번 tcp 포트 사용,
80번 tcp 포트 사용,
443번 tcp 포트 사용,
방화벽 활성화



이제 Nginx 설치하자
# apt-get install nginx -y

설치가 끝나면 vi 로 파일을 열어서 php 파일을 인식할수 있도록 설정을 해야한다
# vi /etc/nginx/sites-available/default
파일이 열리면 아래와 같은 줄을 찾아서
index index.html index.htm index.nginx-debian.html;
index.php 를 추가 해 준다.
결과 
index.php index index.html index.htm index.nginx-debian.html;


그리고 fastcgi_params 설정파일도 아래와 같이 수정

# vi /etc/nginx/fastcgi_params
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_FILENAME         $document_root$fastcgi_script_name;
fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
fastcgi_param   PATH_INFO               $fastcgi_path_info;
fastcgi_param   PATH_TRANSLATED         $document_root$fastcgi_path_info;
fastcgi_param   REQUEST_URI             $request_uri;
fastcgi_param   DOCUMENT_URI            $document_uri;
fastcgi_param   DOCUMENT_ROOT           $document_root;
fastcgi_param   SERVER_PROTOCOL         $server_protocol;
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;
fastcgi_param   HTTPS                   $https;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS         200;

이렇게 하면 Nginx 설치는 끝
이제 php 설치 하면 된다.

# apt-cache search php-mysql
# apt-cache search php7
ubuntu에서 소프트웨어, 라이브러리를 검색하는 명령어는 apt-cache 이다.
search 를 통해서 패키지검색을 할 수 있다.
apt-cache --help 명령어를 쳐 보면 더 많은 정보를 확인 할 수 있다.

# apt-get install php7.0-fpm php7.0-mysql php7.0-zip php7.0-json php7.0-xml  php7.0-mcrypt php7.0-curl php7.0-gd libapache2-mod-php7.0 php7.0-mbstring php7.0-soap
위 명령어로 php와 관련 라이브러리를 설치 한다.
설치가 끝나고 나면
# cd /var/www/html/
명령어로 해당 디렉토리로 이동후 
# vi index.php 
명령어로 파일을 만들고 
파일안에 아래 코드를 넣는다
<?php
phpinfo();
?>

이제 본인 웹 브라우저로 본인의 우분투 서버 아이피를 접속해 보면
php 환경 설정 내용을 확인 할 수 있다.

자 이제 php 설치를 마무리 했으니
환경 설정을 해보자.

# vi /etc/php/7.0/fpm/php.ini
위 파일을 열어서 아래 코드들을 찾아 수정해 준다
    cgi.fix_pathinfo = 0 // 비정상적으로 접근 차단
    allow_url_fopen = Off // 웹경로 방식으로 include 안됨
    expose_php = Off        // HTTP 헤더에 PHP 버전이 노출된다.
    display_errors = Off
    date.timezone = Asia/Seoul

    opcache.enable=1
    opcache.enable_cli=1
    opcache.memory_consumption=128
    opcache.max_accelerated_files=4000
    opcache.revalidate_freq=60

vi 편집기 안에서 문자열을 검색할 때는 /문자열 엔터
하면 문자열을 찾아 준다 같은 문자열이 여러개 일때는 n 키를 누르면
다음 검색으로 이동 한다.
위 파일을 수정하고 저장 했다면 아래 파일도 위와 같게 수정 해야 한다.
# vi /etc/php/7.0/cli/php.ini

수정을 다 했으면 php 대몬을 재시작
# service php7.0-fpm restart


자 이제 mariadb 설치를 하자
mysql 를 설치 해도 상관 없지만 mariadb 가 성능이 좋고
mysql 과 명령어 내용이 동일 하다고 해서 본인은 mariadb를 설치 했다.
참고로 그누보드도 mariadb 를 지원한다.
mariadb 설치 설치 위치는 /var/lib/mysql/ (그냥 참고 )

# apt-get install mariadb-server mariadb-client
위 명령어로 디비 설치
그리고 기본 환경 셋팅을 해야 한다 비밀번호 등
아래 명령으로 실행하면 된다.
# sudo /usr/bin/mysql_secure_installation
위 명령을 치면 DB 비밀번호를 입력하라고 하는데
금방 설치했기에 비밀번호가 없다 그래서 그냥 엔터를 치면 된다.
그리고 새로운 비밀번호 셋팅을 한건지 묻는데 Y를 입력후 비밀번호를 
설정한다
그리고 나머지 묻는거에는 대충 알아서 하면 된다.
test 디비 삭제 할건지, test유저 삭제 할건지, DB를 원격으로 root 접속 허용 할건지 등등
본인은 DB를 원격으로접속 할 일이 없기에 N,
test 디비와 test 계정 삭제는 Y 로 셋팅했다.

만약 mariadb 를 삭제 할때에는 아래처럼 하면 된다.
    sudo /etc/init.d/mysql stop
    sudo apt-get remove --purge mysql-server mysql-client
    sudo netstat -tap | grep mysql
    sudo apt-get remove --purge mysql-server*
    sudo apt-get remove --purge mysql-client*
근데 굳이 삭제할 일이 잘 없음 그냥 알아 놓자는 의미로 적었다.

db설정 파일을 조금 수정 해 주자
# vi /etc/mysql/my.cnf
vi 로 파일을 열어서 제일 마지막 줄에
아래 코드 추가
[mysqld] 
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci


그리고 디비 재시작
# service mysql restart 

자 이제 디비를 접속해서 새로운 데이트 베이스, 계정을 만들어 보자
# mysql -u root -p
위 명령어를 치면 DB root 비밀번호를 입력하라고 한다.
위에서 설정하면서 입력한 비밀번호를 입력후 db 에 접속한다.
접속을 성공하면 아래 명령어를 입력해서 새로운 계정과 디비를 만들어 준다
> 는 빼고 입력해야 한다.
>CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
>create user 'wordpress'@'localhost' identified by 'wordpress@1234';  
>grant all privileges on wordpress.* to wordpress@'localhost'; 
>exit;

자 이제 워드프레스 디비와 워드프레스 디비 계정을 만들고 
mariadb를 빠져 나왔다.
wordpress를 설치 하기 위해 위 명령어를 미리 입력 해 놓았다.

자 이제 워드프레스 설치 준비가 되었으니 
워드 프레서 설치를 해 보자
# cd /var/www/html
# wget https://wordpress.org/latest.tar.gz 
# tar xvzf latest.tar.gz
# chown www-data.www-data -R wordpress/
# chown www-data.www-data -R wordpress/*

위 명령어는 
웹서버 홈 디렉토리 이동,
워드 프레스 설치파일 다운로드,
압축 풀기,
wordpress 폴더 권한 설정  이다.
(php-fpm 은 www-data 권한으로 실행)

이제 브라우저로 http://서버아이피/wordpres 주소로 접속해 보자

워드 프레스를 다 설치 했으면 웹으로 디비관리를 쉽게 하기 위해
phpmyadmin 을 다운 받아 보자

# cd /var/www/html
# wget https://files.phpmyadmin.net/phpMyAdmin/4.5.2/phpMyAdmin-4.5.2-all-languages.zip
# apt-get install unzip
# unzip phpMyAdmin-4.5.2-all-languages.zip
# mv phpMyAdmin-4.5.2-all-languages.zip phpmyadmin

위 명령어 apt-get install unzip 는 zip 압축관련 프로그램 설치명령이고
unzip phpMyAdmin-4.5.2-all-languages.zip 는 압축해제 명령이고
mv phpMyAdmin-4.5.2-all-languages.zip phpmyadmin 는 파일명 변경 명령이다.

이제 브라우저로 http://서버아이피/phpmyadmin 주소로 접속해 보자
아미 아이디 비밀번호를 입력 하라는 창이 뜰 것이다.
이때 아까 위에서 워드프레스 db를 만들때
아이디 비밀번호도 만들었는데 그걸로 로그인 하면 된다.
본인은 아이디 wordpress 비밀번호 wordpress@1234 로 로그인 했다
아마 워드프레스를 설치 했다면 해당 테이블들이 설치 되어 있을 것이다.

다음은 가상호스트 설정 하는 방법도 쓸려고 했는데
글이 길어져서 다음 글에 기록 함