서버(APM) 구축하기 및 HTTP 외부접속 연결하기

dev-jjun·2022년 12월 21일
0

Server

목록 보기
1/33
post-thumbnail

HTTP 외부접속 연결하기

Mac APM 설치 참고 - https://story-moon.tistory.com/37?category=1014706

  1. WinScp 를 설치 → EC2 인스턴스 IPv4 주소와 연결하기 (주소를 Host Name으로 하여 로그인한다.)

  2. Putty.exe 실행

    만약 putty.exe 실행파일을 찾지 못할 경우, 환경설정에서 경로를 바꿔줘야 한다.

    → 참고 : https://velog.io/@banjjoknim/WinSCP와-PuTTY를-이용해서-AWS-EC2-인스턴스Ubuntu-AMI에-접속하기

  3. 터미널에 접속한 후, 웹 서버 (Nginx) 설치

    $ sudo apt update
    $ sudo apt install nginx
    1. 인스턴스 보안그룹 > 인바운드 규칙 편집 > 규칙 추가

    2. HTTP 프로토콜에 대하여 모든 IPv4 또는 내 IP로 새로운 규칙을 추가하여 저장한다.

    3. 인스턴스의 퍼블릭 IPv4 주소로 접속하면 다음과 같은 페이지가 뜬다!

  4. mySQL 설치

    $ sudo apt install mysql-server
    $ sudo mysql_secure_installation
    $sudo mysql
    / sudo mysql -u root -p 도 가능
    • mysql_secure_installation → 이후 나오는 설정
      1. 비밀번호를 복잡하게 설정할 것인가? (보통 No)
      2. 원하는 비밀번호로 설정
      3. 사용자를 설정할 것인가? (보통 Yes)
      4. root 계정의 원격접속을 허용할 것인가? (나중에 변경 가능)
      5. 테스트 DB를 생성할 것인가? (보통 No)

    ⚠️ 패스워드 설정에서의 실패 반복

    [ 문제 원인 ]

    ... Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the authentication method used doesn't store authentication data in the MySQL server. Please consider using ALTER USER instead if you want to change authentication parameters.

    [ 해결 방안 ]

    접속을 종료한 후, sudo mysql 로 mysql에 접속하여 root 비밀번호를 직접 설정해준다.

    이때 비밀번호 정책에 맞게 설정해줘야 하는데, 대소문자, 숫자, 특수문자를 혼합하여 8자 이상으로 구성해야 한다.

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '새로운비밀번호';
    
    
    *비밀번호 수준 (0=LOW, 1=MEDIUM, 2=STRONG)
    
    - LOW : 8자 이상
    - MEDIUM : 숫자, 대소문자 섞은 글자, 특수문자 섞어 8자 이상
    - STRONG : 숫자, 대소문자, 특수문자, 사전에 없는 단어
    
    → `Query OK` 가 나오면 성공!

    [ 참고 자료 ]

    Mysql root 비밀번호 setup error(mysql secure installation)

    > SELECT user,authentication_string,plugin,host FROM mysql.user;
    > **SET GLOBAL validate_password.policy=LOW;**
    > ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY **'password'**;
    > FLUSH PRIVILEGES;
  5. PHP 설치

    1. index.php 파일 생성

      $ sudo apt install php-fpm php-mysql
      $ cd /var/www/html/
      $ sudo vi index.php   -> 제대로 설치된 경우 해당 경로로 들어가 파일을 생성할 수 있음!

      파일 내용은 아래와 같이 작성하여 생성한다.

      <?php
       phpinfo();
      ?>

    php-fpm이란?

    • PHP(Hypertext Preprocessor) : C언어를 기반으로 만들어진 서버 측에서 실행되는 서버 사이드 스크립트 언어 PHP는 정적인 페이지만 전달해주는 HTML와 독립적으로 작성되며, 이를 보완하여 동적 페이지를 표현할 수 있도록 도와준다. 따로 작성된 PHP는 웹 서버가 아닌 PHP-fpm을 통해 실행된다.
    • CGI (Common Gateway Interface) : 동적인 페이지 구현을 위한 프로그램에 클라이언트의 요청을 전달해주는 프로그램

    ⇒ PHP-fpm(PHP FaseCGI Process Manager) : 보통의 CGI보다 빠른 버전으로, 외부 PHP 프로그램에 클라이언트의 요청을 전달해준다.

    • FastCGI : 클라이언트의 요청을 전달할 때마다 새로운 프로세스를 생성하는 것이 아니라 이미 생성된 프로세스를 재활용하는 방식을 사용하여 처리가 빠름

    Nginx 웹 서버가 PHP 프로그램을 사용하는 서비스에 요청을 전달하려면 Nginx와 PHP-fpm간 연동이 필요하다.

    b. 연동하기

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

    위 파일로 들어가 location ~.php${} 부분의 주석처리를 없애준다.

    $ sudo service nginx restart

    *관리자 권한에 의한 접근 방지가 뜰 경우 리눅스 명령어 앞에 sudo 를 적어 root 관리자 권한으로 실행함을 알린다.

    • ⚠️ 트러블 슈팅


      [ 문제 원인 ] php 실행 시 index.php가 제대로 동작하지 않음

      *502 Bad Gateway 원인 : 서로 다른 프로토콜을 연결해주는 장치(게이트웨이)가 잘못된 프로토콜을 연결하거나, 어느 한쪽의 프로토콜에 문제가 있어 통신이 제대로 되지 않을 때 출력되는 에러코드
      → 주로 서버 과부하나 사용자 브라우저에 이상이 있는 경우, 잘못된 네트워크 연결이 된 경우에 발생함

      1. PHP-fpm 으로 처리해야 하는 자료 중 크기가 매우 큰 요청을 처리해야 하는 경우
      2. 서버 반응 속도가 느려 PHP-fpm으로 가는 도중에 서버 요청에 긴 시간을 요구하는 경우

      [ 해결 방안 ]

      하지만 위의 문제 모두 아니고 .. php-fpm의 버전 설정 문제였다. /etc/nginx/sites-available/default 파일을 새로 작성할 때 php-fpm의 버전을 적어주는 줄에서 설치된 버전으로 맞춰줘야 하는데, 자신의 서버에 설치된 php 버전은 php -v 명령어로 확인할 수 있다.

      [ 참고 자료 ]

      nginx + PHP-fpm에서 502 Bad gateway 에러 해결법 총정리

      502 Bad Gateway 발생원인과 해결방법

    c. '퍼블릭 IPv4 주소'/index.php 경로 로 들어가서 페이지가 뜨면 성공 !

  6. MySQL 외부 접속

    1. mysql 실행하기 및 사용자 생성

      $ sudo mysql -u root -p 
      
      mysql> use mysql; 
      mysql> show databases;
      mysql> show tables;
      mysql> select user,host from user;   // mysql database의 사용자 목록 출력
      mysql> create user '사용자이름'@'%' identified by '설정할 비밀번호';

      *사용자 생성 시 접근 허용 범위 지정

      • 'Username'@'%' : 해당 사용자는 외부에서 접근 가능
      • 'Username'@'localhost' : 해당 사용자는 내부에서만 접근 가능
      • 'Username'@'xxx.xxx.xxx.xxx' : 해당 사용자는 지정한 ip주소로만 접근 가능

      자신의 사용자 이름을 아래서 확인한다.

      +------------------+-----------+
      | user             | host      |
      +------------------+-----------+
      | debian-sys-maint | localhost |
      | mysql.infoschema | localhost |
      | mysql.session    | localhost |
      | mysql.sys        | localhost |
      | root             | localhost |
      | jjuni            |     %     |
      +------------------+-----------+
    2. 외부접속 test할 데이터베이스를 생성한다.

      mysql> create database jminieDB
      mysql> grant all privileges on jjuniDB.* to 'jjuni'@'%';
      // 지정한 사용자에게 권한을 준다. 
      mysql> flush privileges;
      mysql> show grants for 'jminie'@'%';   // 사용자의 권한 확인하기
      +----------------------------------------------------+
      | Grants for jjuni@%                                 |
      +----------------------------------------------------+
      | GRANT USAGE ON *.* TO `jjuni`@`%`                  |
      | **GRANT ALL PRIVILEGES ON `jjuniDB`.* TO `jjuni`@`%`** |
      +----------------------------------------------------+
    3. 접속 허용 포트 설정

      $ cd /etc/mysql/mysql.conf.d
      $ sudo vim mysqld.cnf

      MySQL 설정 파일로 들어가 외부 접속을 허용하기 위해 bind-address 부분을 0.0.0.0 으로 바꿔준다.

      AWS EC2 인스턴스의 인바운드 규칙에도 3306 포트 범위의 0.0.0.0/0으로 새로운 규칙을 추가해준다.

      포트포워딩 후, mySQL을 다시 시작해준다.

      $ sudo service mysql restart
    4. MySQL Workbench에서 외부 접속하기

      username에 생성한 사용자 이름을 넣고, host에는 인스턴스 IPv4 개방주소를 넣어준다.

      Test Connection 시 접속에 성공하고 아래와 같이 생성했던 데이터베이스를 확인할 수 있다.

  7. phpMyAdmin 설치

    phpMyAdmin이란?

    MySQL을 웹 상에서 관리할 목적으로 PHP로 작성한 오픈 소스 도구

    → 데이터베이스, 테이블, 필드, 열의 작성/수정/삭제, SQL 상태 실행, 사용자 및 사용 권한 관리 등의 다양한 작업 수행 가능하며, PHP로 작성되어 있어 코어파일들을 적절히 튜닝하여 사용할 수 있다.

    ⚠️ 트러블 슈팅 양식

    [ 문제 원인 ]

    http://localhost/phpmyadmin 으로 접속 시, 아래와 같은 오류가 뜬다.

    웹 페이지가 해당 디렉토리까지 가는 것이 막혀있어 발생하는 문제이다.

    [ 해결 방안 ]

    IIS 관리자에서 디렉토리 검색을 사용 안 함 > 사용으로 바꿔준다.

    사실 문제는 nginx 로 진행하고 있고 인스턴스에 연결해주는 과정이었기 때문에 localhost/phpmyadmin 이 아닌 인스턴스IPv4주소/phpmyadmin 으로 들어가는 것이 맞았다..

    [ 참고 자료 ]

    윈도우7 IIS 3장 - IIS 오류(HTTP 오류 403.14 - Forbidden)
    Ubuntu 18.04 : phpMyAdmin with Nginx 설치 방법, 예제, 명령어

    mysql로 생성한 사용자명과 비밀번호로 로그인하여 위 화면과 같이 접속되면 성공!

  8. 도메인 연결하기

    1. 무료 도메인 발급 → freenom 사이트 이용

      해당 사이트에서 모두 Not available로만 뜨므로, 구매하고자 하는 도메인까지 같이 붙인 형태로 검색해야 한다.

      참고 - https://ansan-survivor.tistory.com/1315

    2. Service > [My Domain] 으로 가서 인스턴스 IP 주소를 Forwarding 해준다.

    3. 발급한 도메인으로 접속 시 IP 주소로 바로 연결되는 것을 확인할 수 있다!

  9. HTTPS 연결하기 → Let’s Encrypt 이용

    1. certbot 설치

      *Let's Encrypt - 무료 인증서 발급****

      Let’s Encrypt 는 사용자에게 무료로 SSL/TLS 인증서를 발급해주는 비영리기관으로, 한 번 발급 받으면 90일간 사용가능하고 만료 30일 전에 이를 갱신할 수 있다.

      인증서 발급은 Let’s Encrypt 인증서를 자동으로 발급/갱신해주는 certbot 또는 certbot-auto를 이용하면 된다.
      *패키지로 설치 시 → certbot / 바이너리를 직접 받는 경우 → certbot-auto-letencrpyt

      ubuntu$ sudo apt-get update
      ubuntu$ sudo apt-get install software-properties-common
      ubuntu$ sudo add-apt-repository universe
      ubuntu$ sudo add-apt-repository ppa:certbot/certbot
      ubuntu$ sudo apt-get update
      
      ubuntu$ sudo apt-get install certbot    // certbot 설치
      ubuntu$ sudo apt-get install python-certbot-nginx  // certbot nginx plugin 설치
    2. 인증서 발급

    3. SSL 인증서 가져오기

      $ sudo certbot --nginx -d example.com -d www.example.com

      ⚠️ 트러블 슈팅

      [ 문제 원인 ]

      [ 해결 방안 ]

      $sudo apt install -y certbot python3-certbot-nginx

      [ 참고 자료 ]

      Unable to locate package python-certbot-apache on Ubuntu 14.04 AWS

참고 자료

[AWS]ec2에 nginx, mysql, php 설치

profile
서버 개발자를 꿈꾸며 성장하는 쭌입니다 😽

0개의 댓글