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] "
<IfModule mod_jk.c>
JkMount /*.jsp app1Worker
#-> ' / '는 마스터의 주소를 의미한다. 마스터 주소로 들어오며 jsp 파일을 찾으면 app1Worker에게 보내는데, 그건 JKWorkerFile에 있을 것이다.
</IfModule>
입력
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 파일 열어서
server 지시자 블록 안에
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)
nginx 재시작 후 확인
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~8교시
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(역방향)
-> 만들고 소유주:소유그룹을 root:named로 바꾸기
(4) 도메인 설정 확인(테스트)
-> nmtui로 들어가서 DNS 주소 설정 후 nmcli connection up ens33으로 재부팅
(5) 방화벽 설정
추가 실습으로 DNS를 사용할 서버를 하나 더 연결. 이제 DNS 서버 master로 웹 서버 master와 slave의 주소와 도메인을 찾아가야 한다. DNS 주소 설정은 슬레이브에서 했으니 테스트는 슬레이브에서 한다.
같은 방식으로 추가 존 파일을 생성 : jeong.zone
역방향 파일은 따로 만들지 않고, 100.zone 하단에 jeong의 주소를 추가하는 방식으로 한다.
근데 이럴 거면 앞부분은 무슨 의미지?
앞부분에 시리얼 넘버, 유효기간 등을 기록했는데, 이건 기존 도메인에만 적용되는 거 아닌가?
6교시(15:30~16:10) Nginx WAS 연동, DNS 이론
7교시 전체 DNS 구축
'교육' 카테고리의 다른 글
[33일 차] 21.09.03 : Linux Server 12 (0) | 2021.09.03 |
---|---|
[32일 차] 21.09.02 : Linux Server 11 (0) | 2021.09.02 |
[30일 차] 21.08.31 : Linux Server 9 (0) | 2021.08.31 |
[29일 차] 21.08.30 : Linux Server 8 (0) | 2021.08.30 |
[메모] 21.08.29 : 할 일 (0) | 2021.08.29 |
댓글