한번에 끝내는 AWS Amazon Linux 웹서버세팅 (아마존리눅스 서버세팅)

HYEONG HWAN, MUN/ 12월 17, 2017/ 미분류/ 23 comments

https://blog.lael.be/post/6586

리눅스라는 컴퓨터 운영체제가 있습니다.

GPLv2 를 따르며 오픈소스이며, 매우 오래된 역사를 가지고 있습니다. 오랜 시간을 통해 검증이 된 운영체제이죠.

리눅스의 파생 운영체제로는 Ubuntu, Debian, CentOS, Fedora, Amazon Linux, Android, AIX, Redhat 등이 있습니다.

Ubuntu, Debian 는 데비안 계열의 운영체제이며 최신기술의 빠른 적용과 자동화가 특징인 운영체제입니다.

CentOS, Fedora, Amazon Linux, Android, AIX, Redhat 은 CentOS 계열이라고 하는데, 이 운영체제들 끼리는 명령어 및 폴더의 구조가 비슷합니다.

CentOS 및 Fedora 는 무료 오픈소스인데, 최신기술 적용이 심각하게 느립니다.

Redhat 은 유료 운영체제입니다. 1년에 120만원쯤 사용료가 있습니다.

Android 는 모바일 운영체제입니다.

AIX 는 IBM 서버에서만 쓸 수 있는 운영체제입니다.

Amazon Linux 는 Amazon Web Service 에서만 쓸 수 있는 운영체제입니다.

 

패키지 업데이트가 엄청나게 느린 CentOS 와는 다르게, Amazon Linux 가  최신 소프트웨어 설치를 제공하므로, 좋은 운영체제로 판단하고 이것의 설치법을 여기에 적어봅니다.

 

매우 자세히 적지만, 중간중간 과정생략이 있습니다.

 

* 서버 세팅방법

먼저 AWS 에 가입이 되어 있어야 합니다.

https://ec2.amazonaws.com

 

1. 운영체제 선택

Amazon Linux AMI(Amazon Machine Image) 를 선택합니다. 서버 생성 첫페이지 목록에서 고르세요.

Amazon Linux 2 라는 것이 생겨서 살펴봤는데, 아직 실사용하기엔 문제가 있어보이더군요. Amazon Linux AMI 를 선택합니다.

 

2. 기타 설정은 생략합니다. 사양만 잘 고르고 다음다음 누르시면 됩니다.

아무튼 쉘에 로그인

 

3. 현재 운영체제에 설치되어 있는 프로그램 최신버전 패치

# yum update

Amazon Linux 는 CentOS 계열이며 패키지 관리자 프로그램으로 yum 을 사용합니다.

 

4. 시스템 시간 설정 - Linux Timezone Setting

# vi /etc/sysconfig/clock

UTC 를 찾아서 Asia/Seoul 로 변경

이 부분을 찾아서

이렇게 변경.

 

다음의 명령어도 실행합니다.

# ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

시간 확인

# date

 

5. Nginx 웹서버 설치

어떤 버전이 설치되는지 확인하기

# yum info nginx

1.12.1 버전이 설치되겠네요. 충분히 최신버전입니다.

 

# yum install nginx
# service nginx start

 

http://당신의서버아이피/ 로 접속해서

이 화면이 나오면 됩니다.

6. PHP-FPM 설치

php 패키지 검색

# yum search php

 

많이 나올텐데

php56 또는 php70 또는 php71 을 설치하세요.

php 7.2 는 호환성 이슈가 있어서 설치하는 것을 추천하지 않습니다.

 

이 블로그 글에서는 php 7.1 을 설치하겠습니다.

# yum install php71-fpm

패키지 설치시에 어떤 것들이 추가로 설치되는지 한번쯤을 봐보세요.

 

* 널리 쓰이는 PHP 모듈 설치

# yum install php71-curl php71-mbstring php71-mcrypt php71-gd

추가로 설치하고 싶은 모듈이 있으면 yum search 명령어로 패키지명 확인 후 설치해보세요.

 

# service php-fpm-7.1 start

연동작업은 나중에 합니다.

 

 

7. MYSQL 설치

DB 서버 설치는 다루지 않겠습니다. 아마도 RDS 를 쓰겠죠.

여기서는 MYSQL 클라이언트 프로그램만 설치합니다.

# yum install mysql56
# mysql

이렇게 에러 메세지가 나오면 정상입니다.

 

* PHP MYSQL native driver 설치

# yum install php71-mysqlnd

php 에서 mysqli 및 pdo 함수를 사용할 수 있게 됩니다.

 

8. PHP Default timezone 설정하기

php 의 date 함수가 참조하는 timezone 을 설정합니다.

어느 파일을 수정해야 하는지 탐색
# cat /etc/php-7.1.d/php.ini
# ll /etc/php.ini
# ll /etc/alternatives/php.ini

 

결과적으로 php 콘솔에서 참조하는 파일은 /etc/php-7.1.ini 이고, php-fpm 에서 참조하는 파일은 /etc/php-fpm-7.1.conf 입니다.

# vi /etc/php-7.1.ini
# vi /etc/php-fpm-7.1.conf

 

date.timezone 값을 찾아서 주석을 제거하고 시간을 설정해주세요.

k21

이 값을 찾아서

 

k22

이렇게 변경.

 

9. 부팅시 자동실행 설정

자동으로 실행되는 서비스목록 확인하기

# chkconfig --list

저 2개의 서비스의 자동실행을 켜야 합니다.

 

# chkconfig nginx on
# chkconfig php-fpm-7.1 on

# chkconfig --list

 

* 테스트를 위해서 재부팅
# reboot

 

재부팅 후 다음 명령어로 확인

# service nginx status
# service php-fpm-7.1 status

 

10. 연동 설정

nginx 에서 php-fpm 으로 변수를 전달하는 파일(fastcgi_params) 수정
# vi /etc/nginx/fastcgi_params

https://blog.lael.be/demo-generator/ami-nginx/fastcgi_params.php 이 링크 문서에 쓰여진 내용대로 수정합니다.

 

일치하지 않는 도메인 요청 연결 사이트 (기본사이트) 수정
# vi /etc/nginx/conf.d/default.conf

https://blog.lael.be/demo-generator/ami-nginx/default.conf.php 의 문서를 참조합니다.

이 글에서는 첫번째 옵션일치하지 않는 도메인 모두 차단을 사용하겠습니다.

 

nginx 환경설정 수정

nginx.conf 의 기본값이 조금 이상하므로 다음과 같이 수정합니다. 왜 이렇게 바꾸는지 설명은 생략합니다. 적당히 이해해보세요.

# vi /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf;    다음 위치에   } 괄호를 입력하여 구문을 종료하고, 그 다음 내용을 모두 삭제한다.

그 후 그림과 같이 다음 구문 추가

    gzip on;
    gzip_min_length  10240;
    gzip_buffers  32 32k;
    gzip_comp_level 9;
    gzip_types    text/plain application/x-javascript text/xml text/css;
    gzip_vary on;

    server_tokens off;

 

최종적으로 이런 모습이어야 합니다.

 

제대로 작업했는지 확인 후 서비스 재시작

# service nginx configtest
# service nginx restart

 

 

11. 웹 사용자 추가

사용자 추가

# adduser myuser1

사용자 비밀번호 설정

# passwd myuser1

웹서버 사용을 위해서 권한 설정

# chmod 701 /home/myuser1

사용자 전환 후 웹 디렉토리 생성

# su -l myuser1
# mkdir www
# exit

 

12. 사용자 php-fpm 추가

https://blog.lael.be/demo-generator/ami-nginx/php-fpm-user.php 을 보고 추가합니다.

사용자당 1개의 파일을 작성해야 합니다.

# vi /etc/php-fpm-7.1.d/myuser1.conf

/etc/php-fpm-7.1.d/ 위치에 기본 파일 (www.conf) 이 있는데 그대로 내버려둡니다.

 

13. 사용자 nginx 파일 추가

https://blog.lael.be/demo-generator/ami-nginx/my-example-site.com.php 을 보고 설정합니다.

사이트 주소, 웹루트 디렉토리, 사용자 아이디를 입력합니다.

# vi /etc/nginx/conf.d/samplesite.com.conf

 

14. 설정파일 적용 및 테스트

# service nginx restart
# service php-fpm-7.1 restart

 

/home/myuser1/www 웹루트 위치에 적절한 파일을 업로드한 후에 웹브라우저로 접속해보세요.

세팅 완료!!

이제 원하는 서비스를 구동하시면 됩니다.

23 Comments

  1. 라엘님
    mariaDB를 사용하지 않고
    Mysql을 사용하신 특별한 이유가 있는지 궁금해요~

    1. 사실 둘다 똑같아요. 아무거나 선택한 겁니다.
      서버는 1년 무료 체험이 가능하면 EC2 t2.micro + RDS 사용하시고 (무료니까),
      무료 체험이 안되면 아마존 콘솔에서 lightsail 검색하셔서, 10달러짜리나 20달러짜리 사용하세요.

      1. 감사합니다.

        1. 계정새로 받아서 EC2 + RDS freetier 1년 무료 신청했습니다.
        2. lightsail 이것도 $20불 자리 ubuntu16.04 신청했다가 삭제했습니다.
        -> 이것은 선택할수 있는 amazon linux가 한개네요..
        이것이 AMI인지 확실치 않습니다.
        lightsail이것도 RDS 가능한지 모르겠습니다.
        이것도 라엘님의 댓글 확인하고 다시 신청하려고합니다.

        아마존에 질문해야 할것을
        라엘님께 여쭈어보아서 죄송합니다.

        1. lightsail 에서 AmazonLinux 선택 후 본문의 방법으로 세팅할 수 있습니다.
          lightsail 에서도 rds 비슷하게, “데이터베이스”라는것이 있습니다.

          1. 엄청 간단하게 셋팅되네요
            게다가 설정파일 제너레이터까지 있어서
            쉽고 편리하게 하였습니다.

            감사합니다.

  2. 안녕하세요 가장 먼저 좋은 자료 공유해주셔서 감사합니다.
    다름이 아니라 html 안에 php 소스를 넣어 웹브라우저에 접속하려하는데
    에러 없이 php 소스 동작만 생략되어 출력됩니다.
    예를 들어
    startfinish
    처럼 구성되어 있다면 startfinish 이렇게 출력되는데
    해결 방안을 얻을 수 있을까요?

    1. 예가 “ ” 입니다.

      1. 안녕하세요.
        html 에서 php 동작하게 하는 방법은 알지만, 매우매우 권장하지 않는 방법이므로 알려드리지는 않습니다.
        php 코드를 동작하게 하려면 php 파일에 작성해주세요.

        1. 무슨 말씀이신지 잘 이해되었습니다. 조언 감사합니다!

  3. 안녕하세요. 나중에 시간이 되신다면 php 7.2 도 설치하는 방법좀 부탁드립니다. 호환성 이슈가 많이 개선되었다고 해서 한번 써보고 싶네요… 항상 이곳에서 감사히 배우고 있습니다.

    1. PHP7.2 를 테스트 해봤는데, 워드프레스 같은 솔루션은 괜찮지만 그외의 소프트웨어는 문제가 좀 있습니다.
      현재, 대부분의 널리 쓰이는 웹솔루션이 PHP7.2 에서 정상 동작하지만, 많이 쓰이는(필수의) 플러그인/모듈이 동작 오류를 발생하더군요.
      아직은 7.0~ 7.1 쓰시길 권장합니다.

  4. 안녕하세요. 한줄 한줄 따라서 해보는 중입니다. date.timezone 부분을 수정할때..

    vi /etc/php-fpm-7.1.conf 에서 해당내용이 없는데요~ 생략해도 되는건지요?

  5. example.com www.example.com 로 들어오는 요청을
    무조건
    https://example.com(www 하지 않음)

    이렇게 보낼 수 있을까요?
    server {
    ,..
    server_name example.com www.example.com
    location / {

    rewrite ^/(.*)$ https://example.com/$1 permanent;

    }


    }

    server {

    server_name example.com www.example.com
    if ($host = ‘example.com’) {
    rewirte ^/(.*)$ http://example.com/$1 permanent;
    }

    }

    라엘님 주소줄인 제너레이터에
    이 구문 추가했습니다.

    1. 안녕하세요!
      그럴경우 if 보다는 그냥 server 구문 server_name 다르게해서 하나 더 만드시는게 좋아요.

  6. 감사합니다

    저 lael.be에서
    닉네임 다시 바꿀께요
    2019년도 부터
    웹에서 Computist로 사용할거예요
    라엘님 헷갈려하시지 말라고 뒤에 (SD)도 붙였어요
    SD은 이전 닉네임, 제이름의 이니셜 입니다.
    SDK에서 kim을 뺀 이름만이지요..

    악기 + ist 하면 연주자라는 뜻인데
    컴퓨터를 잘 다루고 싶은 마음으로 Compute + ist 로 정했습니다.

  7. 방문자의 위치 정보를 알려주는 모듈 설치 부분 중
    wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz 이 부분이 다운로드가 되지 않습니다. 어떻게 해야 할까요?

    1. 안녕하세요?
      2019년 1월 2일부로 GeoLiteCity 파일 지원이 종료되었네요. geolite-legacy-discontinuation-notice/
      우선 글 본문에서 관련 설정 부분을 제거하였습니다. 글을 다시 확인 후 적용해주세요.
      새로운 버전인 GeoLite2 의 적용방법을 확인 후 나중에 추가하겠습니다.

  8. 안녕하세요 nginx.conf 파일에

    include /etc/nginx/conf.d/*.conf;

    gzip on;
    gzip_min_length 10240;
    gzip_buffers 32 32k;
    gzip_comp_level 9;
    gzip_types text/plain application/x-javascript text/xml text/css;
    gzip_vary on;

    server_tokens off;

    geoip_country /usr/share/GeoIP/GeoIP.dat;
    geoip_city /usr/share/GeoIP/GeoLiteCity.dat;
    }

    추가하고 service nginx configtest 했는데

    nginx: [emerg] unknown directive “geoip_country” in /etc/nginx/nginx.conf:47
    nginx: configuration file /etc/nginx/nginx.conf test failed

    오류메세지 뜹니다.
    오타 찾아봐도 없는데 어느 부분이 문제일까요ㅠ

    1. 죄송합니다. 본문 스크린샷이 잘못 들어가 있었네요. (내용과 스샷화면이 달랐음)

      본문 글과 같이 server_tokens off; 까지만 적용해주세요. 스크린샷은 수정 업데이트 하겠습니다.

  9. 라엘님 안녕하세요

    이 방법대로 안정적으로 오랜?기간 잘 운영하고 있습니다.

    도메인을 변경해야 해서
    https://domin.com을
    https:///blog.domain.com로

    nginx conf.d 안에 있는 파일명을

    `domain.com.conf`에서 `blog.domain.com.conf’로 변경하고

    “`
    server {
    listen 80;
    server_name blog.domain.com;

    return 301 https://$server_name$request_uri;
    }

    server {
    listen 443 ssl http2;
    server_name blog.domain.com;
    “`

    이렇게 했는데

    다른 도메인(서버내 설치되어있는 사이트)로 이동되네요..

    혹시 제가 놓친부분이 있을까요?

    항상 감사드립니다

    1. 안녕하세요.
      return 301 https://$server_name$request_uri; 대신
      return 301 https://$host$request_uri; 로 바꿔주세요.

      감사합니다.

      1. 감사합니다
        좋은 오후 되셔요

Leave a Comment

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*