virtual host on centos

install

아파치 설치
[root@localhost conf]# yum install httpd

[root@localhost conf]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Apr 24 2019 13:45:48
방화벽 오픈
[root@localhost conf]# firewall-cmd --permanent --add-service=http 
[root@localhost conf]# firewall-cmd --permanent --add-service=https 
[root@localhost conf]# firewall-cmd --reload
상시 서비스 등록
[root@localhost conf]# systemctl enable httpd
[root@localhost conf]# systemctl start httpd

서비스 restart
systemctl restart httpd

servier 정상 확인

브라우저

http://<>

path 구조

[root@localhost httpd]# ls -al
합계 16
drwxr-xr-x.   5 root root    92  7월  8 23:03 .
drwxr-xr-x. 151 root root 12288  7월  9 09:26 ..
drwxr-xr-x.   2 root root    55  7월  9 17:18 conf
drwxr-xr-x.   2 root root   100  7월  9 11:16 conf.d
drwxr-xr-x.   2 root root   146  7월  9 10:21 conf.modules.d
lrwxrwxrwx.   1 root root    19  7월  8 23:03 logs -> ../../var/log/httpd
lrwxrwxrwx.   1 root root    29  7월  8 23:03 modules -> ../../usr/lib64/httpd/modules
lrwxrwxrwx.   1 root root    10  7월  8 23:03 run -> /run/httpd
  • conf : 기본 설정파일
  • conf.d : conf에 추가 설정 정보 (Include로 추가 설정을 이곳에서 처리한다)
  • conf.modules.d : module에 대한 로드 정보가 이곳에 있다
  • logs : 아파치 로그를 확인 가능하다

https.conf 구조

급하게 필요 한것만 보고 처리 해서 사실 잘 알지는 못한다 일단 이해 된것 같은것만 대략적으로 쓴다.

httpd 관련 설정 정보 및 로그가 있는 루트 디렉토리

ServerRoot "/etc/httpd"

80포트를 상시 모니터링 하겠음

(8080 포트 모니터링 하겠음은

Listen 8080)

Listen 80

conf.moules.d 이하의 설정 파일을 읽어서 모듈을 로드해라(모듈을 로드해라는 해당 .conf에 있음)

Include conf.modules.d/*.conf

본 아파치 서버가 작동하는 디렉토리에 대한 접근 권한을 설정한다

<Directory />
    AllowOverride none
    Require all granted
</Directory>

예를 들자면 로컬 서버의 디렉토리 중 /var/www 디렉토리는 httpd가 접근 가능하게 모든 권한을 준다.

<Directory "/var/www">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

모듈 로드를 확인한다. 만약에 dir_module이 있으면 디렉토리상 인덱스는 index.html 이다.

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

2개의 url에 서로 다른 index.html 나타나게 하기

http.conf 수정
####파일 마지막에 넣음######
<Directory "/data/">
        AllowOverride None
        Require all granted
</Directory>

Include /etc/httpd/conf/vhost.conf

/data/ 디렉토리 이하를 접근 하겠음

vhost.conf 컨피그를 포함 하겠음 ( 해당 파일 만들지 않고 파일내에 있는 내용을 이곳에 직접 타이핑 해도 동일 작동함 )

vhost.conf 생성 및 수정
[root@localhost conf]# vi vhost.conf 
[root@localhost conf]# pwd
/root/httpd/conf
NameVirtualHost *:80


<VirtualHost *:80>

    DocumentRoot "/data/test1"

    ServerName test.com

    ServerAlias www.test.com

</VirtualHost>



<VirtualHost *:80>

    DocumentRoot "/data/test2"

    ServerName sub.test.com

</VirtualHost>
  • NameVirtualHost *:80 : 80 포트 대상으로 이름 별 분리를 처리할 것임
  • <VirtualHost *:80> : 80으로 들어오는 내용을 본다
  • ServerName test.com : 요청들어온 url이 test.com이거나 www.test.com 이면,
  • DocumentRoot "/data/test1" : 의 index.html을 보여라

상위는 test.com이라는 DNS를 사용자가 취득 했고 DNS를 통해서 해당 서버에 접근 가능하다는 것이 전제 사항이다. 해당 관련 내용은 DNS Server관련 영역임으로 다루지 않으려고 한다.

해당 내용과 상관없이 hosts를 수정해서 테스트를 많이 하던데… 저는 pass

[root@localhost conf]# cd /
[root@localhost /]# mkdir data
[root@localhost data]# mkdir test1 test2
[root@localhost data]# ls
test1  test2

test1과 test2디렉토리로 들어가서 다음과 같은 index.html을 만들어 준다.

[root@localhost test1]#vi index.html 
test1
[root@localhost test2]#vi index.html 
test2
permission denied
[core:error] [pid 24938] (13)Permission denied: [client 222.222.222.222:53283] AH00035: access to /index.html denied (filesystem path '/data/test1/index.html') because search permissions are missing on a component of the path

상위와 같은 오류가 난다면 다음과 같은 명령어를 사용해서 data디렉토리 이하에 아파치에서 접근이 가능하도록 해줘야 한다.

SELinus의 접근 권한 처리 때문에 생기는 문제이다.

chcon -R -t httpd_sys_content_t data/
[root@localhost /]# ls -alZ | grep data
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 data

상위와 같이 권한이 처리 되면 된다.

subdomain을 활용한 타 web서비스 실행

sub.test.com으로 들어오면 내부적으로 test.com:8888번 서비스로 자동 포워딩 되는 내용이다.

NameVirtualHost *:80


<VirtualHost *:80>

    DocumentRoot "/data/test1"

    ServerName test.com

    ServerAlias www.test.com

</VirtualHost>



<VirtualHost *:80>
    ProxyPreserveHost On

    ServerName sub.test.com

    proxyPass / http://test.com:8888/
    proxyPassReverse / http://test.com:8888/

</VirtualHost>

일반적으로 상위처럼 수정후 sub.test.com을 실행하면 8888포트의 서비스가 브라우저에 표시 되게 된다.

그러나 SELinus로 인해 다음과 같은 오류가 날 수 있다.

[proxy:error] [pid 17800] (13)Permission denied: AH00957: HTTP: attempt to connect to 222.222.222.222:8888 (test.com) failed

아파치는 http_port_t에 등록된 포트만 프록시 패스가 가능하다. 해서 해당 포트를 등록 해줘야 한다

[root@localhost logs]# semanage port -l | grep http_port_t
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000

semanage port -a -p tcp -t http_port_t 8888 명령어를 실행 후 다시 확인 해보자.

[root@localhost logs]# semanage port -l | grep http_port_t
http_port_t                    tcp      8888, 80, 81, 443, 488, 8008, 8009, 8443, 9000

상위와 같이 나오면 된다.

오류를 잡다보면 퍼미션 관련 로그가 나오는 경우가 많은데, 아파치 오류만으로는 분석 하기 어려운 경우가 많다

이 경우는 다음 파일을 확인 하면 된다.

/var/log/audit

만약에 8888 포트가 다른 서비스에 이미 맵핑 되어 있다면 다음과 같이 명령어를 사용하면 된다.

semanage port -m -p tcp -t http_port_t 8888

만약에 포트에 따라서 사용자가 변경 할 수 없는 포트는 아래와 같이 처리 해주면 된다.

semanage port -m -t http_port_t -p tcp 8888

[root@localhost logs]# semanage port -l | grep 8888
us_cli_port_t                  tcp      8082, 8888
us_cli_port_t                  udp      8082, 8888
[root@localhost logs]# semanage port -a -p tcp -t http_port_t 8083
ValueError: 포트 tcp/8083가 이미 지정되어 있습니다 
[root@localhost logs]# semanage port -d -p tcp -t htus_cli_port_t 8083
ValueError: 포트 tcp/8083가 정책에 지정되어 있습니다, 삭제할 수 없습니다 
[root@localhost logs]# semanage port -m -t http_port_t -p tcp 8083
[root@localhost logs]# semanage port -l | grep 8083
http_port_t                    tcp      8888, 9888, 9999, 8888, 80, 81, 443
us_cli_port_t                  tcp      8888, 8083
us_cli_port_t                  udp      8888, 8083
728x90
반응형