ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Linux] 아파치(Apache) 설치 & https 설정 & 톰캣(Tomcat) 설정
    개발/개발환경구축 2021. 10. 10. 00:57

     

    본 내용은 CentOS/Fedora를 기준으로 작성되어있습니다.

    아래의 명령어들은 리눅스에서 관리자모드로 들어왔다는 전제로 합니다.

    또한 서버를 활성화 하는 과정에서 셀리눅스 보안에 의해서 일부 과정이 막히기 때문에

    enforce mode를 permissive mode 로 전환하여 설치 완료한 뒤에 enforce로 되돌립니다.

     

    + 2022-11-21 검증완료, 문제점들을 수정 

    + 2023-04-10 새롭게 검증, 실행확인 및 수정


    -1.SELINUX 를 기록만 남김으로 변경

     

    setenforce 0

     


    0.서버 도메인 획득

     

    여기서 https를 하고자 한다면 반드시 필요합니다.

     

    도메인은 DuckDNS  kro.kr 에서 구할수있습니다.

    ->FreeDom 로 구하겠다면 도매인을 검색할때 aaa.ga 까지 전부치고 검색하세요.

    ->FreeDom 서브도메인 없이 쓸수있단 장점에 비해서 언제든 도메인을 닫거나 뺏어갈수도있다는 단점이 있습니다.

    ->kro.kr 은 성인광고가 나오므로 주의가 필요합니다.

     

     

    해당 사이트에서 DNS 설정을 찾은뒤 자신의 웹 서버가될 컴퓨터의 아이피를 입력해줍니다.

     


    1.Apache 설치

     

    yum -y install httpd

    ->아파치 설치 (작성기준 2.4)

    iptables -A INPUT -p tcp --dport 80,443,8080,8009 -j ACCEPT 

    ->방화벽 통과(80/443 : 아파치 , 8080/8009 : 톰켓)

     

    firewall-cmd 를 사용할 경우

    더보기

    firewall-cmd --zone=public --add-port=8080/tcp --permanent

    firewall-cmd --zone=public --add-port=8009/tcp --permanent

    firewall-cmd --zone=public --add-port=443/tcp --permanent

    firewall-cmd --zone=public --add-port=80/tcp --permanent

    firewall-cmd --reload

     

    setsebool -P httpd_unified on

    ->http 셀리눅스 통신 차단을 해제.(503 오류 발생 원인중 하나입니다.)

     

    semanage port -a -p tcp -t http_port_t 포트번호

    ->셀리눅스 내부 통신 포트 차단 해제

     

    vi /etc/httpd/conf/httpd.conf

    ->Shift i 로 아파치 설정 항목 수정

    ->수정해아 되는 문구는 주황색 으로 표기합니다.

     

    여기서 https를 하고자 한다면...

     

    ServerName 에 미리 구해둔 도메인(www.domain.com)을 적어 주세요.

     

     

    여기서 Tomcat을 하고자 한다면...

    #

    LoadModule jk_module modules/mod_jk.so

    Include conf.modules.d/*.conf

    ->반드시 Include 구문의 위에 적을것!!!!

     

     

    아래 작성한 내용은 httpd.conf의 맨 아랫줄에 추가로 써주거나.

    혹은 conf.modules.d경로안에 

    httpd-vhosts.conf라는 이름으로 새롭게 만들어서 작성합니다.

     

    만약 따로 지정할 경로가 없다면 경로는 /var/www/html 를 작성합니다.

    따로 경로를 지정하지 않으며 톰켓을 연동해야 한다면

    /usr/share/tomcat/webapps/ROOT 로 작성합니다.

    만약 따로 지정할 www.도메인.ex가 없다면 localhost 로 작성합니다.

     

    <VirtualHost *:80>

    DocumentRoot "/myRoot/프로젝트폴더"

    ServerName www.도메인.ex

    # RewriteEngine On

    # RewriteCond %{HTTPS} !on

    # RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L]

    ->http 로 들어올경우 https로 보냄

    </VirtualHost>

     

     

    esc를 눌러서 수정모드를 빠져나온뒤

    /Document 를 입력하고 엔터를 누르세요.

    그 후에 주황색 글씨들을 자신의 경로명에 맞게 수정합니다.

    Document Root는 반드시 하나만 존재 해야 합니다.

    <Directory> 여러개 존재할 수 있으니

    기존것을 두고 새롭게 추가로 작성하셔도 상관 없습니다.

     

    Document Root = "/myRoot"

    <Directory = "/myRoot">

    require all denied (denied 설정시 403에러를 임의로 발생시킴)

    </Driectory>

    <Directory = "/myRoot/프로젝트">

    require all granted (granted 설정시 해당 경로는 접속 허용)

    </Driectory>


    Document Root 란 본래 화면을 띄울 기준이 되는 홈 경로를 의미합니다

    인터넷 브라우저로 접속하면 위의 설정에 따라 /myRoot/index.html 파일을 출력하겠죠.

     

    하지만 위쪽에서 적어둔 <VirtaulHost>가 우선순위를 지니게되어

    www.도메인.ex 에 접속하면 VirtaulHost 안에 작성한 경로내의 index 파일이 출력됩니다.

     

    만약 인터넷 접속을 VirtualHost에 작성한 www.도메인.ex 가  아니라

    x.x.x.x 의 아이피 주소나 혹은 다른 도메인으로 접속하게되면

    그땐 Document Root 경로의 내용물이 출력 됩니다.

     

    <Document> 란 말하자면 접근 권한 설정입니다.

    '/myRoot' 는 여러가지 프로젝트 파일들이 들어갈 프로젝트 저장용 폴더

    '/myRoot/프로젝트'는 그중에서 접속을 허용할 프로젝트 폴더로 사용한다고 하면,

    /myRoot 경로에 대한 접근을 차단하고 /myRoot/프로젝트 에 대한 접근을 허용하는 것이 좋겠죠.

    (/myRoot 경로에 index 파일이 없다면 아파치가 403에러를 내뱉어서 접속을 막긴합니다.)

     

    여기에서 작성한 <Document> 설정은 VirtualHost 에 작성한 경로들에도 일괄 적용됩니다.


    경로를 따로 바꿀 생각은 없으나 톰캣을 사용할 예정이라면 이렇게 작성합니다.

    Document Root = "/usr/share/tomcat/webapps/ROOT"

    <Directory = "/usr/share/tomcat/webapps">

    <Directory = "/usr/share/tomcat/webapps/ROOT">

     

    ESC로 작성종료 :wq 로 저장 후 빠져 나옵니다.

     

    경로를 임의로 바꿨다면 셀리눅스 보안에서 디렉토리 예외 설정을 필요로 합니다.(403 오류의 원인이 될 수 있습니다.)

    chcon -R -t httpd_user_content_t /myRoot

    혹은

    chcon -R -t httpd_user_content_t /usr/share/tomcat/webapps/ROOT

     


    2.Tomcat 연동

     

    yum -y install tomcat

    ->톰캣 설치

     

    java -version

    ->java 가 설치되어있는지 확인(Tomcat 실행에 필요합니다.)

    ->없다면 yum -y install java 로 설치(Open jdk 1.8)

    ->오라클 jdk를 쓴다면 외부에서 따로 가져오셔야합니다.

     

    yum install gcc gcc-c++ httpd-devel

    ->아파치 연동에 사용되는 보조모듈 설치

     

    cd /var/anyFolder

    ->다운로드를 받아둘 임의의 폴더로 이동 (선택사항)

     

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

    ->cd 로 들어간 경로에 tomcat-connectors 압축파일을 다운로드 (링크를 눌러서 확인해 볼 수 있습니다.)

     

    혹시라도 Tomcat 다운로드 경로가 막혀있다면 mod_jk 로 구글링해서 구해오시길 바랍니다.

     

    tar zxvf tomcat-connectors-1.2.48-src.tar.gz

    ->압축 해제

     

    cd tomcat-connectors-1.2.48-src/native

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

    make

    make install

    ->패키지 설치

     

    만약 make 에서 안된다면 

    yum -y install redhat-rpm-config 

    ->설치에 필요한 보조 패키지를 설치

     

    이제 아파치에 톰켓 연동설정을 하겠습니다.

    3개의 파일을 새롭게 작성합니다.

     

    vi /etc/httpd/conf/workers.properties

    worker.list=ajp13

    worker.ajp13.port=8009

    worker.ajp13.host=127.0.0.1

    worker.ajp13.type=ajp13

    worker.ajp13.lbfactor=1

    ->worker에 tomcat 사용자의 별명을 작성 및 등록f

    ->꼭 localhost 가 아니라 127.0.0.1로 작성합니다. (톰캣을 찾지못해서 503에러가 발생할 수 있습니다.)

     

    vi /etc/httpd/conf/uriworkermap.properties

    /*.do=ajp13

    /*.jsp=ajp13

    /*.json=ajp13

    /원하는경로/*=ajp13

    ->해당 파일 확장자 혹은 경로에 대해서 ajp13를 통해 톰켓으로 처리합니다.

     

    vi /etc/httpd/conf.modules.d/mod_jk.conf

    <IfModule mod_jk.c>

    JkWorkersFile conf/workers.properties

    JkShmFile run/mod_jk.shm

    JkLogFile logs/mod_jk.log

    JkLogLevel info

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

    JkMountFile conf/uriworkermap.properties

    </IfModule>

    ->Apache 에 worker / worker로 할일 / 활동사항 Log 설정을 합니다.

     

    chcon -u system_u -r object_r -t httpd_modules_t /etc/httpd/conf.modules.d/mod_jk.so

    ->작성한 파일에 대한 셀리눅스 보안 예외처리를 합니다.

     


    이제 톰켓 쪽에서 아파치의 신호를 받을 준비를 하겠습니다.

     

    vi /usr/share/tomcat/conf/server.xml

     

    아파치의 연동과는 무관하지만 톰켓이 돌아가는지는 확인해야 될테니

    먼저 톰켓의 기본적인 셋팅을 진행하겠습니다.

     

    ->/<Host name + Enter로 <Host> 태그를 찾습니다.

    ->그리고 주황색 혹은 파란색내용을 다음으로 수정합니다.

    <Host name="www.도메인.ex"  appBase="/myRoot"
                unpackWARs="true" autoDeploy="true"
                xmlValidation="false" xmlNamespaceAware="false">
    <Context path="/abc" docBase="myView" reloadable="true"/>

    </Host>

    ->www.도메인.ex:8080/abc 로 접속하면 /myRoot 안에있는 myView를 출력합니다.

    ->"/abc"는 "" 의 형태로 값을 주지 않고 루트 경로로도 지정할 수 있습니다.

     


    이제 연동과 관련해서 아파치신호를 대기하는 설정을 하겠습니다.

     

    /<Connector protocol + Enter 로 해당 <Connector> 태그를 찾습니다.

     양 끝에 작성된 <!-- , --> 를 지워주세요 (주석 처리입니다.)

    그후에 주황색 부분을 수정합니다.

     

    <Connector protocol="AJP/1.3"

    address="0.0.0.0"

    port="8009"

    secretRequired="false"

    redirectPort="8443" />  

     

    ->위의 worker 에서 작성한 127.0.0.1 을 0.0.0.0 으로 받습니다.

    ->secretRequired의 기본값은 true 입니다. 아래 내용을 확인해주세요.

     

    secretRequired 보안

    더보기
    secretRequired 는
    아파치가 지닌 비밀번호와 톰켓이 지닌 비밀번호가
    서로 일치하는지 확인하는 작업의 여부를 의미합니다.

    만약 키가 다르거나 설정이 잘못된다면 권한과 관계없이 403을 뱉으며 접근을 거부합니다.
    사용하고 싶다면 톰캣의 Connector 안에 secret="mykey" 를 추가로 적으신뒤

    위에서 작성했던 
    conf/workers.properties 안에
    worker.워커이름.sercret="mykey"
    를 추가로 적으시면 됩니다.

     

    +추후에 꼭 알아야 되는 톰캣 설정

    더보기
    보통의 구글링으로 검색되는 tomcat들은 yum이 아닌 외부에서 받아와서 적용한 경우가 많습니다.
    그래서 tomcat의 외부변수 설정 경로가 다른 블로거들과는 조금 다릅니다.
    yum으로 설치한 버전은 /usr/share/tomcat 경로안에 tomcat.conf 파일이 존재하며
    자바 외부 변수는 여기에 추가하시면 됩니다.

    예를 들어서 들어오는 ip를 ipv4로 받아올 필요가 있다면
    JAVA_OPTS="-Djava.net.preferIPv4Stack=true" 구문을 추가해주세요

     

    끝났습니다. 프로젝트를 올려서 실행해서 확인해봅시다.

    systemctl start httpd

    ->아파치 실행

    systemctl start tomcat

    ->아파치 에 적용할 WAS 실행

     

    실행이 안되요!

    더보기
    상단에서 설명한 SELINUX를 끄지않고 켠 상태로 실행한다면
    인터넷 접속 여부를 떠나서 아파치의 실행부터 막히실겁니다.
    원인은 아파치의 Log 기록을 SELINUX가 막아버려서 발생합니다.
    작성자의 경우엔 관련 SELINUX 허가를 해도 막아버리더군요.
    지금은 permissive mode로 돌려주세요. (setenforce 0)

    실행에만 문제가 있는 것이기 때문에
    아파치실행 - 톰캣실행 - SELINUX 실행(1) 순으로 적용하시면 됩니다.

    만약 그것이 아니라면 systemctl status httpd 를 입력하신 뒤에
    관련 문구들을 꼼꼼히 읽어 보시길 바랍니다.
    vi 메모장에서 :set number 를 입력하면 줄간격으로 숫자가 보이니 유용하게 사용하실 수 있습니다.

    정말 간혹 가다가 설정에 틀린 글자가 없는데도 증상이 발생하는게 가능합니다!
    이런경우 줄바꿈(엔터)단위의 인식의 문제일 가능성이 있으니
    문제가 있다는 문구를 줄단위로 전부 지우고 엔터 입력후 다시 입력해 주시길 바랍니다.

    그외의 사항으로 /etc/httpd/logs/mod_jk.log 를 vi 로 확인해 보시면
    worker 설정중에 틀린부분을 찾을 수 있습니다.

    ※본 글의 타이핑 검증은 끝났습니다.

     


     

    3.https ssl 인증 받기

     

    본래의 인증 방법대로라면 ssl 인증은 과금이 필요하지만

    이번엔 서트봇을 이용해서 무료로 ssl 인증을 하는 과정을 담습니다.

    이번 과정은 도메인을 필요로 합니다.

     

    yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

    ->yum 의 다운로드 가능 경로를 확장, 이름에 fedora가 붙어있지만 centos나 클라우드 os도 호환 됩니다.

    (우분투의 경우 아직 확인을 못해봤습니다.)

     

    위의 명령어는 리눅스 버전이 7이면  epel-release-latest-7을 쓰고 8이면 epel-release-latest-8을 씁니다.

    ->버전 확인은 cat /etc/*release*

     

    yum -y install certbot-apache

    ->서트봇 설치

    certbot certonly -d www.도메인.ex --webroot -w /myRoot/myView

    ->SSL 인증획득

    ->certbot certonly -d 서브도메인.ex -d sub.서브메인.ex --webroot -w /myRoot/myView -d로 서브도메인들을 등록.

     

    실행이 안되요!

    더보기
    서버가 실행 되어있어야 합니다.
    작성한 경로가 앞서 VirtualHost 설정에서 작성한 경로와 일치해야 합니다.
    과정을 따라왔으며 톰캣을 사용한다면 /usr/share/tomcat/webapps/ROOT가 경로가 됩니다.

     

    vi /etc/httpd/conf.d/ssl.conf

    ->SSL의 루트(전체적용)설정. /<VirtualHost 를 입력하고 항목을 찾은 뒤 주황색 문구로 수정합니다.

     

    <VirtualHost *:443>

    DocumentRoot "/myRoot/myView"

    ServerName www.도메인.ex:443

    SSLCertificateFile /etc/letsencrypt/live/www.도메인.ex/cert.pem

    SSLCertificateKeyFile /etc/letsencrypt/live/www.도메인.ex/privkey.pem

    SSLCertificateChainFile /etc/letsencrypt/live/www.도메인.ex/chain.pem

     

    ESC :wq 로 저장후 빠져나옵니다.

     

    만약 서브도메인 페이지가 존재한다면 

     

    vi /etc/httpd/conf.d/vhost-ssl-sub.너의도메인.ex.conf

    ->서브도메인 마다 새로운 설정 파일을 만듭니다. 빈창이 나와야 정상입니다.

    ->하나의 conf 파일에 <VirtualHost *:443>을 여러개 작성해도 작동은 잘됩니다.

    =>하나씩 관리하는 이유는 도메인마다 별개의 페이지를 관리할때 유지관리를 위해서입니다.

     

    <VirtualHost *:443>
        ServerName 도메인.ex
        ServerAlias sub.도메인.ex

        SSLCertificateFile /etc/letsencrypt/live/sub.도메인.ex/cert.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/sub.도메인.ex/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateChainFile /etc/letsencrypt/live/sub.도메인.ex/chain.pem

        DocumentRoot /myRoot/sub
        ErrorLog logs/virtual-ssl-error_log
        CustomLog logs/virtual-ssl-access_log combined env=!no_log
    </VirtualHost>

    ->경로는 서브 도메인의 경로를 작성합니다.

     

     

    주의할 점

    더보기

    여기에 작성한 VirtualHost는 앞서 httpd.conf 혹은 httpd-vhosts.conf 에 작성해뒀던

    <VirtualHost *:80> 과 같은 설정입니다.

     

    https 로 접속하면 443port로 ,

    http 로 접속하면 80port로 접속되므로

    둘은 별개의 두개의 경로를 가리킨다라고 생각하셔야 합니다.

     

    추후에 서버 설정을 할때

    443포트에 적용할 내용을 80포트 내용물에 가서 삽질하지 않게 조심합시다.

     


    4.ssl 자동갱신

    이 HTTPS SSL인증은 90일 마다 갱신해줘야합니다.

    !이는 아파치의 서버를 시한부로 죽게하는 원인입니다!

     

    SSL 자동 갱신 설정은 아래와 같습니다.

     

    crontab -e

    ->Shift i 로 작성 ESC로 작성종료

    0 4 2 * * /usr/bin/certbot renew --renew-hook="sudo systemctl restart httpd"

     


    5.마무리

     

    ssl 인증을 받았으므로 적용하겠습니다.

     

    vi /etc/httpd/conf/httpd.conf

    혹은 /etc/httpd/conf.modules.d/httpd-vhosts.conf

    로 돌아가서 

    <VirtualHost *:80> 내부에 작성했던

    # RewriteEngine On

    # RewriteCond %{HTTPS} !on

    # RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L]

     

    에 존재하는 #기호를 삭제하고 저장합니다.

     

    이제 서버를 가동시킵시다.

     

    sentenforce 0

    systemctl stop tomcat

    systemctl stop httpd

    을 입력해서 서버통신을 멈추고

    다시 재시작합니다.

     

    systemctl start httpd

    systemctl stop tomcat

    setenforce 1

     

    끄고 켜는 순서는 반드시 잘 기억해 주세요.

     


     

    + netstat -ntlp : 현재 리눅스에서 신호 대기중인 포트 상황을 보여줍니다.

    =>따로 포트를 바꾸지 않았다면 433,80,8080,8009 포트가 사용중에 있어야 합니다.

    +클라우드에서 인스턴스 사용 중이라면 클라우드에서 따로 포트 열어두셔야 하는거 잊지 맙시다.

     

    +<VirtualHost *:443>안에 JkMount /* 워커이름을 추가해서 연동이 됬는지 확인해보세요.

    +404의 원인이 selinux가 될수 있습니다.

    댓글

개발에 관심을 가지는 블로그