Rocky Linux 8.5 버전에서 nginx – php – mariadb 설치 방법 이다.
먼저 OS의 기본적인 설정을 해야 한다.
NetworkManager 를 여전히 사용중이기 때문에 nmtui 명령어로 아래 화면에서 네트워크 설정을 할 수 있다.
Minimal 설치 기준으로 일반 적인 설정이라고 보면 되겠다 ‘ㅅ’a
- atd 데몬을 사용 중지 한다. (보안 취약점이 될 소지가 있다.)
 - 서버 타임존을 설정한다.
 - rsyslogd사 설치되어야 로그 감사를 통한 서버 이상을 확인하기 용이 하다. (vim 은 내 친구이기 때문에 설치한다 = =a)
 - rsyslog를 실행한다.
 - selinux 이슈 발생시 사유 추적을 위해 분석 스크립트를 설치 한다.
 
| 
					 1 2 3 4 5  | 
						~]# systemctl disable --now atd ~]# ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime ~]# dnf install rsyslog vim ~]# systemctl enable --now rsyslog ~]# dnf install setools-console setroubleshoot-server  | 
					
selinux 이슈 발생 추적은 아래 명령어로 진행 한다.
| 
					 1  | 
						]# sealert -a /var/log/audit/audit.log  | 
					
서버 목적에 따른 firewalld 를 설정 한다.
| 
					 1 2 3  | 
						~]# firewall-cmd --add-service=http --permanent ~]# firewall-cmd --add-service=https --permanent ~]# firewall-cmd --reload  | 
					
firewalld 의 경우 전통적인 iptable 를 사용하지 않고 nftable 이란것을 사용하기 때문에 일시 중지를 위해 iptable -F 명령어로 값을 모두 날려도 작동 하지 않으니 유의 하자 ‘ ‘a
기초 사용법은 아래와 같다.
| 
					 1 2 3 4 5 6 7 8  | 
						~]# firewall-cmd --get-default-zone            # 기본 zone을 확인 ~]# firewall-cmd --zone=public --list-all      # public zone의 설정을 확인 ~]# firewall-cmd --zone=public --list-ports    # public zone에서 허용하고있는 port 확인 ~]# firewall-cmd --zone=public --list-service  # public zone에 등록된 서비스 확인 ~]# firewall-cmd --zone=public --add-port=22581/tcp    --permanent  # public zone의 명시된 포트/프로토콜 허용 ~]# firewall-cmd --zone=public --add-service=http      --permanent  # public zone의 명시된 서비스 허용 ~]# firewall-cmd --zone=public --remove-port=22581/tcp --permanent  # public zone의 명시된 포트/프로토콜 룰 삭제  | 
					
epel 레포지토리를 설치 하고 업그레이드를 통해 최신화 한다. (리부팅이 필요할지도 ‘ ‘a)
| 
					 1 2  | 
						~]# dnf install epel-release ~]# dnf upgrade  | 
					
php 의 버전 선택 설치를 위해 Remi 레포지토리를 이용 하여 php 8.0 버전을 선택해서 설치 한다. (nginx 역시 1.20 버전으로 선택함)
php-fpm 설치와 라이브러리 설치를 구분한 이유는 일반 php를 설치하게 되면 의존성으로 httpd 가 설치되고 php-fpm 을 설치해야 nginx가 의존 설치 되기 때문이다.
| 
					 1  | 
						~]# dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm  | 
					
| 
					 1 2 3 4 5 6 7  | 
						~]# dnf remove php* ~]# dnf module reset php ~]# dnf module enable php:remi-8.0 ~]# dnf module enable nginx:1.20 ~]# dnf install php-fpm ~]# dnf install php-bcmath php-cli php-common php-devel php-gd php-intl php-mbstring php-mysqlnd php-opcache php-pdo php-pear php-pecl-mcrypt php-soap php-xml  | 
					
MariaDB 10.6 설치 (레포지토리 생성 URL) CentOS 가 아닌 RHEL8의 레포지토리를 사용하였음.
| 
					 1 2 3 4 5 6 7 8  | 
						# MariaDB 10.6 RedHat repository list - created  UTC # https://mariadb.org/download/ [mariadb] name = MariaDB baseurl = https://mirror.yongbok.net/mariadb/yum/10.6/rhel8-amd64 module_hotfixes=1 gpgkey=https://mirror.yongbok.net/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck=1  | 
					
| 
					 1 2  | 
						~]# dnf install MariaDB-server ~]# systemctl enable --now mariadb  | 
					
| 
					 1 2  | 
						MariaDB [mysql]> CREATE USER 'account1'@localhost IDENTIFIED BY 'MyNewPass'; MariaDB [mysql]> GRANT ALL PRIVILEGES ON 'account1'.* TO 'account1'@localhost;  | 
					
/etc/nginx/conf.d/virtual.conf 파일에 가상호스트를 생성하고 php-fpm 과 sock 으로 연결 한다.
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33  | 
						server {   listen          80;   server_name     192.168.0.120 site.url.com;   root            /free/home/account1/html;   index           index.php index.html index.htm;   location ~ \.php$ {     try_files                $uri =404;     fastcgi_intercept_errors on;     fastcgi_index            index.php;     include                  fastcgi_params;     fastcgi_param            SCRIPT_FILENAME  $document_root$fastcgi_script_name;     fastcgi_param            PATH_INFO $fastcgi_path_info;     fastcgi_param            HTTP_X_REQUEST_ID $request_id;     fastcgi_pass             unix:/run/php-fpm/www.sock;   }   location ~* \.(eot|ttf|map|woff2?)$ {     expires       max;     add_header    Access-Control-Allow-Origin *;   }   location ^~ /.well-known/acme-challenge/ {     root          /var/www/;   }   location = /favicon.ico {     access_log    off;     log_not_found off;     return        204;   }   if ( $request_method !~ ^(GET|POST|HEAD|OPTIONS)$ ) {     return        405;   }   location / {   } }  | 
					
일단 여기 까지 진행된 경우 nginx – php – mariadb 조합의 사용이 가능하다.
내부 공용으로 쓰이는 부분은 params 파일로 별도로 만들어서 include 하는편이 좋다. ‘ㅅ’a
사이트용 계정 및 phpinfo() 파일을 생성하고 브라우져로 접속하여 확인 해 본다 ‘ㅅ’a
| 
					 1 2 3  | 
						~]# adduser account1 -d /free/home/account1 ~]# su account1 -c 'mkdir -p /free/home/account1/html' ~]# echo -e '<?php\nphpinfo();' > /free/home/account1/html/index.php  | 
					
WEB 디렉토리를 기본이 아닌 /free/home/계정 으로 진행 했기 때문에 아래와 같이 selinux 설정 하고 적용 한다.
| 
					 1 2 3 4 5 6 7 8  | 
						~]# setsebool -P httpd_read_user_content 1 ~]# semanage fcontext -a -t httpd_user_content_t   "/free/home(/.*)/html(/.*)?" ~]# restorecon -Rv /free/home/account1 ### wordpress 의 쓰기 웹상 쓰기가 필요한 .htaccess 파일과 wp-content 폴더에 apache에서의 쓰기 권한을 준다 'ㅅ'a ~]# semanage fcontext -a -t httpd_sys_rw_content_t "/free/home(/.*)/html(/.*)?/wp-content(/.*)?" ~]# semanage fcontext -a -t httpd_sys_rw_content_t "/free/home(/.*)/html/.htaccess"  | 
					
selinux 는 어렵지만 활성화 해두고 쓰면 보안이 매우 강려크 하다.
문제가 발생한경우 setenforce 0 명령어로 감시모드로 전환 하고 sealert 명령어로 예외 추적 하고, context를 추가한 뒤에 다시 setenforce 1 으로 활성화 하는 습관을 가지는게 좋다.
설정된 t콘텍스트 는 ls -lZ /경로/경로 으로 확인할 수 있다.
snapd 및 certbot (let’s encrypt) 를 설치 한다.
| 
					 1 2 3 4 5 6 7 8  | 
						 ~]# dnf install snapd                         ~]# systemctl enable --now snapd              ~]# ln -s /var/lib/snapd/snap /snap           ~]# snap install core                         ~]# snap refresh core                         ~]# snap install --classic certbot            ~]# ln -s /snap/bin/certbot /usr/bin/certbot  | 
					
certbot을 활용한 인증서 발급 명령어 (nginx acme-challenge 를 설정한 이유는 디렉토리를 고정 사용하기 위해서이다.)
| 
					 1 2 3  | 
						~]# certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --rsa-key-size 4096 \                      --agree-tos --email 이메일@주소.com --webroot -w /var/www \                      -d 도메인.주소.com  | 
					
nginx ssl 설정은 일반 server { } 설정 사이에 listen 값을 교체 및 ssl 설정을 추가 하면 된다.
| 
					 1 2 3 4 5 6 7 8 9  | 
						server {   listen              444 ssl http2;   ...   ...   ...   ssl_certificate     /opt/full.pem;   ssl_certificate_key /opt/prik.pem;   add_header          Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; }  | 
					
