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; } |