본문 바로가기
교육

[31일 차] 21.09.01 : Linux Server 10

by ballena 2021. 9. 1.

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/

 

리눅스(CentOS7)에서 자바 개발환경 구축하기 - Nginx와 Tomcat연동

개요이전장을 통해서 우리는 리눅스 상에서 jdk와 톰캣을 설치 및 환경설정을 하였다.이번 장에서는 nginx의 reverse proxy기능을 이용하여 톰캣과 엔진엑스를 연동하는 방법을 알아보도록하겠다.

dailyworker.github.io


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

댓글