kkamagi's story

IT, 정보보안, 포렌식, 일상 공유

OS

CentOS 7 - Nginx/MariaDB/Php 웹 서비스 설치

까마기 2020. 10. 26. 13:54
728x90
반응형

CentOS7 Nginx, MariaDB, PHP 웹서버 설치하기

Web Server의 OS를 CentOS7로 변경하고 나서 서버 구축을 다시 하면서 그 동안 작업 한것들을 정리 차원에서 작성 해본다. 먼저 서버의 OS가 Ubuntu일때는 Googling을 통해 쉽게 문제 해결이 되긴 했지만 CentOS는 Ubuntu에 비해 조금 어렵다는 생각이 든다.

LEMP와 LAMP에 대해서는 지난 포스트를 참조

Ubuntu16.04 Nginx MySQL PHP 웹서버 구축하기

LEMP 구성은 아래와 같이 최신버전으로 설치

* Nginx 1.13.0

* MariaDB 10.1

* PHP 7.1

설치 순서는 MariaDB, Nginx, PHP 순으로 한다.

MariaDB 10.1 설치

MariaDB Repo 설치

# vim /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=0

enabled=1

MariaDB 설치

# yum install -y mariadb mariadb-server

# systemctl start mariadb

Mariadb 보안설정

# mysql_secure_installation

 

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB

SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!

 

In order to log into MariaDB to secure it, we'll need the current

password for the root user. If you've just installed MariaDB, and

you haven't set the root password yet, the password will be blank,

so you should just press enter here.

 

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.

 

Set root password? [Y/n] y

New password: <-- MariaDB의 root계정 비밀번호 생성

Re-enter new password: <-- 비밀번호 재입력

Password updated successfully!

Reloading privilege tables..

... Success!

 

By default, a MariaDB installation has an anonymous user, allowing anyone

to log into MariaDB without having to have a user account created for

them. This is intended only for testing, and to make the installation

go a bit smoother. You should remove them before moving into a

production environment.

 

Remove anonymous users? [Y/n] y

... Success!

 

Normally, root should only be allowed to connect from 'localhost'. This

ensures that someone cannot guess at the root password from the network.

 

Disallow root login remotely? [Y/n] y

... Success!

 

By default, MariaDB comes with a database named 'test' that anyone can

access. This is also intended only for testing, and should be removed

before moving into a production environment.

 

Remove test database and access to it? [Y/n] y

- Dropping test database...

... Success!

- Removing privileges on test database...

... Success!

 

Reloading the privilege tables will ensure that all changes made so far

will take effect immediately.

 

Reload privilege tables now? [Y/n] y

... Success!

 

Cleaning up...

 

All done! If you've completed all of the above steps, your MariaDB

installation should now be secure.

 

Thanks for using MariaDB!

부팅시 자동으로 실행

# systemctl enable mariadb

# systemctl status mariadb

● mariadb.service - MariaDB database server

Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)

Drop-In: /etc/systemd/system/mariadb.service.d

└─migrated-from-my.cnf-settings.conf

Active: active (running) since 금 2017-06-02 19:37:14 KST; 3min 13s ago

Main PID: 2933 (mysqld)

Status: "Taking your SQL requests now..."

CGroup: /system.slice/mariadb.service

└─2933 /usr/sbin/mysqld

 

6월 02 19:37:13 blog.dazzii.com mysqld[2933]: 2017-06-02 19:37:13 13986504....

6월 02 19:37:13 blog.dazzii.com mysqld[2933]: 2017-06-02 19:37:13 13986504....

6월 02 19:37:13 blog.dazzii.com mysqld[2933]: 2017-06-02 19:37:13 13986504...t

6월 02 19:37:13 blog.dazzii.com mysqld[2933]: 2017-06-02 19:37:13 13986504...9

6월 02 19:37:13 blog.dazzii.com mysqld[2933]: 2017-06-02 19:37:13 13986504....

6월 02 19:37:13 blog.dazzii.com mysqld[2933]: 2017-06-02 19:37:13 13986428...d

6월 02 19:37:14 blog.dazzii.com mysqld[2933]: 2017-06-02 19:37:14 13986504....

6월 02 19:37:14 blog.dazzii.com mysqld[2933]: 2017-06-02 19:37:14 13986504....

6월 02 19:37:14 blog.dazzii.com mysqld[2933]: Version: '10.1.24-MariaDB' ...r

6월 02 19:37:14 blog.dazzii.com systemd[1]: Started MariaDB database server.

Hint: Some lines were ellipsized, use -l to show in full.

Nginx 1.13.0 설치

Nginx Repo 설치

# vim /etc/yum.repos.d/nginx.repo

 

[nginx]

name=nginx repo

baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/

gpgcheck=0

enabled=1

Nginx 설치

# yum update

# yum install nginx

부팅시 자동으로 실행

# systemctl start nginx

# systemctl enable nginx

# systemctl status nginx

● nginx.service - nginx - high performance web server

Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)

Active: active (running) since 금 2017-06-02 22:14:50 KST; 18s ago

Docs: http://nginx.org/en/docs/

Main PID: 29892 (nginx)

CGroup: /system.slice/nginx.service

├─29892 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx....

└─29893 nginx: worker process

 

6월 02 22:14:50 blog.dazzii.com systemd[1]: Starting nginx - high performa....

6월 02 22:14:50 blog.dazzii.com nginx[29888]: nginx: the configuration fil...k

6월 02 22:14:50 blog.dazzii.com nginx[29888]: nginx: configuration file /e...l

6월 02 22:14:50 blog.dazzii.com systemd[1]: Started nginx - high performan....

Hint: Some lines were ellipsized, use -l to show in full.

방화벽 설정

# firewall-cmd --permanent --zone=public --add-port=80/tcp

# firewall-cmd --permanent --zone=public --add-port=443/tcp

# firewall-cmd --reload

PHP7.1 설치

EPEL 저장소 구성

# yum -y install wget

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

# wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm

# rpm -Uvh remi-release-7.rpm epel-release-latest-7.noarch.rpm

EPEL 저장소 활성화

# yum -y install yum-utils

# yum --enablerepo=remi update remi-release

# yum-config-manager --enable remi-php71

– php7.0 설치시는 yum-config-manager –enable remi-php70 으로 수정

php7.1 설치

# yum --enablerepo=remi-php71 install -y php php-fpm php-mysql

# yum --enablerepo=remi-php71 install -y php-mbstring php-common php-cli php-gd php-json php-devel php-imageic php-mcrypt php-xml php-xmlrpc php-soap php-bcmatch php-pear php-dba php-pdo php-ldap php-mysqlnd php-opcache

# yum --enablerepo=remi-php71 install -y zip unzip php-zip

–  php7.0 설치시 –enablerepo=remi-php70 으로 수정

부팅시 자동으로 실행

# systemctl start php-fpm

# systemctl enable php-fpm

# systemctl status php-fpm

● php-fpm.service - The PHP FastCGI Process Manager

Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)

Active: active (running) since 금 2017-06-02 22:44:37 KST; 38s ago

Main PID: 30393 (php-fpm)

Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"

CGroup: /system.slice/php-fpm.service

├─30393 php-fpm: master process (/etc/php-fpm.conf)

├─30394 php-fpm: pool www

├─30395 php-fpm: pool www

├─30396 php-fpm: pool www

├─30397 php-fpm: pool www

└─30398 php-fpm: pool www

 

6월 02 22:44:37 blog.dazzii.com systemd[1]: Starting The PHP FastCGI Proce....

6월 02 22:44:37 blog.dazzii.com systemd[1]: Started The PHP FastCGI Proces....

PHP, NGINX 설정파일 수정

php.ini 파일 수정

# vim /etc/php.ini

 

cgi.fix_pathinfo = 0 <-- 주석(;)을 제거하고 1을 0으로 변경

allow_url_fopen = On

expose_php = Off

display_errors = Off

date.timezone = Asia/Seoul <-- 주석(;)을 제거하고 Asia/Seoul 입력

php-fpm 설정

# vim /etc/php-fpm.d/www.conf

 

user = nginx <-- apache를 nignx로 변경

group = nginx <-- apache를 nignx로 변경

listen.owner = nginx <-- 주석(;) 제거하고 nobody를 nginx로 변경

listen.group = nginx <-- 주석(;) 제거하고 nobody를 nginx로 변경

listen = /var/run/php-fpm/php-fpm.sock <-- listen = 127.0.0.1:9000 찾아서 변경

nginx.conf 수정

# vim /etc/nginx/nginx.conf

 

user nginx;

worker_processes auto;

include /etc/nginx/conf.d/default.com;

nginx 설정 파일 구조는  events{  }과 http {  } 구조로 되어있고,  http {  } 안에서 Server Block 설정 부분인 /etc/nginx/conf.d/default.com 파일을 include 하여 읽어 들여는 구조로 되어 있다.

php 파일 처리를 환경변수 설정파일 작성

# mkdir -p /etc/nginx/snippets

# vim /etc/nginx/snippets/fastcgi-php.conf

; 아래와 같이 입력

fastcgi_split_path_info ^(.+\.php)(/.+)$;

try_files $fastcgi_script_name =404;

set $path_info $fastcgi_path_info;

fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

웹서버 루트 디렉토리 사용자 변경

# ls -ld /var/www/html

drwxr-xr-x. 2 root root 4096 6월 3 01:48 /var/www/html

 

# chown -R nginx:nginx /var/www/html

# ls -ld /var/www/html

drwxr-xr-x. 2 nginx nginx 4096 6월 3 01:48 /var/www/html

Server 구성

Server Block 설정파일 수정

Server Block 파일 원본에 주석처리된 내용을 삭제 하고 난 원본 파일(/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;

}

}

아래와 같이 수정한다.(여기서 서버 도메인 주소는 blog.dazzii.com을 사용, 자신의 도메인 주소를 입력하면 되겠다)

# cp /etc/nginx/conf.d/default.conf default.conf.bak

; server block 설정 파일 백업

 

# vim /etc/nginx/conf.d/default.conf

; 아래와 같이 수정

server {

listen 80;

server_name blog.dazzii.com; <-- 자신의 서버 도메인 주소

root /var/www/html; <-- 기존 루트 폴더(CentOS 7의 Default)

index index.php index.html index.htm;

 

location / {

try_files $uri $uri/ =404;

}

 

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root /usr/share/nginx/html;

}

 

location ~ \.php$ {

include snippets/fastcgi-php.conf;

fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;

}

}

CentOS의 Default 루트디렉토리는 /var/www/html 이다. 만약 루트 디렉토리를 변경 할려면 예들들어 루트 디렉토리를 /home/www/html로 설정하고 싶으면 root /home/www/html로 변경하면된다. 단 루트 디렉토리를 변경하게 되면 CentOS의 보안 시스템인 SELinux 때문에 외부에서 웹 서비스 접속이 불가능하다.   이것을 해결하는두가지 방법이 있는데 하나는 SELinux 기능을 해제 하거나 SELinux 보안 켁스트를 변경 하면 된다. 이 방법은 다음 포스트를 참고 해서 수정 하면 된다.

CentOS7 SELinux 설정하기(링크)

수정이 완료 되면 아래와 같이 nginx와 php-fpm 을 재시작 한다.

# systemctl restart nginx

# systemctl restart php-fpm

이제  웹브라우저에서 접속해보면 아래와 같이 nginx 웹 서버에 정상적으로 접속이 된다.

 

이제 php 파일을 정상적으로 처리 하는지 확인하보기 위해 아래와 같이 파일을 만든다.

vi /var/www/html/info.php

; 아래 입력

 

<?php phpinfo(); ?>

이제 웹브라우저에서 http://도메인주소/info.php 를 입력

정상적으로 실행이 되면 아래와 같이 출력 된다.

 

– 확인하고 위에서 만든 파일은 삭제(rm -f /var/www/html/info.php)

SSL/TLS  인증서 설치로 HTTPS 사용 하기

웹사이트의 보안을 위해 HTTP 프로토콜 대신 HTTPS 프로토콜을 사용한다. HTTP는 데이터를 암호화 하지 않고 통신을 해서 보안에 취약하지만, HTTPS는 모든 데이터를 암호화 해서 통신을 해서 안전하다.

HTTPS는(Hypertext Transfer Protocol over Secure Socket Layer) 일반 텍스트가 아닌 SSL이나 TLS 프로토콜을 통해 데이터를 암호화 하여 통신하며, HTTP의 기본 TCP/IP의 포트는 80이나 HTTPS의 포트는 443을 사용한다.

CentOS7  +  Nginx 웹서버에서 암호화를 위해 SSL/TLS 인증서 설치를 하자. 그 중 무료 SSL/TSL 인증서를 발급 해주는 Let’s Encrypt를 설치 한다. 무료이긴 하나 90일이 지나면 재 인증을 해야 한다. 그러나 자동으로 인증서를 갱신하면 불편 함 없이 사용 가능하다.

Let’s Encrypt SSL/TLS 설치 순서

– SSL/TLS 인증에 사용되는 dhparam 키 생성

– ssl-params.conf 생성

– letsencrypt 설치

– Server Block 인증 확인 설정

– 인증서 발급

– ssl.conf  파일 작성

– SSL/TSL 적용 Server Block 설정

Diffie-Hellman 2048 비트 dhparam 키 생성(시간이 조금 소요 됨)

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

 

Generating DH parameters, 2048 bit long safe prime, generator 2

This is going to take a long time

..................................................+...........+.....................................................................................................................................................................+..............................................................+................+....................................................................+...........................................................................................................................++*++*

SSL/TLS 구성설정

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

; 아래 내용 입력

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_prefer_server_ciphers on;

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

ssl_ecdh_curve secp384r1;

ssl_session_cache shared:SSL:10m;

ssl_session_tickets off;

ssl_stapling on;

ssl_stapling_verify on;

resolver 8.8.8.8 8.8.4.4 valid=300s;

resolver_timeout 5s;

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; <-- 위에서 만든 dhparam.pem 파일 로드

Let’s Encrypt 설치

# yum install certbot

 

# mkdir -p /var/lib/letsencrypt/.well-known

# chgrp nginx /var/lib/letsencrypt

# chmod g+s /var/lib/letsencrypt

Nginx 인증 확인 설정

# vim /etc/nginx/conf.d/well-known.conf

; 아래 내용 입력

location ^~ /.well-known {

allow all;

alias /var/lib/letsencrypt/.well-known/;

default_type "text/plain";

try_files $uri =404;

}

 

# vim /etc/nginx/conf.d/default.conf

; 아래 내용 입력

include conf.d/well-known.conf;

 

# systemctl restart nginx

인증서 발급

# certbot certonly --email mymail@gmail.com --webroot -w /var/lib/letsencrypt/ -d blog.dazzii.com -d www.dazzii.com -d dazzii.com

 

Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem

Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem

 

IMPORTANT NOTES:

- Congratulations! Your certificate and chain have been saved at

/etc/letsencrypt/live/blog.dazzii.com/fullchain.pem. Your cert will

expire on 2017-08-25. To obtain a new or tweaked version of this

certificate in the future, simply run certbot again. To

non-interactively renew *all* of your certificates, run "certbot

renew"

- Your account credentials have been saved in your Certbot

configuration directory at /etc/letsencrypt. You should make a

secure backup of this folder now. This configuration directory will

also contain certificates and private keys obtained by Certbot so

making regular backups of this folder is ideal.

- If you like Certbot, please consider supporting our work by:

 

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate

Donating to EFF: https://eff.org/donate-le

위와 같이 나오면 발급이 성공한 것이다.(- Congratulations! Your certificate ….)

발급된 인증서 확인

# ls /etc/letsencrypt/live/blog.dazzii.com

README cert.pem chain.pem fullchain.pem privkey.pem

신청한 도메인의 인증서 발급은 위와 같이 /etc/letsencrypt/live/도메인  디렉토리 아래에 저장된다.

cert.pem : 도메인 인증서

chain.pem : Let’s Encrypt chain 인증서

fullchain.pem : cert.pem과 chain.pem의 combine된 인증서

privkey.pem : 인증서의 개인키

ssl.conf 작성

# vim /etc/nginx/snippets/ssl.conf

; 아래 내용 입력

ssl_certificate /etc/letsencrypt/live/blog.dazzii.com/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/blog.dazzii.com/privkey.pem;

SSL/TSL 적용 Sever Block 설정

# vim /etc/nginx/conf.d/default.conf

; 아래와 같이 수정

 

server {

listen 80;

server_name blog.dazzii.com;

root /home/www/html;

return 301 https://$server_name$request_uri; <--http로 접속했을때 https로 리디렉션

}

 

server {

listen 443 ssl http2;

server_name blog.dazzii.com;

root /home/www/html;

index index.php index.html index.htm;

 

include conf.d/well-known.conf

 

location / {

try_files $uri $uri/ =404;

}

 

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root /usr/share/nginx/html;

}

 

location ~ \.php$ {

include snippets/fastcgi-php.conf;

fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;

}

include snippets/ssl.conf;

include snippets/ssl-params.conf;

}

Nginx 및 php-fpm 모듈 재 실행

# systemctl restart nginx

# systemctl restart php-fpm

HTTPS  웹 접속 Test

주소창에 http://blog.dazzii.com 입력하면 아래와 같이 https://blog.dazzii.com으로 리디렉션 되면 제대로 설치가 완료 된것이다.

 

인증서 자동갱신 설정

# crontab -e

;아래 내용 입력

30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log

35 2 * * 1 /usr/bin/systemctl reload nginx

Encrypt의 인증서는 90일동안 유효 하기 때문에 사용자가 인증서를 갱신 해야 한다. 이것을 자동으로 하기 위해 위와 같이 실행 한다.아래는 매주 월요일 03시 30분에 인증서를 갱신하고, 3시 35분에 Nginx를 재 시작하는 스케줄이다.

Nginx 사용 명령어

// 시작

$ sudo service nginx start

$ sudo systemctl start nginx

$ sudo /etc/init.d/nginx start

 

// 재시작

$ sudo service nginx restart

$ sudo systemctl restart nginx

$ sudo /etc/init.d/nginx restart

 

// 중지

$ sudo service nginx stop

$ sudo systemctl stop nginx

$ sudo /etc/init.d/nginx stop

 

// 상태

$ sudo service nginx status

$ sudo systemctl status nginx

 

// 설정 reload

$ sudo service nginx reload

$ sudo systemctl reload nginx

$ sudo nginx -s reload

 

// configuration file syntax check

$ sudo nginx -t

 

Nginx 설정

설정 파일들 경로

nginx 설치 방법에는 2가지 방법이 있다고 했다. 각 설치법에 따라서 환경설정 파일의 위치가 다르다.

  • package(apt-get을 통한 설치)의 경우 : /etc/nginx에 위치

  • 직접 compile한 경우 : /usr/local/nginx/conf, /usr/local/etc/nginx

위에 3개의 폴더중에는 한 곳에 위치하게 되어있지만 다음 명령어를 통해서도 찾을 수 있다고 합니다.

$ sudo find / -name nginx.conf

 

설정 파일들

모든 설정파일들을 건드려보지 않았기에 설정 할 때 필요한 몇가지 파일 및 폴더들만 보겠습니다.

  • nginx.conf : nginx와 그 모듈들이 작동하는 방식에 대한 설정 파일입니다. sites-enabled안에 각각 서버에 대한 conf파일들을 만들고 이 안에 첨부하여 웹서버를 운영할 수 있습니다. conf 파일안을 보시면 http, server, location, upstream과 같이 나누어져 있는데 이를 블록이라 하며 server는 가상 서버 혹은 일반 서버를 호스팅 할 때 사용되며 location의 경우 특정 폴더 밑 파일에 대한 경로를 지정해주고 upstream의 경우 Reverse Proxy 설정을 위해서 사용됩니다.

  • sites-enabled : 위에서 말한 nginx.conf에 첨부해서 실제로 서버를 운영할 설정 파일들이 들어있는 폴더입니다. 실제로 코드를 보면 nginx.conf에서 여기 폴더에 있는 모든 파일들을 불러옵니다.

  • fastcgi_params, scgi_params, uwsgi_params : uwsgi와 같이 웹 서버와 애플리케이션 서버 사이에서 인터페이스 역할을 해줄 때 필요한 파일들입니다.

파일을 어떻게 사용하는지에 대한 간단한 설명은 다음 포스팅에서 Nginx-uWSGI-Django 연결 편에서 사용해볼 예정입니다.

 

접속을 통한 확인

이제 설치가 모두 되었다면 자신의 컴퓨터의 IP주소를 브라우저 창에 치면 아래와 같이 “Welcome to nginx”가 나와야합니다.

제 경우에는 Domain이 있어서 도메인 명을 통해서 접속하였습니다.

 

완료된 현재 구조

현재 구조는 현재 아래처럼 웹 클라이언트가 현재 내 웹 서버에 Nginx를 통해서 접근하고 가장 기본 index.html을 띄워주는 구조로 되어있습니다.

  • Web Client <-> Web Server(Nginx)

 

참고자료

 

반응형

'OS' 카테고리의 다른 글

서버 IP확인 && 서버 IP 노출 방지 체크리스트  (0) 2020.10.26
Response Headers에 서버정보 숨기기  (0) 2020.10.26
Bastion host란?  (0) 2020.10.26
Windows Error codes / 단축키  (0) 2020.09.21
리눅스에 워드프레스 설치  (0) 2020.08.20