토이 프로젝트/서버갖고 놀기 for DevOps

웹 서버 기본 뼈대 구축 : LEMP

TerianP 2021. 4. 1.
728x90

첫 시작은 라즈베리 파이에 웹 서버 기본 뼈대 구축에 대한 정리글을 써볼까 합니다. LEMP - Linux + NGINX + MariaDB + PHP/Python/Perl 을 기본으로 구축하였습니다.

여기서 아파치가 아닌 nginx 를 설치하는 이유는...php는 예전에 잠깐 써봤었고, nginx는 한번도 안써봤기 때문에 아주 단순히 새로운것을 써보고 싶어서 입니다ㅋㅋㅋ마찬가지의 이유로 mysql 이 아닌 mariaDB를 선택했고, nginx 에서 php를 구동시기키 위해 추가 설치를 할 예정입니다.

 

1. nginx 설치하기

1-1. nginx 설치

설치에 앞서 apt-get update/upgrade 를 사용하여 apt-get 을 최신 상태로 유지합니다

이후 sudo apt-get install nginx-extras 명령어를 사용하여 nginx를 설치해줍니다.

 apt-get update/upgrade 
sudo apt-get install nginx-extras

 

이때 nginx-extras를 설치하는 이유는 nginx 종류가 nginx, nginx-light, nginx-full, nginx-extras 처럼 여러가지라고 하는데, 기본 nginx 패키지에서는 webdav 사용이 불가능하다고 하네요(webdav는 추후 다룰 예정)

 

하지만!! nginx-full, nginx-extra 는 webdav 를 사용할 수 있습니다. 이에 full 패키지를 설치하려했으나, full 패키지는 FLV 와 MP4 구동이 안된다는 이야기를 들어서....결국 nginx-extras 패키지를 설치하기로 합니다.

 

설치 확인 완료!

1-2. nginx 포트 바꾸기

Nginx 는 다른 http 기본 포트인 80 포트를 기본으로 사용합니다.

그러나 기본포트를 사용하다가는...혹시나 다른 사람에게 공격받을 위험도 있고, 쓸데없이 노출이 있을 수 있기 때문에 우리는 포트를 바꿔줍시다. 또한 아래 모든 파일은 sudo 명령어를 사용해서 수정해야 정상적으로 수정이 가능합니다

포트를 바꾸기 전에 nginx 서비스를 한번 종료시켜줍니다

service nginx stop

 

Nginx 의 포트를 바꾸는 방법은 크게 2가지입니다.

1. /etc/nginx/sites-enabled/default 파일을 수정하기

2. /etc/nginx/default.conf 파일을 추가해서 설정하기

 

먼저 1번 방법부터 가겠습니다 

일단 /etc/nginx/sites-enabled/ 위치로 들어간 후 아래 명령어를 사용하여 default 백업 파일을 생성해줍니다(백업은 항상 중요합니다)

sudo cp default default_bak

백업 확인

백업 확인을 완료하면 해당 default 파일을 열어서 다음 내용을 수정합니다.

수정 내용 : listen 80 ~~ // listen [::]:80 ~~~ 으로 되어있는 부분에서 80을 내가 사용하고자 하는 포트로 변경

listen 80 ~~ // listen [::]:80 변경

이후 다음 명령어를 사용해 nginx 서비스를 재시작합니다.

sudo service nginx restart

 

2번 방법은 아래를 따라갑니다.

 

먼저 /etc/nginx/ 위치의 nginx.conf 파일을 열어서 http 안에 다음 내용이 있는 것을 확인합니다.

아래 사진의 두 가지 내용중 include /etc/nginx/sites-enabled/*; 부분을 비활성화 시켜줍니다

  • include /etc/nginx/sites-enabled/*;
  • # include /etc/nginx/sites-enabled/*;

요런 느낌으로요

다음으로 /etc/nginx/conf.d 위치로 들어가서 default.conf 파일을 수정합니다. 만약 파일이 없는경우, 파일을 하나 생성해줍니다(touch default.conf)

 

그리고 default.conf 파일에 다음 내용을 추가합니다.

server {
 listen 8080;
 listen [::]:8080;

 root /var/www/html;
 index index.html index.htm index.nginx-debian.html;
 
 server_name _;

 location / {

  try_files $uri $uri/ =404;
 }

}

 

사실 눈치가 빠른 분들이라면 여기서 눈치채셨겠지만 default.conf 파일을 만들어 수정하는 것은 단순히 /etc/nginx/sites-enabled/default 를 사용하지 않겠다, 다만 내가 만든 default.conf 를 사용하겠다 라고 설정하고 수정을 하는 것입니다. 그렇기에 default.conf 를 수정하기 위해 #/etc/nginx/sites-enabled/ 를 하는 것이구요.

 

추가로 저는 /etc/nginx/sites-enabled/default 파일을 수정하는것을 추천드립니다. 이는 이후 php 와 연동하는 과정에서 /etc/nginx/sites-enabled/default 의 파일을 사용하는게 더 쉽게 할 수 있기 때문이죠. 물론 default.conf 를 사용해도 잘 추가만 한다면 어찌어찌 가능은 할 것 같은데...ㅠㅠ

 

여튼 이렇게 수정을 완료하면 sudo service nginx start 명령어를 사용해 nginx 를 시작합니다.

nginx 종료 및 재시작
sudo service nginx stop
sudo service nginx start
혹은 
sudo service nginx restart

이후 인터넷 주소창에 [라즈베리파이IP]:90 를 사용해서 들어갔을 때 사용해서 들어갔을 때

nginx 구동 성공 화면

추가로 다음 명령어 2개를 사용하면 각각 nginx 서비스 구동 여부, 사용하고 있는 포트를 확인 하실 수 있습니다.

service nginx status

nginx 서비스 동작 확인

netstat -antp

사용하는 포트 확인 => ::90 확인 가능

2. MariaDB 설치

mariaDB 는 mysql 과 동일한 DB 작업을 위해 설치하는 패키지이며 사실상 둘은 동일한 명령어를 사용하고 mysql 의 발전판이 mariaDB라고 합니다. 그래서인지 DB 접속할때도 mysql -u 를 명령어로 사용하는듯 하네요.

DB 명령어 작업에서 특히 중요한 것은 모든 명령어 뒤에 세미콜른 ; 가 붙는다는 점인데, 이거 없으면 미친듯이 오류가 나오니...매우 조심해야 합니다

먼저 설치를 위해 다음 명령어를 사용합니다.

sudo apt-get install mariadb-server

설치가 완료된 후에는 다음 명령어를 사용하여 DB의 root 패스워드 및 각종 보안 설정을 해줍시다

여기서 중요한 부분은 추가 표시해두겠습니다

sudo 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 ## 설정1
New password:
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 ## 설정2
 ... 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] n ## 설정3
 ... skipping.

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 ## 설정4
 - 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 ## 설정5
 ... 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!

 - 설정 1 : Set root password? [Y/n] y ⇒ DB의 root 초기 패스워드를 설정합니다. 기본적으로 설치시에는 DB의 패스워드가 없기때문에 y를 눌러서 무조건 설정해줍시다

- 설정 2 : Remove anonymous users? [Y/n] y ⇒ 익명 사용자를 제거합니다. 보안상 y 해줍시다

- 설정 3 : Disallow root login remotely? [Y/n] n ⇒ 원격 제어 여부입니다. 우리는 원격 제어를 위해 n 을 해줍니다

- 설정 4 : Remove test database and access to it? [Y/n] y ⇒ 초기 테스트 DB 삭제 여부입니다. 사용을 할꺼면 n 아니면 y 을 해줍시다. 저는 제가 만들어서 테스트 할꺼라서...삭제!!

- 설정 5 : Reload privilege tables now? [Y/n] y ⇒ DB reload 를 통한 지금까지의 설정 저장 여부입니다. 당연히 y!!

 

설정까지 완료되면 다음 명령어를 사용하여 mariadb 서비스를 시작해주시고 접속테스트 까지 합니다.

  • mariaDB 서비스 시작 명령어 : service mariadb start
  • mariaDB 시작 명령어 : mysql -u [유저명] 입니다

아래처럼 나오는 화면을 보면 DB에 정상적으로 접속한 것을 확인할 수 있습니다.

sudo service mariadb start ## DB 실행 명령어
sudo mysql -u root ## DB 로그인 명령어

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 60
Server version: 10.3.27-MariaDB-0+deb10u1 Raspbian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

 

2-1 현재 사용하는 계정에 DB 사용 권한 부여

그런데 여기서 문제가 생기죠. 현재는 root 계정에서만 db를 실행할 수 있습니다. 이러면 물론 보안상에는 좋지만...사용하기 너무 힘들어져요ㅠㅠ

아마 직접 mysql -u [본인 계정명] -p 라고 치면 분명 접속안된다고 에러가 발생할 것입니다.

 

그래서 이제는 현재 제 주 계정인 jsj 계정으로 DB 에 접근하기 위한 권한 부여 작업을 할 것입니다. 최종적으로는 jsj 계정이 DB에서 root 계정과 동일한 권한이 있도록 만들 예정입니다.

 

먼저 DB에 접속하여 root 가 어떤 권한을 갖고 있는지 확인해봅시다.

root 에는 모든 권한 - GRANT ALL PRIVILEGES - 가 있네요

일단 사진으로 확인되는 것은 모든 권한(ALL PRIVILEGES)가 로컬로만 접속가능한 root 계정에(root@localhost) 에 있으며, unix_socket 의 검사를 받는다라고 하네요

 

즉 우리가 해야할 것은 현재 사용하는 계정(제 경우는 JSJ)에 ROOT 와 마찬가지로 모든 DB 접근 권한(all privileges)를 주주는 것입니다!(unix_socket 인증 받는 부분은 일단 pass)

  1. 먼저 mysql -u root 로 db 에 접속합니다.
  2. use mysql; 을 사용해서 mysql에 접속합시다.
  3. grant all privileges on . to '[계정명]'@'[원격 접속 유무]' identified by '[사용할 비밀번호]' require none with grant option;
    • 중간에 계정명 에는 mysql 접속시 사용할 계정명을 사용할 비밀번호에는 접속시 사용할 비밀번호를 적습니다. 원격 접속 유무 부분에서는 원격 접속을 하겠다! 라고 하면 '%' 아니다 나는 로컬에서만 하고싶다 'localhost' 를 적습니다.
    • 저는 계정명은 jsj고 원격 접속을 하고 싶기에 grant all privileges on . to 'jsj'@'%' identified by '#######' require none with grant option; 요렇게 적었습니다
sudo mysql -u root ## root 계정으로 db접근
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 67
Server version: 10.3.27-MariaDB-0+deb10u1 Raspbian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use mysql; ## mysql DB를 사용한다고 선언
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
MariaDB [mysql]> grant all privileges on *.* to '[계정명]'@'%' identified by '[패스워드]' require none with grant option;
MariaDB [mysql]> \q

확인을 위해 재접속
jsj@raspberrypi:~ $ mysql -u jsj -p

4. 요렇게 설정을 완료한 후에 show grants for [계정명] 해서 다음과 root 의 사진과 똑같이 나오면 일단 설정이 완료된 것입니다!

그래도 혹시 모르니 quit; 혹은 \q 로 DB를 종료하고 다시 우리의 계정으로 다시 접속해서 접속까지 완료되면 진짜 끝!!

보이시죠? root 와 동일하게 GRANT ALL PRIVILEGES 권한이 들어간 것을 확인할 수 있습니다

3. nginx-php 연동

이제 마지막 작업입니다. nginx에서 php를 돌리기 위해 설치 작업을 시작해봅시다.

 

  1. php-fpm 설치
    • 먼저 우리는 php-fpm 을 설치해야 합니다. 그냥 php 가 아닌 fpm 을 설치하는 이유는...기본 php로 설치하게 되면 apache2 가 같이 따라와서 앞서 설정해두었떤 nginx 가 싹다 날아가버리는 허망한 일이 발생하게 됩니다. 싹.다. 날아가요. 어떻게 아냐고요? 묻지마세요ㅠㅠㅠㅠㅠㅠㅠ 여튼 그런 이유에서 fpm 을 설치합니다.
    • sudo apt-get install fpm
    • (필수) php-mysql : DB 연동을 위한 모듈. 필수입니다.
    • 다음은 php 사용을 쉽게하기 위한 보조? 모듈을 설치하는 작업입니다. 모듈은 인터넷에서 저보다 전문가인 멋진 분들께서 써주신 완벽한 여러 글에서 찾아왔습니다. 저는 다 설치했지만, 안하셔도 크게 상관없어요
    • php-mbstring : 다국어 처리 모듈
    • php-gd : 이미 처리 모듈
    • php-curl, php-xml : 이건 모르겠어요...대충 curl 은 curl 명령어 사용을 위한? 모듈같고, xml은 xml 관련이겠죠? 하튼 설치하면 좋다네요
    • php-bcmath : 수학 연산을 확장해주는 모듈. 언젠가는 쓰일 일이 있을꺼라고 믿고.
    • composer : php 패키지 의존성 관리 프로그램php 사용을 위한 각종 모듈 설치
  2.  설치 명령어
sudo apt-get install fpm
sudo apt-get install php-mysql, php-mbstring, php-gd, php-curl, php-xml, php-bcmath, php-composer

 

4. php 설정값 변경

설치가 완료되면 php의 원활한 작동을 위해서 옵션값들을 살짝 건들여봅시다. 건드릴 파일은 php.ini 입니다.

얘들은 /etc/php/7.3/fpm/php.ini 와  /etc/php/7.3/cli/php.ini 이렇게 두곳에 있고 저는 이중에 fpm 디렉토리 안 php.ini 만 설정을 만지겠습니다.

 

문서 편집기로 열어서 다음 부분들을 수정합니다.

- date.timezone = Asia/Seoul memory_limit = 128M ## 기본값이 128이며 이 값은 php 가 사용할 최대 메모리 용량입니다. post_max_size = 600M ## 최대 2GB 이며 php 로 생성되는 게시물 하나의 최대 용량입니다. 게시물의 첨부파일 용량까지 포함함으로 아래 upload_max_filesize 보다 큰 값을 지정해야합니다. 일반적으로 upload_max 보다 20% 크게 지정해야 합니다.

 

- upload_max_filesize = 200M ## 최대값은 2GB 이며 업로드 파일의 최대 용량입니다. 저는 추후 파일 업로드 php를 만들것임으로 200M 까지 잡았습니다.

 

- max_file_upload = 20 ## 한번에 업로드 할 수 있는 최대 파일 갯수입니다.

 

- max_execution_time = 60 ## input 받는 php 가 실행되는 최대 시간입니다. 이 값을 넘겨서 작동되는 php는 강제종료 됩니다. post_max_size 와 upload_max_fileszie의 값을 늘렸다면 이 값도 늘려야 합니다.

 

- max_input_time = 120 ## 기본값은 60 이고 php 엔진이 데이터를 입력받는 최대 시간입니다. max_execution_time 와 max_input_time 를 늘릴 때는 네트워크 속도를 고려해야 합니다.

 

다음으로 systemctl restart php7.3-fpm.service 를 입력하여 php 설정을 반영해줍니다.

 

5. 이제 마지막입니다. php 와 nginx 를 연동해보겠습니다.

php 연동을 위해서는 먼저 nginx 서버 설정 파일을 열고 php 파일을 nginx 에 연결하는 과정이 필요합니다. 저~~기 위에 썼던 nginx 그 파일을 수정하시면 되겠습니다. ⇒ /etc/nginx/conf.d/default.conf 파일 입니다.

 

먼저 아래의 문구에서 index.php 를 추가합니다. 여기는 일종의 우선순위 같은 것인데 index.html, index,nginx-debian.html 등 보다 index.php 를 우선하겠다는 의미입니다.

사진에서 보이는 것처럼 index.php 를 맨 앞쪽에 추가해줍니다.

다음으로 같은 파일 내 location 부분에서 fastcgi pass unix~~~~ 부분만 주석 해제(# 을 지우면 주석이 해제됩니다)합니다.

요렇게 # 을 제거해서 주석을 해제해줍시다

세번째로 web 기본 경로 /var/www/html 로 가서 index.php 파일을 하나 만들어줍니다

내용은 다음과 같습니다.

<?php
phpinfo();
?>

이렇게 설정을 마치면 php-fpm 과 nginx 를 재시작해주시면 완료입니다!!

sudo service php7.3-fpm.service stop
sudo service php7.3-fpm.service start

sudo service nginx stop
sudo service nginx start

 

이제 설치도 마치고 설정도 완료했으니 확인을 해야겠죠?

최종적으로는 http://loaclhost/index.php 또는 http//도메인주소/index.php 로 들어갔을때 다음 화면이 나오면 성공입니다.

쨘!! nginx - php 연동 후 확인이 완료되었습니다

 

긴 글 읽어주셔서 모두 감사합니다!

댓글