웹사이트 검색

Fedora 32에서 Opcache, Redis 및 Lets Encrypt와 함께 PHP 및 MariaDB(LEMP 스택)로 Nginx를 설치하는 방법


이 튜토리얼은 다음 OS 버전에 대해 존재합니다.

  • 페도라 32
  • 페도라 17

이 페이지에서

  1. 전제 조건
  2. 방화벽 구성\n
  3. PHP 설치
  4. MariaDB 설치
  5. 레디스 설치
  6. Redis 서버 구성
  7. Nginx 설치
  8. Nginx 구성
  9. PHP-FPM 구성
  10. phpMyAdmin 설치
  11. phpMyAdmin 구성
  12. Opcache 구성
  13. Lets Encrypt를 통해 SSL 설치\n
  14. SSL 자동 갱신 구성
  15. 결론

LEMP 소프트웨어 스택은 서버가 웹사이트와 앱을 호스팅할 수 있도록 함께 설치되는 오픈 소스 소프트웨어 그룹입니다. Linux, ENginx 서버, MySQL(MariaDB 사용) 및 PHP의 약어입니다.

이 가이드에서는 Fedora 32 기반 서버에 LEMP 스택을 설치합니다. 또한 phpMyAdmin, Redis, Opcache 및 Lets Encrypt SSL도 설치합니다.

전제 조건

Fedora 32를 실행하는 서버.

루트가 아닌 sudo 사용자.

모든 것이 업데이트되었는지 확인하십시오.

$ sudo dnf upgrade

시스템에 필요한 패키지가 거의 없습니다.

$ sudo dnf install wget curl nano -y

이러한 패키지 중 일부는 시스템에 이미 설치되어 있을 수 있습니다.

SELinux를 비활성화합니다.

$ sudo setenforce 0

방화벽 구성

첫 번째 단계는 방화벽을 구성하는 것입니다. Fedora 서버에는 Firewalld 방화벽이 미리 설치되어 있습니다.

방화벽이 실행 중인지 확인하십시오.

$ sudo firewall-cmd --state

다음 출력을 얻어야 합니다.

running

방화벽의 기본 영역을 공개로 설정합니다.

$ sudo firewall-cmd --set-default-zone=public

현재 허용된 서비스/포트를 확인하십시오.

$ sudo firewall-cmd --zone=public --permanent --list-services

다음 출력이 표시되어야 합니다.

dhcpv6-client mdns ssh

HTTP 및 HTTPS 포트를 허용합니다.

$ sudo firewall-cmd --zone=public --permanent --add-service=http
$ sudo firewall-cmd --zone=public --permanent --add-service=https

방화벽의 상태를 다시 확인하십시오.

$ sudo firewall-cmd --zone=public --permanent --list-services

비슷한 출력이 표시되어야 합니다.

dhcpv6-client http https mdns ssh

방화벽을 다시 로드합니다.

$ sudo systemctl reload firewalld

PHP 설치

Fedora 32는 기본적으로 PHP 7.4와 함께 제공되지만 업데이트된 PHP 리포지토리를 갖기 위해 REMI 리포지토리를 추가합니다.

PHP 패키지 설치를 위한 공식 Fedora 리포지토리인 REMI 리포지토리를 설치합니다.

$ sudo dnf -y install https://rpms.remirepo.net/fedora/remi-release-32.rpm

remi 저장소를 활성화하고 remi-modular 저장소를 비활성화합니다. 이렇게 하면 PHP 7.4 패키지를 설치하는 데 필요한 리포지토리가 활성화됩니다.

$ sudo dnf config-manager --set-enabled remi
$ sudo dnf config-manager --set-disabled remi-modular

일부 추가 패키지와 함께 PHP 7.4를 설치합니다.

$ sudo dnf install -y php-cli php-fpm php-mysqlnd

PHP가 올바르게 작동하는지 확인하십시오.

$ php --version

비슷한 출력이 표시되어야 합니다.

PHP 7.4.6 (cli) (built: May 12 2020 08:09:15) ( NTS ) 
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

MariaDB 설치

MariaDB는 MySQL의 드롭인 대체품으로 MariaDB를 실행하고 작동하는 명령이 MySQL과 동일합니다.

기본적으로 Fedora 32는 현재 사용 가능한 최신 안정 버전인 MariaDB 10.4와 함께 제공되므로 이를 사용할 것입니다.

MariaDB를 설치하려면 다음 명령을 실행하십시오.

$ sudo dnf install mariadb-server -y

MariaDB가 올바르게 설치되었는지 확인하십시오.

$ mysql --version

다음 출력이 표시되어야 합니다.

mysql  Ver 15.1 Distrib 10.4.12-MariaDB, for Linux (x86_64) using  EditLine wrapper

MariaDB 서비스를 활성화하고 시작합니다.

$ sudo systemctl enable mariadb
$ sudo systemctl start mariadb

다음 명령을 실행하여 루트 암호 제공, 익명 사용자 제거, 원격 루트 로그인 금지 및 테스트 테이블 삭제와 같은 기본 구성을 수행합니다.

$ sudo mysql_secure_installation

MariaDB 10.4에서는 이제 루트 암호 또는 unix_socket 플러그인 사용 사이에 묻는 메시지가 표시됩니다. unix_socket 플러그인을 사용하면 Linux 사용자 자격 증명으로 MariaDB에 로그인할 수 있습니다. phpMyAdmin과 같은 타사 앱을 사용하려면 기존 사용자 이름/암호가 필요하지만 더 안전한 것으로 간주됩니다. 이 튜토리얼에서는 unix_socket 플러그인을 계속 사용할 것입니다. 데이터베이스에 대해 생성한 특정 사용자를 통해 phpMyAdmin을 계속 사용할 수 있습니다.

Enter 키를 누르면 기본 옵션(대문자로 표시된 옵션, 이 경우 Y)이 선택됩니다.

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
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none): [PRESS ENTER]
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] [PRESS ENTER]
Enabled successfully!
Reloading privilege tables..
 ... Success!

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] [ANSWER n]
... skipping.

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] [PRESS ENTER]
 ... 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] [PRESS ENTER]
 ... 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] [PRESS ENTER]
 \- 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] [PRESS ENTER]
 ... 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!

그게 다야. 다음에 MySQL에 로그인하려면 다음 명령을 사용하십시오.

$ sudo mysql

프롬프트가 표시되면 루트 비밀번호를 입력하십시오.

레디스 설치

Fedora 32에는 Redis 패키지 v5.0.8이 포함되어 있지만 이전에 PHP용으로 설치한 Remi 리포지토리에는 이 튜토리얼을 작성할 당시 최신 버전의 Redis(v6.0.1)가 포함되어 있습니다.

다음 명령을 사용하여 Redis 및 해당 PHP Redis 확장을 설치합니다.

$ sudo dnf install redis php-redis

Redis 서비스를 활성화합니다.

$ sudo systemctl enable --now redis

Redis 서버 구성

Redis 서버에서 몇 가지 기본 구성을 수행해 보겠습니다.

Nano 편집기로 /etc/redis.conf 파일을 엽니다.

$ sudo nano /etc/redis.conf

원격 클라이언트가 Redis 인스턴스에 연결하도록 하려면 bind 127.0.0.1 줄을 찾아 다음과 같이 변경합니다.

bind 0.0.0.0

Redis가 수신 대기하는 기본 포트를 6379에서 선택한 값으로 변경할 수도 있습니다.

port 3458

Redis를 캐시 서버로 구성하려면 다음 값을 주어진 대로 설정합니다.

maxmemory 256mb
maxmemory-policy allkeys-lru

이는 Redis에게 최대 메모리 256MB에 도달하면 LRU 알고리즘을 사용하여 키를 제거하도록 지시합니다. 요구 사항 및 사용 중인 서버에 따라 메모리 값을 설정할 수 있습니다.

Redis가 필요한 모든 클라이언트가 먼저 인증을 받도록 암호를 설정할 수 있습니다. 그렇게 하려면 다음 지시문을 사용하여 암호를 설정하십시오.

requirepass  <AuthPassword>

구성 파일에서 변경할 지시문을 더 찾을 수 있습니다. 완료되면 Ctrl + X를 누르고 파일을 저장하라는 메시지가 표시되면 Y를 입력합니다.

변경 사항을 적용하려면 Redis 서버를 다시 시작하십시오.

$ sudo systemctl restart redis

또한 Redis가 작동하도록 방화벽에 규칙을 추가해야 합니다.

$ sudo firewall-cmd --zone=public --permanent --add-port=6379/tcp
$ sudo firewall-cmd --reload

위의 구성 파일에서 선택한 포트와 일치하도록 위 명령의 값을 변경해야 합니다.

Nginx 설치

Fedora 32는 기본적으로 Nginx의 최신 안정 버전과 함께 제공됩니다. (1.18.0).

Nginx를 설치합니다.

$ sudo dnf install nginx -y

제대로 작동하는지 확인하십시오.

$ nginx -v

설치하기로 선택한 Nginx 버전에 따라 다음 출력이 표시되어야 합니다.

nginx version: nginx/1.18.0

Nginx를 시작하고 활성화합니다.

$ sudo systemctl start nginx
$ sudo systemctl enable nginx

다음 페이지를 보려면 브라우저에서 서버 IP 주소를 여십시오. Nginx가 제대로 작동하고 있음을 의미합니다.

Nginx 구성

서버 블록이 위치할 디렉토리를 설정합니다.

$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled

사이트가 위치할 디렉터리를 만듭니다.

$ sudo mkdir /var/www/example.com/html -p

-p 지시문을 사용하면 이전에 존재하지 않았던 상위 디렉토리가 생성됩니다.

다음 명령을 실행하여 사이트에 대한 구성 파일을 추가하십시오.

$ sudo nano /etc/nginx/sites-available/example.com.conf

편집기에 다음 코드를 붙여넣습니다.

server {
  listen          *:80;
  server_name     example.com;
  root            /var/www/example.com/html;
  index           index.php index.html;

  location / {
    try_files   $uri $uri/ =404;
  }
    
  access_log /var/log/nginx/example.com.access.log;
  error_log /var/log/nginx/example.com.error.log;

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass  unix:/run/php-fpm/www.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
    include  fastcgi_params;
  }
}

Ctrl + X를 눌러 편집기를 닫고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.

이 파일은 /var/www/html 디렉토리에서 example.com을 호스팅한다고 가정합니다. 도메인을 사용하지 않고 IP 주소/로컬 호스트를 통해서만 서버에 액세스할 수 있도록 구성하려는 경우 nginx.conf 파일에서 해당 서버 블록 설정을 제거해야 합니다. 그렇지 않으면 엉망이 됩니다. 생성할 서버 블록으로.

sites-enabled 디렉터리에 연결하여 이 구성 파일을 활성화합니다.

$ sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/

편집을 위해 /etc/nginx/nginx.conf 파일을 엽니다.

$ sudo nano /etc/nginx/nginx.conf	

include /etc/nginx/conf.d/*.conf 줄 뒤에 다음 줄을 붙여넣습니다.

include /etc/nginx/sites-enabled/*.conf;
server_names_hash_bucket_size 64;

types_hash_max_size 값을 2048에서 4096으로 변경합니다.

types_hash_max_size 4096;

Ctrl + X를 눌러 편집기를 닫고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다. Nginx 구성을 테스트합니다.

$ sudo nginx -t

구성이 올바르다는 것을 나타내는 다음 출력이 표시되어야 합니다.

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nginx 서비스를 다시 로드합니다.

$ sudo systemctl reload nginx

PHP-FPM 구성

/etc/php-fpm.d/www.conf 파일을 엽니다.

$ sudo nano /etc/php-fpm.d/www.conf

PHP 프로세스의 Unix 사용자/그룹을 nginx로 설정해야 합니다. 파일에서 user=apachegroup=apache 줄을 찾아 nginx로 변경합니다.

...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
...

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

PHP-fpm 프로세스를 다시 시작하십시오.

$ sudo systemctl restart php-fpm

PHP 설정을 테스트하려면 html 폴더에 test.php 파일을 만듭니다.

$ sudo nano /var/www/example.com/html/test.php

다음 콘텐츠를 추가하고 Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

<?php phpinfo();

웹 브라우저에서 http:///test.php를 실행하면 다음이 표시되어야 합니다.

phpMyAdmin 설치

Remi Repository는 최신 phpMyAdmin을 가지고 있으므로 다음 명령을 사용하여 간단히 설치할 수 있습니다.

$ sudo dnf install phpmyadmin

/usr/share/phpMyAdmin 디렉토리에 설치됩니다.

phpMyAdmin 구성

Nginx 웹 서버가 phpMyAdmin 파일을 올바르게 찾고 제공하려면 실제 위치에서 Nginxs 루트 문서 디렉토리로의 심볼릭 링크를 생성해야 합니다.

이렇게 하려면 다음 명령을 실행합니다.

$ sudo ln -s /usr/share/phpmyadmin /var/www/example.com/html/phpmyadmin

phpMyAdmin 설치가 작동 중입니다. 액세스하려면 http://example.com/phpmyadmin을 열기만 하면 됩니다.

PHP 세션 오류가 발생하면 다음 명령을 실행하여 PHP 세션 디렉토리에 적절한 권한을 부여하십시오. 앞에서 만든 test.php 파일에서 세션 경로를 확인하세요. 우리에게는 /var/lib/php/session에 있습니다.

$ sudo chown -R nginx:nginx /var/lib/php/session

기본적으로 이 기본 위치는 해커가 phpMyAdmin 설치를 찾을 수 있는 가장 일반적인 위치이므로 변경해야 합니다. 이렇게 하려면 다음 명령을 실행합니다.

$ sudo mv phpmyadmin sm123

기본적으로 phpMyAdmin 위치를 sm123 폴더로 옮겼습니다. 액세스하려면 이제 브라우저에서 http://example.com/sm123을 열어야 합니다.

여기서는 MySQL과 함께 unix_authentication을 사용하고 있으므로 phpMyAdmin을 통해 로그인할 루트 사용자가 없습니다. 먼저 MySQL 사용자를 생성하고 phpMyAdmin을 사용할 수 있도록 데이터베이스에 대한 권한을 부여해야 합니다.

Opcache 구성

Remis 저장소에서 phpMyAdmin을 설치하면 Opcache도 설치됩니다. phpMyAdmin을 설치하지 않았고 원하지 않는 경우 다음 명령을 사용하여 간단히 Opcache를 설치할 수 있습니다.

$ sudo dnf install php-opcache	

설치되었는지 확인합니다.

$ php -v
PHP 7.4.5 (cli) (built: Apr 14 2020 12:54:33) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.5, Copyright (c), by Zend Technologies

Opcache 설정을 변경하려면 /etc/php.d/10-opcache.ini 파일을 엽니다.

$ sudo nano /etc/php.d/10-opcache.ini

다음 설정은 Opcache 사용을 시작하는 데 도움이 되며 일반적으로 좋은 성능으로 권장됩니다. 앞에 있는 ;를 제거하여 주석을 제거하여 구성을 활성화할 수 있습니다.

opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

설정을 적용하려면 서버를 다시 시작하십시오.

$ sudo systemctl reload nginx

Lets Encrypt를 통해 SSL 설치

SSL은 모든 웹사이트의 필수 요소가 되었습니다. 여기서는 Lets Encrypt 서비스를 사용하여 SSL을 설치합니다.

이를 위해 먼저 Certbot 도구를 설치합니다.

$ sudo dnf install certbot-nginx

인증서를 생성합니다.

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

우리는 기본 사이트와 phpMyAdmin 도메인 모두에 대한 인증서를 생성하고 있습니다.

시스템에서 certbot을 처음 실행하는 경우 이메일 주소를 입력하고 서비스 약관에 동의하라는 메시지가 표시됩니다. 또한 거절할 수 있는 EFF 재단과의 데이터 공유에 동의하는지 여부를 묻는 메시지가 표시됩니다. 그런 다음 certbot은 Lets Encrypt 서버와 통신하고 도메인을 확인하기 위해 챌린지를 실행합니다.

성공하면 HTTPS 리디렉션을 처리하는 방법을 묻는 메시지가 표시됩니다.

Please choose whether HTTPS access is required or optional.
-------------------------------------------------------------------------------
1: Easy - Allow both HTTP and HTTPS access to these sites
2: Secure - Make all requests redirect to secure HTTPS access
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

원하는 항목을 선택하고 Enter 키를 누릅니다. 인증서가 생성되고 Nginx 구성이 SSL 설정으로 업데이트됩니다.

인증서가 준비되었으며 이제 https://example.com으로 이동하여 사이트를 열 수 있습니다.

SSL 자동 갱신 구성

이 튜토리얼을 마치기 전 마지막 단계입니다. SSL을 갱신하려면 cron을 사용합니다.

Crontab 편집기를 사용하여 Cron에 항목을 추가해야 합니다. crontab 편집기를 열려면 다음 명령을 실행합니다.

$ EDITOR=nano sudo crontab -e

명령 앞에 있는 EDITOR=nano는 Fedora가 기본적으로 VIM 편집기를 선호하기 때문에 crontab이 Nano 편집기를 열도록 합니다.

맨 아래에 다음 줄을 붙여넣습니다.

. . .
25 2 * * * /usr/bin/certbot renew --quiet

이 줄의 25 2 * * * 부분은 "매일 오전 2:25에 다음 명령 실행\을 의미합니다. 언제든지 선택할 수 있습니다.

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

Certbot의 갱신 명령은 시스템에 설치된 모든 인증서를 확인하고 30일 이내에 만료되도록 설정된 인증서를 업데이트합니다. --quiet는 Certbot이 정보를 출력하지 않거나 사용자 입력을 기다리지 않도록 지시합니다.

이 명령은 매일 실행됩니다.

결론

이것이 이 튜토리얼의 전부입니다. LEMP 설정이 완료되었으며 웹사이트와 애플리케이션을 만들고 호스팅할 수 있습니다.