[31일 차] 21.09.01 : Linux Server 10

[31일 차] 21.09.01 : Linux Server 10

1교시

어제 했던 내용을 다시. 마스터, 슬레이브 둘 다 초기 설정부터 한다.

원인은 아파치 서버의 프록싱 기능과 mod_jk의 연동 설정과의 충돌로 생각된다고 한다.

어쨌든, 실습 목표는 index.html로 접속하면 마스터로 접속, index.jsp로 접속하면 슬레이브로 접속

yum list java*jdk-devel : 사용 가능한 자바 App 확인

yum -y install java-1.8.0-openjdk-devel.x86_64 : 해당 자바 패키지 설치

java -version : 자바 버전 확인

ls /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64/ : 리스트 확인

which javac : 여기서 나오는 경로와 위 경로 심볼릭 링크 생성

readlink -f /usr/bin/javac /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64

wget http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.70/bin/apache-tomcat-8.5.70.tar.gz : 톰캣 다운로드

tar zxvf apache-tomcat-8.5.70.tar.gz : 다운로드한 파일 압축 해제

mv apache-tomcat-8.5.70 /usr/local/tomcat8 : 압축한 파일 이동

톰캣 기본 포트는 8080번이지만, 마스터와의 동적 컨텐츠 통신을 위한 WAS AJP 프로토콜은 8009번 포트를 사용한다.

-> vim /usr/local/tomcat8/conf/server.xml : 설정 파일 확인

-> 한글 적용하려면 69행의 8080 설정에 URIEncoding="UTF-8" 추가

vi /etc/profile 파일 하단에

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64

JRE_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64

CATALINA_HOME=/usr/local/tomcat8

CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar

PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64

추가 후 재부팅 또는 source /etc/profile로 적용

vi /usr/local/tomcat8/webapps/ROOT/index2.jsp : 테스트용 동적 페이지 생성

-> 톰캣 기본 경로 /usr/local/tomcat8/webapps/ROOT/

이제 systemctl 명령어에 톰캣 등록하기

vi /etc/systemd/system/tomcat.service에

[Unit]

Description=Apache Tomcat 8

After=syslog.target network.target

[Service]

Type=forking

Environment="JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64/"

Environment="CATALINA_HOME=/usr/local/tomcat8"

User=root

Group=root

ExecStart=/bin/sh /usr/local/tomcat8/bin/startup.sh

ExecStop=/bin/sh /usr/local/tomcat8/bin/shutdown.sh

[Install]

WantedBy=multi-user.target

입력 후 데몬 재부팅 : systemctl daemon-reload

그 후 시작 서비스 등록.

lsof -i tcp:8080을 확인해 보면 가동이 안되는 것을 확인.

systemctl start tomcat : 톰캣 시작하면 가동 확인

chown root:root /usr/local/tomcat8 -R : 권한 설정

설정 변경했으면 데몬 재시작. 톰캣은 restart가 없으니 stop 후 start

firewall-cmd --permanent --add-port=8080/tcp : 방화벽 열어주기

firewall-cmd --reload : 방화벽 재부팅

슬레이브 주소의 8080 포트로 접속하면 접속 가능 확인 완료!

마스터에 yum -y install httpd로 아파치 설치

systemctl start, enable로 httpd 시작, 자동시작 설정

firewall-cmd --permanent --add-service=http로 방화벽 설정 후 reload

클라이언트가 http://192.168.111.100로 접속하면 http://192.168.111.100/index.jsp로 주소가 바뀌게 할 것.

yum install gcc gcc-c++ httpd-devel : 마스터에 패키지 설치

에러 방지를 위해 패키지 추가 설치

yum install redhat-rpm-config -y

libtool --finish /usr/lib64/httpd/modules : libtool이 없다면 같이 설치된다.

wget -c http://mirror.navercorp.com/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz

-> 톰캣 커넥터 설치

2교시

tar xvzf tomcat-connectors-1.2.48-src.tar.gz : 압축 풀고

cd tomcat-connectors-1.2.48-src/native/ : 디렉터리 이동

./configure --with-apxs=/usr/bin/apxs

make 설치 후 make ; make install로 설명서 만들기

설치 과정에서 권한에 대한 경고, 권장 등이 있으면 한번 확인해보기

톰캣 서버는 기본적으로 포트(프로토콜)를 여러 개 쓰는데, 단독 웹 서비스용은 8080번(HTTP)을 쓰고, 백엔드 서비스용은 8009번(AJP) 포트를 사용한다. 후자의 포트로 들어가면 막힌다. 앞단 서버가 이리로 들어가는 것이다.

슬레이브로 돌아가서

vim /usr/local/tomcat8/conf/server.xml으로 들어가서 대략 119행에 있는 AJP 주석을 해제하고, address 0.0.0.0으로 수정/태그 내부에 secretRequired="false"로 수정

나와서 톰캣 서비스 재시작하고, lsof -i tcp:8009로 포트 확인

톰캣 구성은 끝.

마스터로 돌아가서 통신 설정

setsebool -P httpd_can_network_connect 1 : 부울 정책 미리 활성화

vi /etc/httpd/conf.d/mod_jk.conf 파일을 만들어서

LoadModule jk_module modules/mod_jk.so

JkWorkersFile /etc/httpd/conf/workers.properties

JkShmFile /var/run/mod_jk.shm

JkLogFile /var/log/httpd/mod_jk.log -> 로그 파일

JkLogLevel info -> 로그에 기록할 에러 레벨 지정

JkLogStampFormat "[%y %m %d %H:%M:%S] "

JkMount /*.jsp app1Worker

#-> ' / '는 마스터의 주소를 의미한다. 마스터 주소로 들어오며 jsp 파일을 찾으면 app1Worker에게 보내는데, 그건 JKWorkerFile에 있을 것이다.

입력

worker는 동작 콘텐츠에 응답할 장비를 의미한다.

/var/log/httpd/mod_jk.log : 에러 나면 이 로그 파일 보기. 이제 에러 발생하면 봐야 할 로그 파일이 3개다.

/var/log/messages : SELinux 차단 사항을 볼 수 있다.

/var/log/httpd/error_log : http 접속 관련 에러는 여기가 더 자세하다. 차단된 정보는 나오지만 SELinux 어디에서 차단되었는지는 안 나옴. 어디에서 차단되었는지 알려면 messages 파일을 보는 것이 좋다.

vim /etc/httpd/conf/workers.properties : 워커 파일 생성

worker.list=app1Worker

worker.app1Worker.type=ajp13

worker.app1Worker.host=192.168.111.200

worker.app1Worker.port=8009

입력

setsebool -P domain_can_mmap_files 1 : SELinux에 대비해 설정

만들고 수정하는 게 워낙 많다 보니 오타에 주의.

3~4교시

아파치 말고 사용하는 웹 서버 Nginx. 아파치는 많은 기능을 지원하지만 무겁고 응답이 (상대적으로) 조금 느리다. Nginx는 심플하고 간편하게 구성되어 있다.

웹 서버이면서 동시에 HTTP, HTTPS, SMTP, POP3와 IMAP 프로토콜을 위한 리버스 프록시 서버로도 사용. 부하 분산 및 HTTP 캐시로도 사용된다.

Nginx는 비동기적 EDA(Event-Driven Architecture) 방식을 사용. 아파치 서버처럼 하나의 스레드에서 하나의 접속을 허용하는 방식과는 다르다.

아파치처럼 요청을 받을 때마다 프로세스(자식 데몬)를 만들지 않고, 이 EDA 방식을 통해 하나의 프로세스로 많은 처리를 수행해서 CPU 부하와 메모리 사용은 더 적으면서 속도는 더 빠른 장점을 가지고 있다. 그래서 클라이언트의 접속량이 많은 고부하 환경에서 더 큰 성능을 발휘한다.

Nginx로 할 수 있는 실습이 많은데, 몇 가지만 골라서 한다.

1. Nginx 서비스 시작과 PHP 사용

Nginx도 80번 포트 사용. 아파치 httpd도 80번 포트를 사용하니 동시에 돌릴 수는 없다. httpd를 정지시키고 실습 진행.

yum -y install nginx : Nginx 설치

기억해둘 환경 설정 파일

/etc/nginx/nginx.conf : 주 환경설정 파일

/usr/share/nginx/html/ : 기본 문서 디렉터리 경로

/var/log/nginx/ : 로그 파일 저장 경로

기본 파일 하나 생성하고, 주 설정 파일 수정

-> server 지시자 찾아서 IPv6 listen 라인 주석처리

systemctl start nginx

systemctl enable nginx

systemctl disable httpd

nginx는 프로토콜 서비스로 등록되어 있지 않아 포트로 방화벽 열어줘야 한다

firewall-cmd --permanent --add-port=80/tcp 입력 후 reload

yum -y install php php-fpm.x86_64 : PHP 설치

vim /etc/php-fpm.d/www.conf에서

24행, 26행의 사용자와 그룹을 nginx로 수정, 48, 49행의 주석 풀어서 nobody 대신 nginx 수정

systemctl start php-fpm

systemctl enable php-fpm

PHP 사용을 위한 Nginx 설정. 주 설정 파일 /etc/nginx/nginx.conf의 location 지시자 밑에

location ~ \.php$ {

fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

설정한 파리미터들은 /etc/nginx/fastcgi_params에 있다.

접속해보면 된다.

2. Nginx CGI 사용

dnf --enablerepo=epel -y install fcgiwrap

vim /etc/nginx/conf.d/fcgiwrap.conf 만들어서

location /cgi-bin/ {

gzip off;

root /usr/share/nginx;

fastcgi_pass unix:/var/run/fcgiwrap.socket;

include /etc/nginx/fastcgi_params;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

}

입력

mkdir /usr/share/nginx/cgi-bin

chmod 755 /usr/share/nginx/cgi-bin

vim /etc/nginx/nginx.conf에서 서버 지시자 위에 include fcgiwrap.conf 작성

vim /usr/lib/systemd/system/fcgiwrap.service 파일 만들어서

[Unit]

Description=Simple CGI Server

After=nss-user-lookup.target

Requires=fcgiwrap.socket

[Service]

EnvironmentFile=/etc/sysconfig/fcgiwrap

ExecStart=/usr/sbin/fcgiwrap ${DAEMON_OPTS} -c ${DAEMON_PROCS}

User=nginx

Group=nginx

[Install]

Also=fcgiwrap.socket

작성

vi /usr/lib/systemd/system/fcgiwrap.socket 파일 만들어서

[Unit]

Description=fcgiwrap Socket

[Socket]

ListenStream=/run/fcgiwrap.socket

[Install]

WantedBy=sockets.target

작성

systemctl daemon-reload, systemctl enable --now fcgiwrap, systemctl restart nginx 실행

vi nginx-server.te 파일 만들어서

module nginx-server 1.0;

require {

type httpd_t;

type var_run_t;

class sock_file write;

}

#============= httpd_t ==============

allow httpd_t var_run_t:sock_file write;

작성

checkmodule -m -M -o nginx-server.mod nginx-server.te

semodule_package --outfile nginx-server.pp --module nginx-server.mod

semodule -i nginx-server.pp

실행해서 설정한 모듈 적용

이제 테스트 페이지를 만들어 확인

vi /usr/share/nginx/cgi-bin/index.cgi 파일 만들고

chmod 755 /usr/share/nginx/cgi-bin/index.cgi 권한 설정

http://192.168.111.100/cgi-bin/index.cgi로 접속해서 확인.

Nginx는 구성이 단순해서 만들어야 할 설정 파일이 많다.

아파치처럼 기능할 수 있다, 정도만 인지하자.

3. Nginx UserDir 사용

Nginx UserDir 설정

vim /etc/nginx/nginx.con 파일에

location ~ ^/~(.+?)(/.*)?$ {

alias /home/$1/public_html$2;

index index.html index.htm;

autoindex on;

}

추가

getsebool -a | grep homedirs : 부울 켜져 있는지 확인

setsebool -P httpd_enable_homedirs 1 : 부울 on

user1 디렉터리에 /public_html/index.html 만들고 접속 확인

4. Server Block(가상 호스트) 사용

vim /etc/nginx/conf.d/sblock.conf

server {

listen 8080;

server_name www.jeong.com;

location / {

root /vhost/jeong/www;

index index.html index.htm;

}

}

mkdir -p /vhost/jeong/www

systemctl restart nginx

vi /vhost/jeong/www/index.html 테스트 파일 만들고

semanage fcontext -a -t httpd_sys_content_t /vhost/jeong/www/index.html

restorecon -v /vhost/jeong/www/index.html

SELinux 설정 조절

5교시

5. Apache 서버를 위한 리버스 프록시 사용.

리버스 프록싱 - 슬레이브에 nginx 설치

vim /etc/nginx/nginx.conf 파일 열어서

서버 지시자 블록 안에

proxy_redirect off;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header Host $http_host;

입력

비어있는 location 안에

proxy_pass http://192.168.111.200; 작성

원래는 SELinux 설정해야 한다. 이미 위에서 했다.

(setsebool -P httpd_enable_homedirs 1)

재시작 후 확인

6. Nginx 부하 분산 사용.

이번에는 Nginx 부하 분산. 슬레이브와 FIRST를 내부 서버로 두고 부하 분산을 적용

마스터에 주 설정 파일 /etc/nginx/nginx.conf 열어서 http 블록 안에

upstream loadtest {

server 192.168.111.200:80;

server 192.168.111.10:80;

}

작성하고 아까 작성했던 proxy_pass를 http://loadtest;로 수정

재시작하고 마스터 주소로 접속해보면 완료.

횟수(비율) 조정하려면 위의 서버 정보 뒤에 weight=횟수 작성. 기본으로 안 쓰고 두면 알아서 분산된다.

7. Nginx HTTPS 구축 : HTTPS in Nginx

아파치와 유사하다.

/etc/pki/tls/certs/ 안에 개인키와 요청서가 같이 있어야 한다.

openssl genrsa -out http.key 2048 개인키 생성

openssl req -new -key http.key -out http.csr 요청서 생성

openssl x509 -in http.csr -out http.crt -req -signkey http.key -days 365 인증서 생성

주 설정 파일 /etc/nginx/nginx.conf의 서버 블록 안에

listen 443 ssl;

ssl_certificate /etc/pki/tls/certs/http.crt;

ssl_certificate_key /etc/pki/tls/certs/http.key;

작성

방화벽 설정

firewall-cmd --permanent --add-service=https 실행 후 reload

Nginx(마스터)와 WAS(슬레이브) 연동

주 설정 파일에

upstream tomcat {

ip_hash;

server 127.0.0.1:8080;

}

location ~ \.(jsp|do)$ {

index index.jsp;

proxy_pass http://tomcat;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-NginX-Proxy true;

proxy_set_header Host $http_host;

proxy_redirect off;

charset utf-8;

}

참고 링크

https://dailyworker.github.io/Nginx-Connect-Tomcat/

6교시

DNS 구축

Root Domain level

===

TLD(Top Level Domain)

ccTLD(Country Code TLD) -> 국가 코드 : us. jp, kr

gTLD(Generic TLD)

===

Second Level Domain

FQDN의 구성

IP 변환 시 사용되는 방법

1. 리졸버

요청한 도메인 네임스페이스에 정보를 얻기 위해 DNS 메시지를 보내는 DNS 클라이언트 프로그램.

리눅스에서는 /etc/resolv.conf에 정의된 네임 서버가 리졸버로 동작

2. Lookup

포워드 lookup : 도메인 정보 -> IP 주소

reverse lookup : IP 주소 -> 도메인 정보

DNS 서버 유형

1. 권한 있는 네임 서버 : 마스터와 슬레이브

2. Recursive 네임 서버(= Caching Only 네임 서버) : 복제본만 보관

환경 설정 파일

BIND httpd 패키지 설치

/etc/named.conf -> /var/named/chroot/etc/named.conf : 네임서버 주 설정 파일

외부 사용자 입장에서는 chroot가 루트 디렉터리. 그 이상으로 넘어갈 수 없다.

/etc/named/rfc

도메인에 대한 설정이 들어가 있는 ZONE 파일이 있다.

/var/named 디렉터리

실제 도메인 정보가 있는 ZONE 파일이 있다

/usr/sbin/named

네임 서버 데몬 파일

이쪽은 다시 듣기

bind(DNS 서버 구축 프로그램을 제공하는 패키지), bind-utils, bind-libs 패키지 설치

yum -y install bind bind-util bind-libs

systemctl start named

systemctl enable named

firewall-cmd --permanent --add-port=53/udp

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

firewall-cmd --reload

리눅스에서 DNS 요청이 들어왔을 때 호스트 정보를 찾는 우선순위가 정의된 파일

/etc/host.conf

multi on : 도메인 정보를 찾는 순서가 hosts, bind

order hosts,bind : 도메인 정보를 찾는 순서가 hosts, bind

alert : IPSPoofing 시도를 syslog 파일에 저장

도메인 설정(chul.com)

1. 3개 파일을 설정

(1) /etc/named.conf

(2) /etc/named.rfc1912.zones : 존 관련 설정

(3) /var/named/ chroot/var/named/ 존파일

2. DNS 구축의 5단계

(1) /etc/named.conf

-> listen-on port 53의 IP 주소를 마스터의 주소로 수정

-> 쿼리를 어디에서 받을지 지정하는 allow-query의 주소에 any 추가

-> 자신이 갖고 있지 않은 도메인에 대해 요청을 어떻게 할 것인가? : recursion. no면 안 받고 yes면 받음

(2) /etc/named.rfc1912.zones

-> 하단에 추가

zone "chul.com" IN {

type master;

file "chul.zone";

allow-update { none; };

};

zone "111.168.192.in-addr-arpa" IN {

type master;

file "100.zone";

allow-update { none; };

};

(3) /var/named/ chroot/var/named/ 존파일 : chul.zone(정방향)과 100.zone(역방향)

(4) 도메인 설정 확인(테스트)

-> nmtui로 들어가서 DNS 주소 설정 후 nmcli connection up ens33으로 재부팅

(5) 방화벽 설정

추가 실습으로 DNS를 사용할 서버를 하나 더 연결. 이제 DNS 서버 master로 웹 서버 master와 slave의 주소와 도메인을 찾아가야 한다. DNS 주소 설정은 슬레이브에서 했으니 테스트는 슬레이브에서 한다.

같은 방식으로 추가 존 파일을 생성 : jeong.zone

역방향 파일은 따로 만들지 않고, 100.zone 하단에 jeong의 주소를 추가하는 방식으로 한다.

근데 이럴 거면 앞부분은 무슨 의미지?

앞부분에 시리얼 넘버, 유효기간 등을 기록했는데, 이건 기존 도메인에만 적용되는 거 아닌가?

5교시(14:30~15:00) Nginx 리버스 프록싱 설명

6교시(15:30~16:10) Nginx WAS 연동, DNS 이론

7교시 전체 DNS 구축

from http://ballenabox.tistory.com/77 by ccl(A) rewrite - 2021-09-01 23:00:15