리눅스

 

1 단계 - Nginx 설치

사이트 방문자에게 웹 페이지를 표시하기 위해 현대적이고 효율적인 웹 서버 인 Nginx를 사용합니다.

CentOS 7 EPEL 저장소를 추가하려면 터미널을 열고 다음 명령을 사용하십시오 :

sudo yum install epel-release

 

 

 

다음 오류 메시지

Loaded plugins: amazon-id, rhui-lb, search-disabled-repos
No package nginx available.
Error: Nothing to do

 

No package epel-release available.

 

CentOS-7 / 6에 EPEL 저장소를 설치하려면 다음과 같이 입력하면됩니다.

# yum install epel-release

 

어떤 이유로 EPEL 저장소를 설치하는 것은 불가능할 수 있습니다 yum.

 

예를 들어 CentOS Extras리포지토리가 비활성화 된 경우 이런 일이 발생할 수 있습니다 .

yum will say: “No package epel-release available”.

 

CentOS-7 에 EPEL 저장소를 설치하십시오 .

# rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

CentOS-6 에 EPEL 저장소를 설치하십시오 .

# rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

 

EPEL 설치 확인

 

Enabled By Default: The EPEL repository is enabled by default and its settings can be found in /etc/yum.repos.d/epel.repo.

# yum repolist | grep "^epel\|repo id"

 

 

EPEL 저장소 제거

다음을 실행하여 EPEL 저장소를 제거하면됩니다.

 

# yum은 epel-release를 제거합니다.

또는 다음 rpm -qa명령을 사용하여 EPEL 패키지 이름을 찾을 수 있습니다 .

# rpm -qa | grep warm

 

삭제는 다음과 같습니다.

# rpm -e epel-release-xx.noarch

 

sudo yum install yum-utils
sudo yum-config-manager --enable rhui-REGION-rhel-server-extras

 

 

 

 

 

 

    우리는 sudo명령을 사용하기 때문에 이러한 작업은 루트 권한으로 실행됩니다. 루트 권한으로 명령을 실행할 수있는 권한이 있는지 확인하기 위해 일반 사용자의 암호를 묻습니다.

    이제 Nginx 저장소가 서버에 설치되었으므로 다음 yum명령을 사용하여 Nginx를 설치하십시오 .

    sudo yum install nginx
    
    •  

    그런 다음 웹 서버가 설치됩니다.

    설치가 완료되면 VPS에서 Nginx를 시작할 수 있습니다.

    sudo systemctl start nginx
    
    •  

    웹 브라우저에서 서버의 공개 IP 주소를 방문하여 모든 사항이 계획대로되었는지 확인할 수 있습니다 (다음 표제 아래의 참고 사항을 참조하여이 정보가없는 공용 IP 주소가 무엇인지 확인하십시오). 이미):

    http://server_domain_name_or_IP/
    

    Open in a web browser:

     

    정보 및 테스트 목적으로 기본 CentOS 7 Nginx 웹 페이지가 표시됩니다. 다음과 같이 보일 것입니다 :

    CentOS 7 Nginx 기본값

    이 페이지가 표시되면 웹 서버가 올바르게 설치됩니다.

    계속하기 전에 부팅 할 때 Nginx를 시작하는 것이 좋습니다. 이렇게하려면 다음 명령을 사용하십시오.

    sudo systemctl enable nginx
    
    •  

    서버의 공용 IP 주소를 찾는 방법

    서버의 공용 IP 주소가 무엇인지 모르는 경우 찾을 수있는 방법이 많이 있습니다. 일반적으로 SSH를 통해 서버에 연결하는 데 사용하는 주소입니다.

    명령 줄에서 몇 가지 방법을 찾을 수 있습니다. 먼저 다음과 같이 iproute2도구를 사용 하여 주소를 가져올 수 있습니다.

    ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
    
    •  

    이렇게하면 한두 줄 뒤로 줄 수 있습니다. 두 주소는 모두 정확한 주소이지만 컴퓨터에서 하나만 사용할 수 있으므로 각 주소를 자유롭게 사용해보십시오.

    다른 방법은 방법을 알려 외부 파티를 사용하는 것입니다 그것은 서버를 본다. 특정 서버에 IP 주소가 무엇인지 묻는 방법으로이 작업을 수행 할 수 있습니다.

    curl http://icanhazip.com
    
    •  

    IP 주소를 얻는 데 사용하는 방법에 관계없이 웹 브라우저의 주소 표시 줄에 IP 주소를 입력하여 서버에 연결할 수 있습니다.

     

    2.  Maridab 설치 

     

    mysql 

    jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8
     

    https://zetawiki.com/wiki/CentOS7_MariaDB_%EC%84%A4%EC%B9%98

     

    CentOS7 MariaDB 설치

     

    # vi /etc/yum.repos.d/MariaDB.repo

     

    [mariadb]
    name = MariaDB
    baseurl = http://yum.mariadb.org/10.1/centos7-amd64
    gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
    gpgcheck=1

     

    # yum install MariaDB-server

     

     DB 시작 / 패스워드 변경

    # systemctl start mariadb

     

    /usr/bin/mysqladmin -u root password 'P@ssw0rd'

     

    netstat -anp | grep 3306

     

    접속확인

    # mysql -u root -p

     

    부팅시 자동시작 설정 

    부팅 시 자동 실행되도록 하기

    // Apache
    # systemctl enable httpd
    // MySQL
    # systemctl enable mysqld

     

    # systemctl enable mariadb

     

    서비스 상태 확인

    # systemctl status mariadb

     

    CentOS Mysql(Mariadb) 한글 깨지는 현상 해결
     

    # 1 

    mysql 콘솔 창에서 

    show variables like 'c%';

    을 입력하면 간단하게 character set을 확인.

     

     

    # 2

    vi /etc/my.cnf

    centos에서 해당 명령어로 my.cnf 설정 파일을 vi 편집기로 열어줍니다.

     

    # 3

    그런 다음 아래 내용을 추가 해줍니다.

     

    [client]

    default-character-set = utf8

     

    [mysqld]

    init_connect = SET collation_connection = utf8_general_ci

    init_connect = SET NAMES utf8

    character-set-server = utf8

    collation-server = utf8_general_ci

     

    [mysqldump]

    default-character-set = utf8

     

    [mysql]

    default-character-set = utf8

     

     

    # 4

    service mysql restart

    centos에서 데몬을 재실행 합니다.

    (만약 실패한다면, 설정에 오타가 있거나 버전이 위 설정을 지원하지 않는 것)

     

    다시 show variables like 'c%';로

    캐릭터 셋이 변경 되었는지 재차 확인합니다.

     

     

    # other problems

     

    만약 database가 여전히 latin1으로 표시된다면 기존에 생성한 database가

    latin1으로 설정 되어있기 때문인데, 

     

    drop database DB명;

    create database DB명;

     

    해당 database를 날려주고 재생성하면 정상적으로 UTF-8 인코딩으로 적용된 것을 확인할 수 있습니다.

     

    [우분투, 민트] MariaDB 원격접속 (외부접속) 허용하기

    /etc/mysql/my.cnf 파일수정

    혹은

    /etc/my.cnf

     

    aws 에서는 다음 아래 설정이 아니라 aws  의 보안에서 포트 개방을 한다.

    [clinet]

    port    = 3306   <- 원하는 포트번호로 변경

     굳이 포트번호를 변경할 필요는 없지만 알려진 포트번호를 사용하는 것보다 확실히 보안적인 측면에서는 낫다고 생각합니다.

     

    2. BIND-ADDRESS 주석처리

    [mysqld]

    bind-address    = 127.0.0.1  <- 맨 앞에 # 표시를 붙여서 주석처리 혹은 0.0.0.0 으로 처리하면 됩니다.

    #bind-address   = 127.0.0.1

     

    1. 새로운 데이터베이스를 생성합니다.

    $ mysql -u root -p

    MariaDB [(none)]> create database test;

     

     

    2. 위에서 생성한 데이터베이스를 사용할 사용자를 생성합니다.

    MariaDB [(none)]> create user 'test'@'%' identified by 'password';

     

     

    3. 사용자에게 권한을 부여하고 reload하여 사용자와 권한을 데이터베이스에 적용 바로 사용할수 있게 해줍니다.

    GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'localhost'

    위의 형식으로 맞추어 사용자와 Database를 지정하여 원격으로 접속할 수 있도록 권한을 줍니다.

     

    MariaDB [(none)]> grant all privileges on test.* to test@'%';

    MariaDB [(none)]> flush privileges;

     

     

    4. flush privileges는 쉘 상태에서도 실행할 수 있습니다.

    $ mysqladmin -u root -p reload

     

     

    5. mysql 서비스를 재시작합니다.

    $ sudo service mysql restart

     

    공유기나 방화벽 설정

     

    현재 나의 ip 는 다음과 같다.   그

    1.  GRANT ALL PRIVILEGES ON *.* TO 'root'@'175.112.156.44' IDENTIFIED BY 'my-new-password' WITH GRANT OPTION;

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Knoweldge87432' WITH GRANT OPTION;


    2. FLUSH PRIVILEGES;

    3.  create user `test`@`%` identified by '123!@#';

    4. create database ateama character set=utf8;
    5. grant all privileges on ateama.* to `test`@`%` ;

     

     

    toad for mysql freeware 8.0 툴 설치

    https://mariadb.com/kb/en/library/toad-for-mysql-80/

     

     

     

     

    2 -2 단계 - MySQL 설치 (MariaDB)

    이제 웹 서버를 설치하고 실행 했으므로 MySQL 드롭 인 대체품 인 MariaDB를 설치할 차례입니다. MariaDB는 커뮤니티에서 개발 한 MySQL 관계형 데이터베이스 관리 시스템입니다. 기본적으로 사이트가 정보를 저장할 수있는 데이터베이스에 대한 액세스를 구성하고 액세스를 제공합니다.

    다시 말하지만, 우리는 yum소프트웨어를 구입하고 설치할 수 있습니다. 이번에는 구성 요소가 서로 통신 할 수있게 도와주는 다른 "도우미"패키지도 설치합니다.

    sudo yum install mariadb-server mariadb
    
    •  

    설치가 완료되면 다음 명령을 사용하여 MariaDB를 시작해야합니다.

    sudo systemctl start mariadb
    
    •  

    이제 MySQL 데이터베이스가 실행 중이므로 간단한 보안 스크립트를 실행하여 위험한 기본값을 제거하고 데이터베이스 시스템에 대한 액세스를 잠급니다. 다음을 실행하여 대화 형 스크립트를 시작하십시오.

    sudo mysql_secure_installation
    
    •  

    프롬프트에서 현재 루트 암호를 묻습니다. 방금 MySQL을 설치 했으므로 MySQL을 설치하지 않았을 가능성이 높습니다. 따라서 Enter 키를 눌러 공백으로 두십시오. 그런 다음 루트 암호를 설정할지 묻는 메시지가 나타납니다. 가서 들어가서 Y다음과 같은 도구를 따르십시오.

    mysql_secure_installation prompts:
    

     

    Enter current password for root (enter for none):

    OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation.

    New password: password Re-enter new password: password Password updated successfully!

    Reloading privilege tables.. ... Success!

     

    나머지 질문의 경우 각 프롬프트에서 "ENTER"키를 눌러 기본값을 적용하십시오. 이렇게하면 몇 가지 샘플 사용자와 데이터베이스가 제거되고 원격 루트 로그인이 비활성화되며 MySQL이 변경 사항을 즉시 준수 할 수 있도록 이러한 새로운 규칙이로드됩니다.

    마지막으로해야 할 일은 MariaDB를 부팅 할 때 시작하는 것입니다. 이렇게하려면 다음 명령을 사용하십시오.

    sudo systemctl enable mariadb
    
    •  

    이제 데이터베이스 시스템이 설정되었고 계속 진행할 수 있습니다.

     

     

     

     

     

    3 단계 - PHP 설치

    PHP는 동적 컨텐츠를 표시하는 코드를 처리하는 우리 설정의 구성 요소입니다. 스크립트를 실행하고, MySQL 데이터베이스에 연결하여 정보를 얻고, 처리 된 컨텐트를 웹 서버에 전달하여 표시 할 수 있습니다.

    yum시스템을 다시 사용하여 구성 요소를 설치할 수 있습니다. 우리는 php-mysql과 php-fpm 패키지도 포함시킬 것입니다 :

    sudo yum install php php-mysql php-fpm
    
    •  

    PHP 프로세서 구성

    이제 PHP 구성 요소가 설치되었지만 설정을 좀 더 안전하게 유지하려면 약간의 구성 변경이 필요합니다.

    루트 권한으로 기본 php-fpm 설정 파일을 엽니 다.

    sudo vi /etc/php.ini
    
    •  

    이 파일에서 우리가 찾고있는 것은 cgi.fix_pathinfo를 설정하는 매개 변수입니다. 이것은 세미콜론 (;)으로 주석 처리되고 기본적으로 "1"로 설정됩니다.

    이는 PHP 파일이 정확히 일치하지 않으면 찾을 수있는 가장 가까운 파일을 실행하도록 PHP에 지시하므로 매우 불안정한 설정입니다. 이것은 기본적으로 사용자가 실행을 허용해서는 안되는 스크립트를 실행할 수있는 방식으로 PHP 요청을 만드는 것을 허용합니다.

    우리는 라인의 주석 처리를 제거하고 다음과 같이 이것을 "0"으로 설정함으로써이 두 조건을 모두 바꿀 것입니다 :

    /etc/php.ini 발췌

    cgi.fix_pathinfo=0
    

    작업이 끝나면 저장하고 닫습니다.

    다음으로 php-fpm 설정 파일을 엽니 다 www.conf.

    sudo vi /etc/php-fpm.d/www.conf
    
    •  

    listen매개 변수 를 지정하는 줄을 찾아서 다음과 같이 변경하십시오.

    /etc/php-php.d/www.conf - 1 of 3

    listen = /var/run/php-fpm/php-fpm.sock
    

    그런 다음 listen.ownerand 를 설정 listen.group하고 주석 처리를 제거한 행을 찾으십시오 . 그들은 다음과 같이 보일 것입니다.

    /etc/php-php.d/www.conf - 3 of 3

    listen.owner = nobody
    listen.group = nobody
    

    마지막으로 userand 를 설정하고 group"apache"에서 "nginx"로 값을 변경 하는 행을 찾으십시오 .

    /etc/php-php.d/www.conf - 3 중 3

    user = nginx
    group = nginx
    

    그런 다음 저장하고 종료하십시오.

    이제 다음과 같이 입력하여 PHP 프로세서를 시작하면됩니다.

    sudo systemctl start php-fpm
    
    •  

    이것은 우리가 한 변화를 구현할 것입니다.

    다음으로 부팅 할 때 php-fpm을 시작합니다 :

    sudo systemctl enable php-fpm
    
    •  

    4 단계 - PHP 페이지를 처리하도록 Nginx 구성

    이제 필요한 모든 구성 요소가 설치되었습니다. 우리가해야 할 일은 Nginx에게 동적 인 컨텐츠를 위해 PHP 프로세서를 사용하는 것뿐입니다.

    우리는 서버 블록 레벨에서이를 수행합니다 (서버 블록은 Apache의 가상 호스트와 유사합니다). 다음을 입력하여 기본 Nginx 서버 블록 구성 파일을 엽니 다.

    sudo vi /etc/nginx/conf.d/default.conf
    

     

    default.conf 없을 경우

    drwxr-xr-x. 2 root root   26 Nov 12 12:28 conf.d
    drwxr-xr-x. 2 root root    6 Mar  6  2018 default.d
    -rw-r--r--. 1 root root 1077 Mar  6  2018 fastcgi.conf
    -rw-r--r--. 1 root root 1077 Mar  6  2018 fastcgi.conf.default
    -rw-r--r--. 1 root root 1007 Mar  6  2018 fastcgi_params
    -rw-r--r--. 1 root root 1007 Mar  6  2018 fastcgi_params.default
    -rw-r--r--. 1 root root 2837 Mar  6  2018 koi-utf
    -rw-r--r--. 1 root root 2223 Mar  6  2018 koi-win
    -rw-r--r--. 1 root root 3957 Mar  6  2018 mime.types
    -rw-r--r--. 1 root root 3957 Mar  6  2018 mime.types.default
    -rw-r--r--. 1 root root 2467 Mar  6  2018 nginx.conf
    -rw-r--r--. 1 root root 2656 Mar  6  2018 nginx.conf.default
    -rw-r--r--. 1 root root  636 Mar  6  2018 scgi_params
    -rw-r--r--. 1 root root  636 Mar  6  2018 scgi_params.default
    -rw-r--r--. 1 root root  664 Mar  6  2018 uwsgi_params
    -rw-r--r--. 1 root root  664 Mar  6  2018 uwsgi_params.default
    -rw-r--r--. 1 root root 3610 Mar  6  2018 win-utf

     

    nginx.conf

    백업 

    cp nginx.conf nginx.conf-copy

    백업 후 nginx.conf  변경

     

     

     

      현재 주석을 제거한 Nginx 기본 서버 블록은 다음과 같습니다.

      /etc/nginx/conf.d/default.conf - 원본

      server {
          listen       80;
          server_name  localhost;
      
          location / {
              root   /usr/share/nginx/html;
              index  index.html index.htm;
          }
          error_page   500 502 503 504  /50x.html;
          location = /50x.html {
              root   /usr/share/nginx/html;
          }
      }
      

      저희 사이트에서이 파일을 약간 변경해야합니다.

      • 첫째, 디렉토리가 요청 될 때 PHP 인덱스 파일을 제공 할 수 있도록 index.php 옵션을 index 지시문의 첫 번째 값으로 추가해야합니다
      • 또한 서버의 도메인 이름이나 공용 IP 주소를 가리 키도록 server_name 지정 문을 수정해야합니다
      • 실제 구성 파일에는 오류 처리 루틴을 정의하는 주석 처리 된 일부 행이 포함됩니다. 해당 기능을 포함하는 주석 처리를 제거합니다.
      • 실제 PHP 처리를 위해서는 다른 섹션의 일부를 주석 해제해야합니다. try_files 지시어를 추가하여 Nginx가 PHP 프로세서에 잘못된 요청을 전달하지 않도록해야합니다.

      아래 텍스트에서 빨간색으로 변경해야합니다. 원할 경우 모든 것을 복사하여 붙여 넣기 한 다음 값을 server_name해당 도메인 이름 또는 IP 주소 로 바꿀 수 있습니다.

      /etc/nginx/conf.d/default.conf - 업데이트 됨

      server {
          listen       80;
          server_name  server_domain_name_or_IP;
      
          # note that these lines are originally from the "location /" block
          root   /usr/share/nginx/html;
          index index.php index.html index.htm;
      
          location / {
              try_files $uri $uri/ =404;
          }
          error_page 404 /404.html;
          error_page 500 502 503 504 /50x.html;
          location = /50x.html {
              root /usr/share/nginx/html;
          }
      
          location ~ \.php$ {
              try_files $uri =404;
              fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
              fastcgi_index index.php;
              fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
              include fastcgi_params;
          }
      }
      

      위의 변경을 수행하면 파일을 저장하고 닫을 수 있습니다.

      필요한 변경을하려면 Nginx를 다시 시작하십시오.

      sudo systemctl restart nginx
      
      •  

      5 단계 - 웹 서버에서 PHP 처리 테스트

      우리 시스템이 PHP에 맞게 설정되었는지 테스트하기 위해 아주 기본적인 PHP 스크립트를 만들 수 있습니다.

      이 스크립트를 호출합니다 info.php. 아파치가 파일을 찾아 올바르게 제공하려면 "웹 루트"라고하는 매우 특정한 디렉토리에 저장해야합니다.

      CentOS 7에서이 디렉토리는에 있습니다 /usr/share/nginx/html/. 다음과 같이 입력하여 해당 위치에 파일을 만들 수 있습니다.

      sudo vi /usr/share/nginx/html/info.php
      
      •  

      빈 파일이 열립니다. 우리는 유효한 PHP 코드 인 다음 텍스트를 파일에 넣기를 원합니다.

      PHP 스크립트 테스트

      <?php phpinfo(); ?>

      작업이 끝나면 파일을 저장하고 닫습니다.

      이제 우리는 웹 서버가 PHP 스크립트에 의해 생성 된 내용을 올바르게 표시 할 수 있는지 여부를 테스트 할 수 있습니다. 이 문제를 해결하려면 웹 브라우저에서이 페이지를 방문하면됩니다. 서버의 공용 IP 주소가 다시 필요합니다.

      방문하려는 주소는 다음과 같습니다.

      http://your_server_IP_address/info.php
      

      Open in a web browser:

       

      페이지는 다음과 같이 보일 것입니다 :

      CentOS 7 기본 PHP 정보

      이 페이지는 기본적으로 PHP 관점에서 서버에 대한 정보를 제공합니다. 디버깅 및 설정이 올바르게 적용되었는지 확인하는 데 유용합니다.

      이것이 성공하면 PHP가 예상대로 작동합니다.

      실제로이 테스트가 끝나면 허가받지 않은 사용자에게 서버에 대한 정보를 줄 수 있으므로이 파일을 제거하고 싶을 것입니다. 이렇게하려면 다음을 입력하십시오.

      sudo rm /usr/share/nginx/html/info.php
      
      •  

      나중에 정보에 다시 액세스해야하는 경우 언제든지이 페이지를 다시 작성할 수 있습니다.

       

       

       

      4. php 타임존 설정

      # vi /etc/php.ini 

      # systemctl restart php-fpm

      # systemctl restart nginx
       

       

       

       

       

      5. LetsEncrypt 무료 SSL인증서 적용 및 자동 갱신하기

       

      Certbot 로 발급 받은 것이지만 LetsEncrypt 이다.

       

       

      1.  https://blog.naver.com/PostView.nhn?blogId=itperson&logNo=220853849351&beginTime=0&jumpingVid=&from=search&redirect=Log&widgetTypeCall=true

       2. https://blog.perfectacle.com/2017/10/05/letsencrypt-with-certbot-feat-aws/

       

      Nginx 서비스 정지

      현재 서버를 구동중이라면 인증서 생성 시 문제가 발생할 수 있으므로 nginx 서비스를 중단한다.

       systemctl stop nginx

       

      위 두사이트를 보고 진행하였다.

      aws 도메인을 사용했는데 , 안되었다.  그래서  freenom.com 무료 도메인 구입후 진행하였다.

      myssl.ml

       

      1번에서 apt-get install letsencrypt -y 설치하였으나 우분트 버전차이인지 설치가 안되었다

      그래서 2번링크에서 다음과 같이 진행하였다.

       

      curl -O https://dl.eff.org/certbot-auto

      chmod +x certbot-auto

      mv certbot-auto /usr/bin/certbot-auto

       

      그리고 실제 SSL 인증서를 발급받아보도록 하자.
      현재 AWS Linux는 아직 정식 지원이 아닌지 –debug를 붙여줘야한다.

       

      certbot-auto certonly --standalone -d 발급받을도메인

      certbot-auto certonly --standalone --webroot-path=/home/ubuntu -d myssl.ml

       

       

      SSL 인증서 생성

      위와 같이 했더니,   ls -al /etc/letsencrypt/archive/

      ls -al /etc/letsencrypt/archive/

      myssl.ml 폴더가 설치 되었고. myssl.ml 폴더에는 다음과 같은 파일들이 설치 되었다.

      root@ip-172-31-21-231:/etc/nginx/conf.d# ls -al /etc/letsencrypt/archive/myssl.ml/
      total 24
      drwxr-xr-x 2 root root 4096 Oct 19 15:01 .
      drwx------ 3 root root 4096 Oct 19 15:01 ..
      -rw-r--r-- 1 root root 2130 Oct 19 15:01 cert1.pem
      -rw-r--r-- 1 root root 1647 Oct 19 15:01 chain1.pem
      -rw-r--r-- 1 root root 3777 Oct 19 15:01 fullchain1.pem
      -rw-r--r-- 1 root root 1704 Oct 19 15:01 privkey1.pem

       

       

       

      Strong Diffie-Hellman Group 생성

      더 강력한 보안을 위해 아래 명령어를 통해 2048 비트나 4096 비트 암호화를 적용시켜 줄 수 있다.
      높은 비트의 암호화를 적용시키다보니 생성하는데 몇 분 이상의 시간이 소요될 수 있고,
      결과 파일은 명령어에서 지정한 대로 dhparam 파일에 저장된다.
      여기서는 2048 비트를 적용하였다.

      sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

      Nginx 설정에 적용할 파일 생성

      차후 설정을 쉽게 적용, 변경할 수 있도록 /etc/nginx/snippets 디렉토리에 아래와 같은 2개의 파일을 만든다. example.com 부분은 자신의 도메인명을 적어주면 된다.

       

      sudo vi /etc/nginx/snippets/ssl-example.com.conf

      sudo vi /etc/nginx/snippets/ssl-params.conf

      ssl-example.com.conf 파일 내용

      이 파일은 아까 설정한 SSL 인증서 경로를 지정해주는 역할을 한다.
      아래 2줄을 입력한 뒤 저장하고 빠져나오자.

      ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;

      ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

      => 도메인

      ssl_certificate /etc/letsencrypt/live/myssl.ml/fullchain.pem;

      ssl_certificate_key /etc/letsencrypt/live/myssl.ml/privkey.pem;

       

       

      /etc/nginx/snippets/ssl-params.conf

      이 파일은 SSL 보안에 관한 설정을 해주기 위한 것으로, 물론 필수는 아니지만 설정해주는 것이 좋다.
      아래 설정정보는 여기를 참고하였으며, 위에서 생성해두었던 dhparam 암호화 파일은 최하단 부분에서 
      불러오고 있다는 점을 확인하고 넘어가자.

      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

      ssl_prefer_server_ciphers on;

      ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

      ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0

      ssl_session_cache shared:SSL:10m;

      ssl_session_tickets off; # Requires nginx >= 1.5.9

      ssl_stapling on; # Requires nginx >= 1.3.7

      ssl_stapling_verify on; # Requires nginx => 1.3.7

      #resolver $DNS-IP-1 $DNS-IP-2 valid=300s;

      resolver 8.8.8.8 8.8.4.4 valid=300s;

      resolver_timeout 5s;

      # Disable preloading HSTS for now. You can use the commented out header line that includes

      # the "preload" directive if you understand the implications.

      #add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

      add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";

      add_header X-Frame-Options DENY;

      add_header X-Content-Type-Options nosniff;

      ssl_dhparam /etc/ssl/certs/dhparam.pem;

       

      Nginx 설정 파일 수정

      이제 sites-available의 nginx 파일을 수정해줄 차례다. 
      default 파일을 그대로 사용해도 되고 다른 파일을 만들어줘도 되는데, default 파일을 사용한다면 미리 백업을 해두는 것이 좋겠다.

      sudo vi /etc/nginx/sites-available/default

       

      만약을 대비해 default  카피로 백업해 두자

       

      일단 파일을 열고 아래 내용을 작성한다.
      이것은 example.com 과 www.example.com 에 http, 80번 포트로 들어오는 모든 요청을
      https 로 받아들이겠다는 내용이다.

      server {

          listen 80 default_server;

          listen [::]:80 default_server;

           server_name example.com www.example.com;

           return 301 https://$server_name$request_uri;

      }

       

       

      그리고 동일한 파일 내에 또 다른 서버블록을 만들어 다음 내용을 입력한다.
      추가로 필요한 설정이 있다면 이 곳에 같이 입력한다.

      server { 

          listen 443 ssl http2 default_server;

            listen [::]:443 ssl http2 default_server;

            include snippets/ssl-example.com.conf;

           include snippets/ssl-params.conf;

      }

       

      =>

       


      server {
          listen 80 default_server;
          listen [::]:80 default_server;
          server_name myssl.ml  www.myssl.ml;
          return 301 https://$server_name$request_uri;
      }

      server {
          listen 443 ssl http2 default_server;
          listen [::]:443 ssl http2 default_server;
          include snippets/ssl-example.com.conf;
          include snippets/ssl-params.conf;
      }

       

       

      위와 같이 입력했을 경우 80번 포트는 사용하지 않고 443 포트로만 사용하겠다는 것인데, 
      굳이 두 포트를 모두 사용하겠다면 두 개로 나눈 서버 블록을 한 곳에 같이 입력해주면 된다.

      그리고 위 설정을 default 파일에 했다면 상관없지만, 다른 파일을 생성했다면 /etc/nginx/enables 디렉토리에 심볼릭 링크를 걸어주어야 한다. example 부분을 자신이 만든 파일이름으로 바꿔주자

      sudo ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled

      이제 nginx 설정에 이상이 없는지 체크해본다.

      nginx -t 명령을 입력하고 아래와 같이 나오면 성공이다.

      root@ip-172-31-21-231:/etc/nginx/sites-available# nginx -t
      nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
      nginx: configuration file /etc/nginx/nginx.conf test is successful

       

      서버환경에 따라 서버환경에 맞게 

      HTTPS 방화벽 설정

      sudo ufw allow 'Nginx Full'

      만약 https 로 암호화 통신만 하고 HTTP 를 사용하지 않겠다면 아래 설정을 추가한다.

      sudo ufw delete allow 'Nginx HTTP'

      status 명령으로 제대로 설정되었는지 확인해본다.

      sudo ufw status

       

      nginx 구동

      service nginx start

       

      ssl 검증 사이트

      https://www.ssllabs.com/ssltest/analyze.html

       

       

      자동 갱신하기

      Certbot으로 발급 받았다 하더라도 Let’s Encrypt의 SSL 인증서를 발급받은 것이기 때문에 유효기간은 90일이다.
      따라서 수동으로 갱신할 때 명령어는 다음과 같다.

      certbot-auto renew
      
      하지만 갱신일이 30일 이상 남은 경우에는 아래와 같은 오류를 보게될 것이다.
      Cert not yet due for renewal
      
       

       

       

      따라서 테스트를 위해서는 –dry-run 옵션을 추가해야한다.

      certbot-auto renew --dry-run
      

       

       

      하지만 이번에는 아래와 같은 오류가 나게 된다.

      produced an unexpected error: Problem binding to port 443: Could not bind to IPv4 or IPv6.. Skipping.

      All renewal attempts failed. The following certs could not be renewed

       

       

      갱신하려는 인증서를 이미 nginx 서버에서 사용중이기 때문에 갱신이 불가능하다는 내용이다.
      따라서 nginx를 스탑하고 갱신하고 다시 start 해야하는데 귀찮으므로 hook 옵션을 제공해서 아래와 같이 사용하면 된다.

      certbot-auto renew --pre-hook "service nginx stop" --post-hook "service nginx start" --dry-run
      

       

      드디어 아래와 같은 성공 메시지를 보게 될 것이다.

      Congratulations, all renewals succeeded. The following certs have been renewed:
      

       

       

      하지만 아직 테스트 단계이므로 실제로 갱신이 이루어지지는 않는다.
      갱신일이 궁금하다면 아래 커맨드를 입력하면 된다.

      echo | openssl s_client -connect localhost:443 2>/dev/null | openssl x509 -noout -dates
      

       

       

      30일 남았는지 일일이 체크해서 갱신하기란 매우 귀찮다.
      따라서 매달 1일에 갱신하는 커맨드를 실행하게 끔 crontab을 사용하자.

      # 잡을 등록

      crontab -e

      # 그리고 아래 잡을 추가하고 저장하자.

      0 0 1 * * certbot-auto renew --pre-hook "service nginx stop" --post-hook "service nginx start"

      # 등록된 잡 목록 보기

      crontab -l

       

       

      crontab 규칙은 crontab.guru에서 확인할 수 있고, 직접 만들거나 결과를 예측해볼 수도 있다.

       

       

       

       

       

       

      about author

      PHRASE

      Level 60  라이트

      소 궁둥이에다 꼴을 던진다 , 어리석고 미련한 사람은 아무리 가르쳐도 보람이 없다는 말.

      댓글 ( 5)

      댓글 남기기

      작성
      •    
      •    
      •