CentOS Nginx PHP MySQL 설치 및 연동 구성 - LEMP

Share

Last Updated on 1월 29, 2023 by Jade(정현호)

웹 어플리케이션을 구현하기 위한 스택

LEMP 는 Linux + Nginx + PHP-FPM + MySQL(MariaDB) 를 의미하는 약자이며 PHP 어플리케이션 구현을 위한 Stack 입니다 LEMP 외에 예전부터 많이 사용해온 APM 혹은 LAMP 인 Linux + Apache + PHP + Mysql(MariaDB) 형태의 Stack 도 여전히 많이 사용 되고 있습니다.

Nginx 는 러시아의 프로그래머 이고르 시쇼브(Игорь Сысоев)가 개발한 웹서버로 Apache에 비해 가볍고 빠른 장점이 있으며 Proxy Pass 형태로 백엔드에 있는 어플리케이션으로 전달하는 역할로 주로 사용 되고 있습니다. 2019년 3월에 미국의 F5 Networks Inc(2022년에 사명을 F5 Inc 로 변경) 가 NGINX Inc를 6억 7천만달러에 인수하였습니다.


* LEMP/APM 설치 ,도메인 설정 등을 완료 후 워드프레스 이외 제로보드XE 나 라이믹스(Rhymix),그누보드 등 사용하여도 됩니다


• 설치 환경
OS: Centos 7.8 
Nginx 1.19.4 + PHP 7.4(PHP-FPM) + MySQL5.7



다른 플렛폼이나 다른 스택 구성글은 아래 포스팅을 참조하시면 됩니다
  • CentOS 7.8 / Apache PHP MySQL [Link]

  • 우분투 / Apache PHP MySQL [Link]
  • 우분투 / Nginx PHP-FPM MariaDB [Link]
  • CentOS 8.3  / Nginx PHP-FPM MariaDB [Link]
      

Nginx 설치

Nginx 를 설치를 진행 할 것이며 Nginx 는 Mainline 버전과 Stable 버전이 있습니다.
        

Nginx 설치 종류

Nginx 는 Mainline 버전과 Stable 버전 이 있으며 새로운 특징, 기능, 버그 패치 등은 Mainline 버전에서 작업하고 그 이후에, 새로운 기능이 추가되지 않고 버그 패치만 하는 게 Stable 버전입니다.


버전 선택에 관련해서 NGINX 의 공식 입장은 다음과 같습니다.

We recommend that in general you deploy the NGINX mainline branch at all times.
The main reason to use the stable branch is that you are concerned about possible impacts of new features,
such as incompatibility with third-party modules or the inadvertent introduction of bugs in new features.


Nginx 에서는 기본적으로 Mainline 버전을 택하고 지속적으로 업데이트 하기를 권장하고 있습니다.

Stable 버전은 3rd party(서드 파티) 모듈과 호환성 문제 또는 New Feature 로 인한 문제로 인하여 업데이트가 불가능한 상황에서 사용하면 된다고 합니다.

버전은 환경을 고려하여 선택하시면 될 것 같습니다


* 여기 에서는  Mainline 버전으로 하여 최신버전을 설치 하도록 하겠습니다.
* 설치의 진행은 root 유저로 하였습니다
       

설치 진행

필요 패키지 설치하기

[root]# yum install -y yum-utils curl gnupg2


Nginx Repository 생성

[root]# vi /etc/yum.repos.d/nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true


[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true


위의 내용으로 nginx.repo 생성시 stable 버전이 Default 입니다.

포스팅에서는 mainline nginx packages 를 사용 할 것임으로 mainline repository를 활성화 하도록 하겠습니다.

[root]#  yum-config-manager --enable nginx-mainline


Nginx 설치

[root]# yum -y install nginx

[root]# nginx -V
nginx version: nginx/1.19.4
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled


[참고] TLS 1.3 사용을 위해서 별도의 작업이 필요하며 Source RPM 컴파일 방식의 설치는 아래 포스팅을 참조하세요


그 다음으로는 MySQL 설치를 진행하도록 하겠습니다.
       

MySQL

LEMP 스택 구성을 위한 MySQL 을 패키지로 설치하도록 하겠습니다.

설치후 OS의 mysql 계정과 mysql 그룹은 자동 추가가 됩니다.

         

Repository 구성 및 설치

MySQL repository 설치

[root]# rpm -Uvh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
[root]# yum clean all


MySQL Community 버전 설치

• 사전 패키지 설치
[root]# yum -y install libaio libaio-devel \
numactl-devel numactl ncurses ncurses-devel \
ncurses-libs ncurses-static \
openssl openssl-devel bison readline glibc \
gcc gcc-c++ cmake bash sysstat


• 새로운 인증서 설치
MySQL 설치 전 새로운 GPP-KEY 를 import 를 먼저 진행 합니다.

sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022



• MySQL 설치
[root]# yum -y install mysql-community-server mysql-community-devel


[참고] yum 으로 MySQL 설치시 GPG Keys 에러가 발생할 경우
yum 으로 MySQL 설치 진행시 아래와 같은 메세지가 발생 된다면 GPG Keys 와 관련된 에러로 예상됩니다.

Downloading packages:
warning: /.../mysql-community-client-8.0.28-1.el7.x86_64.rpm: 
Header V4 RSA/SHA256 Signature, key ID ...: NOKEY

Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
The GPG keys listed for the "MySQL x.0 Community Server" 
repository are already installed but they are not correct for this package.

Check that the correct key URLs are configured for this repository.
Failing package is: mysql-community-client-8.0.xxx.elx.x86_64
GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql



• root 패스워드 변경


[root]# systemctl start mysqld

* mysql 를 처음 시작 하고 로그에서 임시 비밀번호를 확인 할 수 있습니다.
[root]# cat /var/log/mysqld.log | grep "temporary password"
[Note] A temporary password is generated for root@localhost: RTZwovJ#r8*:


[root]# mysql -uroot -p

Enter password: <==위에서의 비밀번호 입력, RTZwovJ#r8*:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '변경할 패스워드';

                        <-- 패스워드는 복잡도를 고려 해야 합니다.

mysql> flush privileges;
mysql> exit;
       

MySQL 기본 설정 변경

기본 파라미터 설정

my.cnf 파일을 수정하여 기본적인 몇가지를 수정 및 추가 하도록 하겠습니다.

[root]# vi /etc/my.cnf


[mysqld] <-- 절에 아래 내용을 추가로 입력해 줍니다.

user=mysql
server-id=1
log_bin = binlog
expire_logs_days=5
innodb_buffer_pool_size = 384M
innodb_file_per_table=TRUE
bind-address=0.0.0.0
log_timestamps=SYSTEM
character-set-client-handshake=OFF
skip-character-set-client-handshake
max_allowed_packet=500M
init_connect=SET collation_connection = utf8mb4_general_ci
init_connect=SET NAMES utf8mb4
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci


MySQL 를 재시작 합니다.

[root]# systemctl restart mysqld


MySQL 파라미터 관련해서는 아래글에서 더 참조하시면 됩니다.

         

PHP

LEMP 스택 구성에서 이번에는 PHP 를 설치 하도록 하겠습니다.

외부 Repository 인 REMI 를 등록하여 REMI PHP 를 7.4 버전으로 설치 하도록 하겠습니다.
     

Repository 구성 및 설치

php 설치를 위한 Repository 설치

CentOS 7.8/7.9 기준으로 OS 기본 yum repository에 등록된 php 최신 버전은 5.4.16 입니다


그 이상 버전을 사용하려면 Source 를 다운로드 받아서 컴파일 하여 사용하거나 지금 과 같이 별도의 외부 Repository 를 등록하여 이미 빌드 된 패키지를 설치 할 수 있습니다.
외부 Repository 중에서 포스팅에서는 REMI repository 를 사용하였습니다.


REMI Repository 구성 파일 설치


[root]# yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm


Repository 설치 후 repo 파일을 수정 합니다.

[root]# vi /etc/yum.repos.d/remi.repo

[remi]
name=Remi's RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/remi/$basearch/
#mirrorlist=https://rpms.remirepo.net/enterprise/7/remi/httpsmirror
mirrorlist=http://cdn.remirepo.net/enterprise/7/remi/mirror
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

enable=0 -> enable=1 로 수정


REMI PHP 7.4 설치

[root]# yum -y install php74 php74-php-common \
php74-php-fpm php74-php-gd php74-php-xml \
php74-build php74-php php74-php-devel \
php74-php-mysqlnd php74-php-opcache \
php74-php-mbstring php74-php-pdo \
php74-php-pecl-crypto php74-php-pecl-imagick \
php74-php-pecl-imagick-devel php74-php-pecl-mcrypt \
php74-php-pecl-zip php74-php-bcmath \
php74-php-pecl-mysql curl curl-devel libpng libpng-devel \
libwebp libwebp-devel libXpm libXpm-devel openssl \
openssl-devel autoconf zlib zlib-devel freetype \
freetype-devel gd gd-devel libmcrypt libmcrypt-devel \
libtool-ltdl-devel libxml2-devel libxml2 libcurl libcurl-devel

* 버전은 8.0까지 설치 할 수 있으며 작성된 어플리케이션에 따라서 호환되는 버전을 사용하시면 됩니다.


설치 완료 후 확인

[root]# php74 -v
PHP 7.4.11 (cli) (built: Sep 29 2020 10:17:06) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.11, Copyright (c), by Zend Technologies


PHP 설정 변경 ( mod_php 와 php-fpm 공통)

[root]# vi /etc/opt/remi/php74/php.ini

아래 5개는 주석 제거 및 내용 수정합니다.

date.timezone = Asia/Seoul
expose_php = Off
post_max_size = 500M
upload_max_filesize = 200M
memory_limit = 512M
 

PHP-FPM 설정

PHP 를 설치 후에 같이 포함되어 있는 PHP-FPM 에 대한 설정을 진행하도록 하겠습니다.
      

php-fpm.conf 파일 수정

php-fpm.conf 파일을 수정하도록 하겠습니다.

[root]# cd /etc/opt/remi/php74

[root]# vi php-fpm.conf


daemonize = yes
-> 주석으로 되어 있다면 주석을 해제 합니다.


; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
;log_level = notice
-> PHP-FPM 데몬의 Log level Default 는 notice 입니다.
-> 문제에 대한 분석이나 초기 설정 후 확인 등이 필요하다면 debug 레벨로 변경하여 사용해도 됩니다.


include=/etc/opt/remi/php74/php-fpm.d/*.conf
-> include 로 하여 php74/php-fpm.d/ 아래 *.conf  절이 주석처리 되어 있는지 확인 합니다.
-> 버전 등에 따라 맨위나 맨아래, 혹은 맨 위나 맨 아래 둘 다 있을 수 있습니다.
-> 주석처리가 해제 되어 있는지만 체크 하면 됩니다.


## Socket Directory 생성 및 tmpdir 관련 설정

[root]# mkdir -p /run/php/

 ==> socket 이 생성될 위치를 먼저 생성 해줍니다.



재부팅 후에 디렉토리가 생성될 수 있도록 설정

[root]# cd /usr/lib/tmpfiles.d

[root]# vi php.conf

d /run/php 0755 root root -
==> php.conf 파일에 내용 입력


## php-rpm www.conf 파일 수정

# www.conf 수정

[root]# cd /etc/opt/remi/php74/php-fpm.d

[root]# vi www.conf

; pool name ('www' here)
[www]
-> PHP Pool 이름을 지정하는 항목 입니다.
   프로그램명이나 사이트 명이나, 업무가 있다면 업무명 등을 입력 하여도 됩니다.
   Pool 혹은 Container 의 식별, 이름 입니다 기본으로 www 지정되어 있습니디.
   Pool은 conf 파일 별로 여러개의 Pool을 만들 수 있습니다.
   이때는 Pool 별로 이름을 지정하여 겹치지 않게 해야 합니다.



= 주석 해제 및 apache 로 내용을 변경 합니다 mode 는 0660 으로 합니다.
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
listen.mode = 0660


listen = /run/php/php-fpm.sock
=> 이부분은 접속을 받는 방식을 설정하는 부분으로 Socket(UDS - Unix Domain Socket) 방식으로 사용 하거나 IP 방식으로 사용하거나 둘 중 하나를 선택하여 설정해야 합니다.


* IP 방식으로는 아래와 같이 지정 할 수 있습니다.
listen = 123.123.123.123.123:9000
listen = 127.0.0.1:9000
listen = 9000
   <== 이와 같이 IP 없이 포트만 기재하면 모든 주소에서 접속이 가능한 상태 입니다

    (listen on a TCP socket to all addresses)

IP 방식으로 사용은 보통의 경우 Nginx 와 PHP-FPM 이 별도로 분리된 서버로 구성 하였을 때 사용하게 됩니다.
물론 같은 서버에서 Nginx 와 PHP-FPM 을 같이 사용하는 환경에서도 IP 방식을 사용할 수 있습니다.


소켓 방식은 아래와 같이 파일명을 지정해주면 됩니다.
listen = /run/php/php-fpm.sock

일단은 같은 서버에서 nginx 와 php-fpm 사용 하는 설정으로 할 것임으로 socket 을 지정하여 설정하도록 하겠습니다
같은 서버내 라도 IP를 사용 할 수 있고 사용하여도 됩니다.



PHP-FPM 프로세스 설정

# 프로세스 수와 관련된 pm 으로 시작하는 파라미터 가 있습니다

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 40
pm.max_requests = 500

* 위의 설정값은 예시입니다.


pm.max_children 는 설정된 PHP Pool(여기서는 www) 내에서 가동할 수 있는 최대 자식 프로세스 수를 의미 합니다

pm.start_servers 는 php-fpm 을 실행할 때 초기에 생성하는 자식 프로세스의 개수입니다


pm.min_spare_servers 는 idle 상태의 자식 프로세스 개수가 이 개수보다 작으면 자식 프로세스를 생성합니다

pm.max_spare_servers 는 idle 상태의 자식 프로세스의 최대 개수를 의미 합니다.

pm.max_requests 는 각 프로세스가 최대 request를 처리하면 수 입니다.
500 으로 설정되어 있다면 500번 request 후 프로세스를 다시 생성 합니다
프로세스가 점진적인 메모리 증가에 대한부분을 방지 할 수 있습니다.
apache 에서 유사한 설정으로는 MaxRequestsPerChild 있습니다.


[참고] PHP-FPM 메모리 사용현황 및 세션 계산

아래 명령어를 이용하면 현재 fork된 php-fpm 프로세스 당 메모리 사용량을 확인 할 수 있습니다.

[root]# ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

시스템에 가용한 메모리나 사용 할 정도에서 프로세스당 사용메모리를 나누어서 최대 자식프로세스 개수를 산정 해도 되겠습니다

ex) PHP에 6GB 를 사용 하려고 함 , PHP-FPM이 현재 사용중인 메모리량이 대략 60MB 임
6000MB / 60MB = 자식 프로세스 개수 100개 로 설정

이와 같이 각 시스템 마다 메모리 상황을 고려하여 적절한 pm.max_children 값을 선정하여 설정하면 되겠습니다.


로그 관련 내용 수정

로그 관련된 파라미터의 주석 해제와 변경을 합니다.

access.log = /var/opt/remi/php74/log/php-fpm/$pool.access.log
   -> 주석 해제 및 경로 지정

access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
--> 주석제거

slowlog = /var/opt/remi/php74/log/php-fpm/$pool.slow.log
--> 주석제거, 파일명 변경

request_slowlog_timeout = 5
--> 주석제거, 내용변경
--> 단위는 초로 5는 예시 입니다. 해당 시간은 선택해서 변경 하시면 됩니다.

catch_workers_output = yes
-> 주석 제거 
-> main error log 파일에 worker 의 에러 로그가 같이 기록 되게 됩니다.

php_admin_value[error_log] = /var/opt/remi/php74/log/php-fpm/www-error.log
-> 주석 제거

php_admin_flag[log_errors] = on
-> 주석제거 
         

Nginx 설정

Nginx 설정 홈 디렉토리는 /etc/nginx 입니다.

nginx 최근버전에서는 /snippets /sites-enabled , /sites-available 같은 디렉토리 없이 conf.d 디렉토리만 존재 하고 nginx.conf 파일에서는 모든 conf 파일을 include 하여 사용하게 됩니다.


[root]# cd /etc/nginx
[root]# cat nginx.conf | grep conf
  include /etc/nginx/conf.d/*.conf
  => /etc/nginx/conf.d/ 아래에 .conf 파일은 자동으로 include 되어 적용 되게 됩니다.
      

nginx.conf 설정

nginx.conf 내용을 를 확인 해보겠습니다.

[root]# cd /etc/nginx
[root]# vi nginx.conf


user nginx;
  <== nginx 에서 사용할 OS로 유저로 nginx 로 사용하면 무난합니다.


#master_process ON; # ON is default
  <== 엔진엑스는 하나의 메인 프로세스(마스터 프로세스)와 여러 개의 작업자 프로세스를 시작할 수 있습니다 (ON) 
         ON 이 default 이고 off 로 해제하면 단인 프로세스로 동작하게 됩니다.
         해당 옵션은 기재가 되어있지는 않습니다 내용 참고를 위해 기재 한 것 입니다


worker_processes 4;
or
worker_processes auto;

접속을 받고 처리하는 worker process의 수 이며 정한 수만큼 기동시 프로세스가 생성됩니다.
보통 CPU Core 나 CPU Count 와 상관되어 결정되며 설정 이후 CPU의 사용률이 높지 않다면 올려서 사용 할 수 있습니다.

혹은 auto 로 nginx 알아서 생성되게 할 수도 있습니다.
저는 일단 4로 설정하고 사용 하도록 하겠습니다.


error_log /var/log/nginx/error.log notice;

로그 파일명과 경로, 로깅 레벨을 설정 할 수 있습니다.
로깅 레벨은 warn, error crit, alert, and emerg 설정 할 수 있습니다.

기동 과 중지 시 로그를 받을 수 있도록 notice 를 기본으로 사용 하면 됩니다.
문제 파악이나 설정시 테스트를 위해서는 debug를 사용하면 됩니다.


events {
worker_connections 1024;
}

worker_connections 는 woker 당 가능한 접속수를 의미 합니다.
위에서 worker 4로 지정 하였으면 4*1024 하여 4096 Connection이 가능하게 됩니다.


log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;
log_not_found off;

main 명칭의 로그 포팻으로 설정된 정보가 있고 설정된 main 포맷 Access 로그에서 사용 하고 있습니다

log_format main  을 수정하여 사용하거나 별도의 log format을 생성 후 access 로그에서 변경하여 사용 할 수 있습니다


### deflate ###
gzip on;
gzip_disable "msie6";
gzip_comp_level 6;
gzip_min_length 500;
gzip_buffers 16 8k;
gzip_proxied any;
gzip_vary on;
gzip_types text/plain text/css text/js text/xml text/javascript application/javascript application/x-javascript application/json application/xml application/rss+xml image/svg+xml image/png;


# gzip 설명

gzip(deflate) 는 HTTP 압축으로 HTTP 데이터는 서버로부터 전송되기 전에 압축됩니다.
nginx.conf 파일에 설정 하였기 때문에 모든 server block 에 공통으로 적용 되게 됩니다.

gzip on;
이 line을 통해 gzip을 사용할 것이라고 알려주는 것입니다.

gzip_disable "msie6";
IE 6이하에는 적용시키지 않습니다.

gzip_comp_level
압축의 정도를 설정하는 부분으로 높을수록 압축율이 높습니다
그대신 서버에서의 CPU 사용률이 올라가거나 압축에 더 시간이 소요될 수 있어서 적절한 값을 사용하는 것이 좋습니다.

gzip_types
압축을 할 대상 Source 파일의 종류를 지정 하는 것입니다.


그리고 gzip_types 아래 내용도 추가 합니다.

keepalive_timeout 65;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
aio on;
sendfile_max_chunk 512k;
directio 4m;
server_tokens off;
client_max_body_size 50M;

proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;

fastcgi_buffering on;
fastcgi_buffer_size 256k;
fastcgi_buffers 256 256k;
fastcgi_busy_buffers_size 256k;

fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;

http2_max_concurrent_streams 512;


[참고]    -> , => , ==>  는 모두 설명 입니다
     

서버 파일 수정

이제 각 서버 설정 파일을 수정 하도록 하겠습니다

[root]# cd /etc/nginx/conf.d
[root]# cp -rp default.conf default.conf.ori
  => 먼저 default 값으로 설정된 파일은 백업 후 설정을 변경 하여 사용하겠습니다.


[root]# vi default.conf

server {
listen 80 default_server;
    ==> 사용할 포트 번호입니다.
          default_server는 server 절이 여러개 있을 때 IP로 접속 하거나 없는 서브도메인 등으로 접속시 default 로 접속을 하게 되는 sever 절을 의미 합니다.
         server { } 중에서 한곳만 사용 할 수 있습니다


server_name localhost;
   ==> IP나 /etc/hosts에 설정된 호스트네임 , 도메인이 있다면 도메인명을 기재해 줍니다.
          도메인이 없다면 localhost  로 지정하시면 됩니다.


charset utf-8;
  ==> character set 설정입니다.

access_log /var/log/nginx/localhost.access.log main;
error_log /var/log/nginx/localhost.error.log;
  ==> Access , Error 로그는 기본적으로는 주석처리 되어 있습니다.
         주석을 해제하고 서버명이나 도메인명 등을 추가하여 로그를 확인 할 때 파일명으로 쉽게 찾을수 있도록 명시적으로 지정하는 것이 좋습니다.


# location /  절 수정

location 절을 아래와 같이 수정 합니다.


1) root 와 index 절을 location 밖에 기재해 줍니다.

root /usr/share/nginx/html;
   ==> html이나 php 파일을 읽을 디렉토리를 지정합니다.

index index.php index.html index.htm;
   ==> 접속시 처음 index 할 파일을 지정 합니다 index.php는 없으므로 추가 합니다


2) location 절은 아래와 같이 수정 합니다.
location / {
try_files $uri $uri/ =404;
}



error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

* 아래 부분이 PHP-PFM 과 연결되는 proxy 설정 부분 입니다.
   설명된 내용처럼 같은 서버에서 설정을 진행 하고 있기 때문에 UDS 방식으로 사용 하면 되고
   이부분은 php-fpm pool 에서도 socket이 사용 되로록 설정이 먼저 되어야 합니다.
 
  PHP-FPM 에서 "listen = /run/php/php7.4-fpm.sock" 


# 아래 내용을 추가 합니다

location ~ \.php$ {
fastcgi_pass unix:/run/php/php-fpm.sock;
# fastcgi_pass ip 혹은 UDS(Unix Domain Socket)인 .sock 파일중에
# php-fpm.d/www.conf 에서 설정대로 사용 해야 합니다
# fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 300;
}

location ~ /\.ht {
deny all;
}


[참고] 서버를 분리하여 별도에 서버에 Nginx 와 PHP-FPM 별도로 구성하는 경우
location ~ \.php$ {  절에 "try_files $uri =404;" 또는 "try_files $uri $uri/ =404;"  과 같은 try_files 구문이 있게 된다면 Nginx 가 설치된 서버와 PHP-FPM 이 설치된 서버에 모두에서 PHP 파일이 같이 있어야 합니다

같은 서버에서 Nginx 와 PHP-FPM 을 설치해서 사용하는 환경이라면 상관은 없으나 별도로 분리해서 PHP 코드 파일이 PHP-FPM 이 실행되는 서버에만 있을 경우 location ~ \.php$ { 절에서 "try_files $uri =404; 또는 try_files $uri $uri/ =404;"를 주석(또는 제거) 처리 해야지 404 에러가 발생되지 않습니다.


* 붙여넣기 후 nginx 시작시 에러가 발생시 해당 내용을 메모장이나 노트패드에 붙여넣은 후 복사하여 다시 nginx 로 붙여넣어보시기 바랍니다


php가 정상적으로 동작 하는지를 확인 하기 위해서 phpinfo 페이지를 하나 만들겠습니다.

기본 html home 으로 이동 후 파일을 생성 합니다.

[root]# cd /usr/share/nginx/html
[root]# vi phpinfo.php

<?php
phpinfo();
?>



[root]# chown nginx:nginx phpinfo.php


여기 까지 설정 하였다면 저장 후 먼저 php-fpm 을 기동해줍니다.

[root]# systemctl start php74-php-fpm

[root]# ps -ef| grep php
root 7151 1 php-fpm: master process (/etc/opt/remi/php74/php-fpm.conf)
nginx 7152 7151 php-fpm: pool www
nginx 7153 7151 php-fpm: pool www
nginx 7154 7151 php-fpm: pool www
nginx 7155 7151 php-fpm: pool www
nginx 7156 7151 php-fpm: pool www

[root]# ls -al /run/php/
srw-rw----. 1 nginx nginx php-fpm.sock


nginx.service 파일 수정

nginx 시작전 nginx.service 파일을 수정하도록 하겠습니다. 
파일에서 LimitNOFILE 을 추가 합니다

[ root]# vi /usr/lib/systemd/system/nginx.service

[Service]
Type=forking
LimitNOFILE=65536
<--- 추가 


서비스 reload 및 nginx 활성화 와 시작

[root]# systemctl daemon-reload
[root]# systemctl enable nginx
[root]# systemctl start nginx



브라우저에서 ip주소/phpinfo.php  로 phpinfo 페이지가 정상적으로 출력 되는지를 확인을 해보시기 바랍니다


          

OS 방화벽 오픈

OS 방화벽 오픈 합니다.

# 80 포트 추가

firewall-cmd --permanent --add-port=80/tcp


# 80 포트 삭제(참고)
firewall-cmd --permanent --remove-port=80/tcp

-- 특정 IP에 대해서 80포트 오픈(참고)

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" \
source address=123.123.123.123 port port="80" protocol="tcp" accept'


-- 특정 IP에 대해서 80포트 오픈 정책 삭제 (참고)
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" \
source address=123.123.123.123 port port="80" protocol="tcp" accept'


# 정책 재반영 및 방화벽 정책 확인

firewall-cmd --reload;firewall-cmd --list-all



연관된 다음 글 

 웹 기반 MySQL 사용/관리 툴 - PHPMyAdmin 설치 설정

Nginx 의 추가적인 설정은 아래 포스팅을 이어서 보시면 됩니다.

Nginx 에 ModSecurity 설치 및 설정 - Nginx 웹 방화벽 - WAF

CentOS 8 지원 종료 및 정책 변경 안내 - 새로운 Rocky Linux 안내

 

 



0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x