개발모음집

AWS EC2 Ubuntu16.04에서 nginx + php + postgresql 설치하기 본문

Server

AWS EC2 Ubuntu16.04에서 nginx + php + postgresql 설치하기

void 2018. 3. 26. 09:00

1. aws인스턴스 생성

http://wingsnote.com/52



2. aws 루트 계정 생성


+ 아마존 AWS EC2 서버에서 우분투 OS 루트 관리자 계정 만들기 순서
1. 아마존 서버 접속
    Putty 터미널로 서버에 접속합니다.


2. ubuntu 사용자 아이디로 로그인
    login as: 가 나오면 ubuntu를 입력하고 엔터를 칩니다.
    그럼 ubuntu 사용자 아이디로 바로 로그인됩니다.


3. 루트 관리자 계정 생성
    $ sudo passwd
    
    sudo passwd를 입력하고 엔터치면 패스워드를 입력하라고 나옵니다. 
   루트 관리자용으로 사용할 패스워드를 입력해 주세요.

    $ su -

    su - 를 입력하고 엔터치면 루트 관리자 패스워드를 입력하라고 나옵니다. 
    루트 관리자 패스워드 입력을 하고 엔터치면 바로 루트 관리자로 로그인합니다.


4. SSH 환경설정파일 수정
    $ sudo nano /etc/ssh/sshd_config


    nano 텍스트에디터로 SSH 터미널용 환경설정파일을 엽니다.
    
    설정 내용 중 PermitRootLogin without-password 라인을 찾고 아래와 같이 수정합니다.
    나노 에디터에서 찾기는 Ctrl키와 W키를 함께 누르면 아래쪽에 키워드로 검색할 수 있습니다.
    검색하면 바로 해당 위치 라인에 커서가 이동합니다.
    그 다음에 수정하시면 찾는 시간을 줄일 수 있어서 효율적입니다.    
    
    PermitRootLogin yes
    
    StrictModes yes 라인을 찾고 아래와 같이 수정합니다. 
    # 표시는 주석처리로 해당 라인을 비활성화 처리 합니다.
    
    #StrictModes yes

    nano 텍스트에디터 모드 종료
    Ctrl키와 X키를 함께 누르면 에디터 모드가 종료되고 프롬프트 화면으로 빠져나옵니다.


5. Ubuntu 기본 사용자 계정 관련 개인키를 루트 관리자 계정으로 복사   
    $ sudo cp /home/ubuntu/.ssh/authorized_keys /root/.ssh


6. SSH 서비스 재시작
    $ sudo service ssh restart


7.  Putty 터미널을 종료
    그냥 터미널 창을 닫아 터미널을 종료합니다.


8. Putty 터미널을 다시 새로 띄우기
    putty 터미널을 열고 아마존 서버에 접속합니다.


9. 루트 관리자 계정으로 로그인
    login as: 가 나오면 root를 입력하고 엔터를 칩니다.
    그럼 root 관리자 아이디로 바로 로그인됩니다.


10. 끝.
     이제부턴 아마존 서버 접속시 login as : ubuntu로 로그인하지 말고 root로 바로 로그인 하세요.

출처 :  OSASF


3. nginx 설치


Step 1: Install Nginx

Nginx is available in Ubuntu's default repositories, so the installation is rather straight forward.

Since this is our first interaction with the apt packaging system in this session, we will update our local package index so that we have access to the most recent package listings. Afterwards, we can install nginx:

  • sudo apt-get update
  • sudo apt-get install nginx

After accepting the procedure, apt-get will install Nginx and any required dependencies to your server.

Step 2: Adjust the Firewall

Before we can test Nginx, we need to reconfigure our firewall software to allow access to the service. Nginx registers itself as a service with ufw, our firewall, upon installation. This makes it rather easy to allow Nginx access.

We can list the applications configurations that ufw knows how to work with by typing:

  • sudo ufw app list

You should get a listing of the application profiles:

Output
Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH

As you can see, there are three profiles available for Nginx:

  • Nginx Full: This profile opens both port 80 (normal, unencrypted web traffic) and port 443 (TLS/SSL encrypted traffic)
  • Nginx HTTP: This profile opens only port 80 (normal, unencrypted web traffic)
  • Nginx HTTPS: This profile opens only port 443 (TLS/SSL encrypted traffic)

It is recommended that you enable the most restrictive profile that will still allow the traffic you've configured. Since we haven't configured SSL for our server yet, in this guide, we will only need to allow traffic on port 80.

You can enable this by typing:

  • sudo ufw allow 'Nginx HTTP'

You can verify the change by typing:

  • sudo ufw status

출처 : 디지털 오션

하지만 ec2는 “Security Group”을 사용하여 접근 제어를 합니다.

ec2 security group을 설정하기 위해 ec2 웹콘솔로 접근하여 ec2 서비스를 선택합니다.

ec2를 클릭하면 하단 Description에 Security groups이 설정 되어 있습니다.

저의 경우엔 launch-wizard-2로 설정 되어 있네요. 옆에 view inbound rules를 눌러 볼게요.

저 설정을 보니 감이 오시나요? 네. 그렇습니다. 22번 tcp 포트만 접속 허용이 되어 있네요. 80번 포트는 접근을 허용하지 않네요.

그렇다면 80번 포트로 접근을 하기 위해 추가해 보도록 하겠습니다.

view inbound rules 좌측의 “lanuch-wizard-2”를 클릭합니다. 혹은 좌측 메뉴의 “Security Groups” 메뉴를 눌러 줍니다.

하단의 “Inbound” 탭을 누릅니다.

“Edit” 버튼을 눌러 줍니다.

이제 Rule을 추가해 볼까요? “Add Rule” 버튼을 클릭합니다.

Type을 선택하면 여러 타입이 보이지만 HTTP를선택합니다.

HTTP를 선택하면 자동으로 Port Range는 80으로 선택 됩니다. Source는 허용할 IP를 의미 합니다. 웹서버는 누구나 접속 가능하게 Anywhere로 설정 합니다. “0.0.0.0/0, ::/0”은 누구나 접속 가능함을 의미 합니다.

만약 SSH, HTTP 접속을 내 IP만 허용하고 싶다면 “My IP”로 선택하여 “Save”하시면 됩니다.

SSH(port 22)의경우 My IP로 세팅하는 것이 보안에 매우 유리합니다.
80포트 등록 완료

그럼 다시 웹브라우저에서 서버를 접속해 볼까요?

Welcome 페이지가 반갑게 우릴 맞이해 주네요.

출처 : 미디엄

4. postgresql 설치


Introduction

Relational database management systems are a key component of many web sites and applications. They provide a structured way to store, organize, and access information.

PostgreSQL, or Postgres, is a relational database management system that provides an implementation of the SQL querying language. It is a popular choice for many small and large projects and has the advantage of being standards-compliant and having many advanced features like reliable transactions and concurrency without read locks.

In this guide, we will demonstrate how to install Postgres on an Ubuntu 16.04 VPS instance and go over some basic ways to use it.

Installation

Ubuntu's default repositories contain Postgres packages, so we can install these easily using the aptpackaging system.

Since this is our first time using apt in this session, we need to refresh our local package index. We can then install the Postgres package and a -contrib package that adds some additional utilities and functionality:

  • sudo apt-get update
  • sudo apt-get install postgresql postgresql-contrib

Now that our software is installed, we can go over how it works and how it may be different from similar database management systems you may have used.

Using PostgreSQL Roles and Databases

By default, Postgres uses a concept called "roles" to handle in authentication and authorization. These are, in some ways, similar to regular Unix-style accounts, but Postgres does not distinguish between users and groups and instead prefers the more flexible term "role".

Upon installation Postgres is set up to use ident authentication, which means that it associates Postgres roles with a matching Unix/Linux system account. If a role exists within Postgres, a Unix/Linux username with the same name will be able to sign in as that role.

There are a few ways to utilize this account to access Postgres.

Switching Over to the postgres Account

The installation procedure created a user account called postgres that is associated with the default Postgres role. In order to use Postgres, we can log into that account.

Switch over to the postgres account on your server by typing:

  • sudo -i -u postgres

You can now access a Postgres prompt immediately by typing:

  • psql

You will be logged in and able to interact with the database management system right away.

Exit out of the PostgreSQL prompt by typing:

  • \q

You should now be back in the postgres Linux command prompt.

출처 : 디지털 오션


5. php 설치


1. Preliminary steps

First, ensure your system and apt package lists are fully up-to-date by running the following:

apt-get update -y && apt-get upgrade -y

The -y flag tells apt to go ahead and update the system without prompting you.

This tutorial uses the nano text editor but you may use whichever one you're most comfortable with. Nano is very quick and easy to use and most likely already installed on a barebones Ubuntu system. However, it's a good idea to check just in case:

apt-get install nano -y

Now you're ready to begin installing PHP 7.0.

2. Installing PHP 7.0

Ubuntu installs FastCGI Process Manager, aka php-fpm, by default. To install PHP 7.0 (and php7.0-fpm) the command needed is:

apt-get install php -y

출처 : tqhosting


6. PHP & postgresql 연동

1.1 php.ini 위치 확인[편집]

[root@zetawiki ~]# php -i | grep php.ini
Configuration File (php.ini) Path => /etc/php.ini

→ php.ini는 /etc에 있다.

1.2 extension 폴더 확인[편집]

  • 먼저 extension이 설치될 위치를 확인한다.
[root@zetawiki ~]# php -r "phpinfo();" | grep ^extension
extension_dir => /usr/lib64/php/modules => /usr/lib64/php/modules
→ 각종 extension들은 /usr/lib64/php/modules에 설치되어 있다.

1.3 so 파일 확인[편집]

해당 폴더에 pdo.so 와 pdo_pgsql.so 파일이 있는지 확인한다.

[root@zetawiki ~]# ll /usr/lib64/php/modules/ | grep pdo
-rwxr-xr-x 1 root root   28264 Feb 12  2010 pdo_mysql.so
-rwxr-xr-x 1 root root   92464 Feb 12  2010 pdo.so
-rwxr-xr-x 1 root root   24200 Feb 12  2010 pdo_sqlite.so

→ pdo_pgsql.so 파일이 없다.

2 설치[편집]

[root@zetawiki ~]# apt-get install php-pgsql -y

[root@zetawiki ~]# apt install rpm

3 설치 확인[편집]

[root@zetawiki ~]# rpm -qa | grep pgsql php-pgsql-5.3.3-3.el6_2.8.x86_64

[root@zetawiki ~]# ll /usr/lib64/php/modules/ | grep pdo
-rwxr-xr-x 1 root root   30016 May  8 04:17 pdo_mysql.so
-rwxr-xr-x 1 root root   37056 May  8 04:17 pdo_pgsql.so
-rwxr-xr-x 1 root root  102456 May  8 04:17 pdo.so
-rwxr-xr-x 1 root root   24640 May  8 04:17 pdo_sqlite.so
→ pdo_pgsql.so 파일이 설치되었다.  // VMWARE에선 rpm -qa | grep pgsql 명령어 먹히더니 aws에선 안먹힘.

5 pdo_pgsql 확인[편집]

[root@zetawiki ~]# php -i | grep pdo_pgsql
/etc/php.d/pdo_pgsql.ini,
pdo_pgsql
Revision =>  $Id: pdo_pgsql.c 300351 2010-06-10 12:11:19Z iliaa $
→ 설정도 정상적으로 되어 있다.

6 PHP 수행 확인[편집]

[root@zetawiki ~]# php -r "pg_connect();"
PHP Warning:  Wrong parameter count for pg_connect() in Command line code on line 1

Warning: Wrong parameter count for pg_connect() in Command line code on line 1
→ pg_connect 명령어를 인식한다. 이제 PHP 코딩을 시작하면 된다.

출처 : 제트위키


7. nginx & php 연동

 5.Nginx 환경설정 


vi /etc/nginx/sites-available/default

 

[...] server {
listen 80 default_server;
listen [::]:80 default_server;

# SSL configuration
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;

# 웹루트 기본 경로

root /var/www/html;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

server_name _;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
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/php7.0-fpm.sock;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
} [...]

 

환경 설정이 끝나고 서비스를 리로드 합니다.

service nginx reload


Nignx를 재시작한 후  /etc/php/fpm/php.ini  열어 cgi.fix_pathinfo 설정값을 1에서 0 으로 변경합니다.

vi /etc/php/7.0/fpm/php.ini


[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]

 PHP-FPM을 재시작 합니다.
 

service php7.0-fpm reload

설정완료 후 테스트 페이지를 만들어 접속 가능 여부를 확인 합니다.

vi /var/www/html/info.php


 

<?php
phpinfo();
?>

웹브라이저에서 http://localhost/info.php 로 접속해서 아래와 같은 화면이 나오면 정상적으로 설치가된것입니다.





출처:  [행복한소식까치]




psql 접근하는 법

su - postgres
psql

출처 : 1and1


8. PostgreSQL ROOT 패스워드 생성


postgres=# ALTER USER postgres PASSWORD 'postgrespw'; // 패스워드 생성

postgres=# SHOW hba_file; // hba.file.conf 경로확인

postgres=# \q

postgres@ubuntu :~$ exit


출처: i5on9i.blogspot


// postgres에서 확인한 경로대로 pg_hba.conf파일을 열어준다

nano /etc/postgresql/9.5/main/pg_hba.conf


아래쪽에 내리다보면 빨간색 세 부분의 값을 md5로 바꿔준후 vi 저장후 종료합니다.


권한을 변경했으니 DB를 재시작 하도록 하겠습니다.


systemctl restart postgresql-9.5



만약 안되면

sudo service postgresql restart


마지막으로 시작과 부팅시 포스트그래스 DB 를 실행시키는 명령어 입니다.


systemctl enable postgresql-9.5



이렇게되면 포스트그래스 DB 설치가 완료가 되었습니다. 


출처 : 티스토리


9. 외부접속 허용


Ubuntu(우분투)에 PostgreSQL을 설치 하면, 외부에서는 접속이 불가능하고, 로컬에서만 접속이 가능한다. 간단한 설정을 통해 외부에서도 Ubuntu(우분투)에 설치한 PostgreSQL에 접속이 가능하도록 할 수 있다.


1. sudo netstat -tnlp | grep postgres를 입력하여 접속 가능한 IP를 확인한다. 아래 그림과 같이 표시되면, 로컬 호스트인 127.0.0.1에서만 접속이 가능하다는 의미이다.


2. 설정 파일을 수정하기 위해, sudo vi /etc/postgresql/9.5/main/postgresql.conf를 입력한다.


3. 모든 IP에서 5432 포트에 접근이 가능하도록 하기 위해, 아래 그림과 같은 위치에 listen_addresses = '*'을 입력하고, 저장 후 종료한다.


4. hba 설정 파일을 수정하기 위해, sudo vi /etc/postgresql/9.5/main/pg_hba.conf를 입력한다.


5. 3번에서 설정한 IP에서 모든 DB(all)에 모든 계정(all)으로 로그인이 가능하도록 하기 위해, 아래 그림과 같은 위치에 host    all    all    0.0.0.0/0    md5를 입력하고, 저장 후 종료한다.


6. 변경한 사항을 반영하기 위해, sudo /etc/init.d/postgresql restart를 입력하여 PostgreSQL을 재시작한다.


7. Listen Port를 확인하기 위해 sudo netstat -tnlp | grep postgres를 입력한다. 접속 가능한 IP가 127.0.0.1에서 0.0.0.0으로 변경된 것을 확인할 수 있다.



출처: [무민이의 반반무많이]


그 다음 AWS에서 5432 포트도 열어줘야 내가 브라우저로 테스트할 때 접근가능하다.



postgresql 명령어 모음


http://ujink.tistory.com/11

http://www.kim-taesuk.com/25

http://postgresql.kr/docs/9.6/managing-databases.html


에러


FATAL: no pg_hba.conf entry for host "", user "postgres", database "postgres", SSL off



host 앞에 #을 지우지않는 실수를 하였음....



winCP와 연결하는 법 참고 : 블로그