광고 차단 플러그인 해제 후 새로고침(F5) 하시면
컨텐츠를 정상적으로 볼 수 있습니다.
(Please turn off AdBlock Plug-in.)

[우분투 18.04 데스크톱] LAMP : 아파치(Apache) 설치과정 정리

에 이어...


한 서버에 도메인 여러개(또는 서브도메인) 연결하는 과정을 적어보겠습니다.

설정 파일을 건드려야 하겠죠.


Ubuntu Apache index.html original

▲ 인터넷 공간에 정리된 다른 분들의 글은 참고만 할거고, 기본 테스트 파일(/var/www/html/index.html)에 나온 설명대로 /usr/share/doc/apache2/README.Debian.gz 문서를 뼈대로 하겠습니다(+ http://httpd.apache.org/docs/2.4/en/ ). 하지만 라엘님의 글(https://blog.lael.be/post/73)에 나온 팁들도 중요하다고 생각하므로 최대한 반영하겠습니다. => 연결 자체에 목적을 두지 않고 실제로 쓸만한 설정파일로 꾸미려 해요.


README.Debian

▲ 참고용으로 README.Debian.gz 파일 압축 풀어서 올려봅니다. 메모장(Notepad)에서 열면 줄바꿈이 안 되어 보이니까, 메모장 이외의 워드 프로그램으로 열람하세요.



※ 준비물 1 - 도메인들


(본인의 IP에 연결된) 도메인 여러 개


또는


▼ 다수의 서브도메인을 할당한 하나의 도메인(역시 본인의 IP에 연결되어 있어야 함)

(아파치에선 멀티도메인이든 서브도메인이든 설정 방법이 같습니다! 그래서 서브도메인 여러개를 준비해도 됩니다.)

(붉은 네모처럼 와일드카드 형식으로 한방에 지정을 끝내면 편하겠고, 초록 네모처럼 하나씩 지정해도 되겠죠.)


※ 참고 링크

  - 저렴한 도메인 : NameSilo 회원 가입, 도메인 구입 방법(1달러 할인 쿠폰)

  - 도메인에 DDNS주소 연결하기, 이메일 포워딩 설정하기(NameSilo)


또는 (도메인 구입할 여건이 안된다면)


▼ 터미널 창(Ctrl+Alt+T)에서 sudo gedit /etc/hosts 처럼 쳐서 호스트파일을 에디터로 연 다음 가상의 도메인을/서브도메인을 추가하고 저장&빠져나오는 식으로 환경을 마련해 주세요. => 실제로 선점되지 않은 도메인 이름으로 정하면 나중에 도매인 구해서 연결하면 되니까 좋겠죠?

Ubuntu Hosts modification

(붉은 네모/초록 네모 방식 중 한가지만 택하세요. 붉은 네모처럼 스페이스바로 공백 하나씩 줘가면서 가상 도메인들을 추가해도 되고, 초록 네모처럼 한 줄에 도메인 하나씩 적어서 추가해도 됩니다.)



※ 준비물 2 - 도메인 수 만큼의 디렉토리(웹문서 경로)+index.html


/var/www/html/ 가 기본 웹문서 디렉토리죠? 저는 이 경로 하위에 디렉토리들을 만들고, 디렉토리마다 index.html 파일을 넣을 겁니다.


이전 포스팅의 마지막 부분을 따라하셨다면 파일관리자 프로그램으로 /var/www/html/ 에서 마우스 우클릭 했을 때 “폴더 만들기” 메뉴가 뜰테니 편하게 진행하실 수 있겠고, 따라하지 않으셨다면 파일관리자를 루트권한으로 실행시켜(터미널 창에서 sudo nautilus 입력) 처리하면 됩니다.


▲ 또는 터미널 창(Ctrl+Alt+T)에서의 처리가 더 편하다면 터미널에서 하셔도 됩니다. 이전 포스팅의 마지막 부분을 따라한 적이 없다면 sudo mkdir 블라블라~~ 하면 (루트 권한의) 디렉토리가 생성되겠죠?

(mkdir 명령어 활용 방법을 좀 더 알고 싶다면 http://webdir.tistory.com/141 글로 가보세요.)


디렉토리 생성을 마쳤다면 각 디렉토리마다 index.html 파일을 만들어 줍니다.


▲ 터미널 창(Ctrl+Alt+T)에서 지에디트(gedit)로 index.html 생성 명령을 넣고, gedit가 뜨면 (해당 디렉토리임을 구분할 수 있는) HTML 내용을 입력 후 저장버튼을 누르면 됩니다(아니면 지에디트 먼저 실행시키고 내용 입력한 다음 경로+파일을 정해서 저장해도 됨).

만약 디렉토리를 루트 권한으로 생성했었다면 당연히 sudo gedit 블라블라~~ 식으로 쳐야 하겠고,

head에 UTF-8이라고 명시하지 않으면 웹브라우저에서 높은 확률로 한글이 깨져 보일 수 있으니까 주의하세요.


준비 과정은 이것으로 끝.




※ 사전 지식

: 데비안 계열용(우분투 포함) 아파치(2.4 버전)가 웹서버 경로의 html 파일(기본값 /var/www/html/index.html )을 불러오는 매커니즘을 알아봅시다.


첫번째.

파일관리자 프로그램으로 /etc/apache2/ 에 들어가 보면 apache2.conf 파일이 보일 겁니다. 이 파일은 메인 설정파일로, Global configuration 설정들도 담고 있습니다. 더블클릭해서 내용을 봅니다.


▲ 스크롤을 내리다 보면 <Directory /var/www/> 라는 부분이 보일 거예요.

/var/www/ 디렉토리의 접근을 허가하겠다는 설정이고, 하위 경로인 /var/www/html/ 도 영향을 받아 접근할 수 있게 됩니다.

(하위 경로에 설정을 추가하면 하위 경로는 추가한 설정의 영향을 받음.)


두번째.

파일관리자 프로그램으로 /etc/apache2/sites-enabled 경로에 접근해보면 000-default.conf 라는 바로가기(심볼릭링크)가 있습니다. 더블클릭해서 열어보면 내용이 많은데,


▲ <VirtualHost *:80> 에서 스크롤을 내리다 보면 위 스샷에서 붉게 밑줄친 내용이 보일 겁니다. “웹문서가 있는 경로는 /var/www/html/ 이다!” 라고 정한 것인데, 이 옵션때문에 웹브라우저 주소창에 도메인주소를 치면 /var/www/html/index.html 파일이 로딩되는 겁니다.


▲세번째. 000-default.conf 심볼릭링크는 /etc/apache2/sites-available/000-default.conf 로부터 끌려온 건데요, /etc/apache2/sites-available/ 경로의 conf 파일은  a2ensite/a2dissite 명령어를 통해 /etc/apache2/sites-enabled 에 심볼릭링크 형태로 탑재/해제할 수 있습니다.


결국 /etc/apache2/sites-available/ 디렉토리의 conf 파일(<VirtualHost> 내용을 담고 있음)이 멀티도메인(서브도메인) 설정의 열쇠이고, 해당 conf 파일을 /etc/apache2/sites-enabled 경로에 심볼릭링크로 탑재하는 게 올바른 세팅법이라는 겁니다. /etc/apache2/sites-enabled/000-default.conf 심볼릭링크는 아파치 설치시 기본으로 탑재되어 있는 거고요.


각설하고,

/etc/apache2/sites-available/000-default.conf 파일에서 핵심적인 부분만 추려서 구조를 살펴보면...


<VirtualHost *:80>

  #ServerName www.example.com

  DocumentRoot /var/www/html

</VirtualHost>


이렇습니다.

80포트로 들어오는 모든 신호를 /var/www/html 디렉토리로 연결시켜라! 라는 의미.

(#ServerName www.example.com 은 주석처리되어 기능을 못 하는데, "www.example.com 사이트 주소로 접근하면" 정도의 뜻인 것 같습니다.)


간단하죠?

그리고 연결 시도가 생겼을 때, 첫번째에서 언급했던 apache2.conf 파일이 (<Directory> 옵션에서) 해당 디렉토리의 접근을 허락한다면 정상적으로 /var/www/html/index.html 파일이 불러지는 겁니다. 그런데 apache2.conf의 내용은 어디까지나 큰 틀을 결정하니까(Global configuration), VirtualHost를 정하는 설정 파일에서 디렉토리 접근권한(<Directory> 옵션)을 함께 적어주면 굳이 apache2.conf 파일을 건들지 않아도 될 겁니다(제어가 잘 안되면 그 때 가서 apache2.conf 파일을 조작해도 늦지 않음.).



※ 주의할 점


아파치는 업데이트 됩니다(sudo apt-get update && sudo apt-get upgrade).

업데이트 도중에 기본 설정파일(apache2.conf / 000-default.conf 등)도 업데이트 버전의 것으로 대체하겠냐고 묻기도 하는데, 000-default.conf 파일을 수정하여 사이트를 구축했다면 No를 선택해서 설정파일을 보존해야 사이트 연결이 망가지지 않겠지만... 실수로 Yes를 누를 수도 있겠죠?

그렇기 때문에 애초에 기본 설정파일은 건들지 말고 사이트 구축용 conf 파일을 별도로 추가하는 식으로 처리하면 추후 아파치 업데이트시 기본 설정파일을 갱신하더라도 구축한 사이트는 영향을 받지 않습니다. 그래서 이렇게 하는 게 유리합니다.




※ 멀티도메인(or 서브도메인) 아파치에 할당하기


이제 본격적인 작업을 시작하겠습니다.

https://blog.lael.be/post/73 의 내용 중 13)웹사이트 Apache 환경설정파일 작성 / 14)사이트 활성화 및 적용 부분은 이것을 설명한 것이고, 이 포스팅도 이 방법을 기준으로 적을 것입니다.


터미널 창을 띄우고(Ctrl+Alt+T) 에디터를 루트 권한으로 실행시키면서 /etc/apache2/sites-available/ 경로에 임의의 conf 확장자 파일을 생성합니다.


▲ 저는 gedit 를 썼고, aaa.conf 파일을 만들었습니다.


▲ 하나의 사이트(또는 서브도메인)마다 설정이 <VirtualHost> </VirtualHost> 안에서 규정되고, 웹문서를 담고 있는 해당 디렉토리의 노출 설정이 <Directory> </Directory> 안에서 규정되어 있는 겁니다.


<VirtualHost>의 내용을 가만히 살펴보면 구조가 보이실 거예요. 하나씩 설명해 보자면...

- ServerName : 구입한 도메인을 적는 겁니다(중요!).

- ServerAlias : 별칭입니다. 도메인 주소가 여러개 있다면 이 항목에 한 칸씩 띄우고 적어주면 됩니다. 그러면 웹브라우저 주소란에 ServerName, ServerAlias에 있는 도메인들을 입력했을 때 동일한 웹문서를 보여주게 됩니다. (저는 #을 붙여서 주석처리했고, 그래서 작동하지 않습니다.)

- DocumentRoot : 웹문서(index.html)가 있는 디렉토리 경로입니다(중요!).

- ErrorLog : 말 그대로 에러 로그입니다. 경로는 ${APACHE_LOG_DIR}/ 로 해주고, .log 파일명은 본인이 보기 편하게 정하면 됩니다.

- CustomLog : 기능이 많을 것 같은데, 실제로 써보면서 좋았던 부분은 접속자들의 IP가 기록되는 것이더군요. 이걸 보고 나쁜 사람을 차단할 수 있어요.ㅋ 경로는 ErrorLog 와 마찬가지로 ${APACHE_LOG_DIR}/ 로 해주고, .log 파일명은 본인이 보기 편하게 정하면 됩니다.


▼ 참고로 {APACHE_LOG_DIR} 경로는 /etc/apache2/envvars 파일에서 정의되어 있습니다. /var/log/apache2/ 로요.


각설하고,

<Directory> 의 설정사항은 /etc/apache2/apache2.conf 에 있는 내용을 복붙했습니다(<Directory /var/www/> 부분).

경로는 <VirtualHost>의 DocumentRoot 값과 일치시켜 주시고요,

이 부분의 최적 세팅값을 급하게 원하신다면 https://blog.lael.be/post/73 의 내용을 참고하세요.

저는 본문 하단에 팁을 적으면서 이 부분 옵션에 대한 설명을 추가하고 저만의 최적 세팅값도 적겠습니다.


이런 식으로 도메인(서브도메인)마다 VirtualHost+Directory 세트를 추가해 주세요. 하나의 conf 파일에 몰아서 적어도 상관없고, conf 파일을 사이트별로 만들어서 적어도 상관없습니다.

(※ 만약 Let's Encrypt 무료 SSL을 적용할 계획이 있다면 사이트당 1개의 .conf 파일을 사용하세요. 그렇지 않으면 우분투용 certbot 자동 인증 스크립트가 사이트를 제대로 인식하지 못할 수 있답니다. : https://www.letmecompile.com/무료-ssl-인증서-적용하기-lets-encrypt/ 

=> 이건 나중에 제가 해보면서 Let's Encrypt 적용 글에 피드백 남기도록 할게요.)


다 적었으면 저장하고 빠져나온 다음 터미널 창을 띄워주세요(Ctrl+Alt+T).


▲ sudo a2ensite aaa 형식으로 conf 확장자를 빼고 입력하세요. 그러면 /etc/apache2/sites-enabled/ 경로에 aaa.conf 심볼릭링크 파일이 생성되면서 등록될 겁니다. .conf 파일 쪼갰었다면 전부 추가해 줘야겠죠?

그 다음 sudo service apache2 restart 라고 입력해서 아파치 서비스를 재시작해 줍니다(화면에 systemctl reload apache2 라고 입력하라고 나왔는데, 그렇게 안 해도 됩니다. 대부분의 아파치 재시작 상황에서 sudo service apache2 restart 명령이 만능이더라고요.).


▲ 웹브라우저 주소창에 멀티도메인(서브도메인) 입력했을 때 각각의 index.html 파일이 불러지면 성공한 겁니다.

(만약 /etc/hosts 파일을 수정해서 테스트했다면 hosts 파일에서 추가했던 부분을 지운 다음 실제로 접근해보거나, 다른 PC/스마트폰 등으로 접근해 보세요.)


▲ /var/log/apache2/ 경로에 로그 파일들도 정상적으로 쌓이고 있음을 확인할 수 있을 겁니다. access 블라블라~ 파일을 열어보면 접속자들의 IP가 기록됐을 겁니다.ㅋ


기본 설명은 끝났습니다.

아래에는 제가 쓰고 있는 팁들을 적겠습니다. 필요한 것만 골라 적용하시면 됩니다.




※ 팁들


1. index.html이 없을 때 디렉토리 목록을 노출하지 않기


예를 들어 웹페이지 경로 최상위 디렉토리에 index.html 파일을 두고 싶지 않을 때가 있습니다. 아니면 특정 디렉토리에 공유하고 싶은 파일을 몰아두되, 목록은 노출하지 않고 특정인에게 특정 파일의 경로만 알려주는 식으로 공유하고 싶을 때도 있을 거고요.


그래서 index.html 을 없애고 웹브라우저로 해당 경로에 접근해보면...


▲ 이렇게 해당 경로의 웹문서 목록들이 전부 노출되는 경우가 있습니다.


이걸 숨겨볼게요.


▲ /etc/apache2/sites-enabled/ 디렉토리에 있는 conf 파일들을 열어서 <Directory 블라블라~> </Directory>식으로 원하는 디렉토리의 접근권한이 기존에 세팅되어 있었다면 찾고, 세팅되지 않았다면 위 스샷을 참고해서 만들어 주세요.

디렉토리 목록 노출에 관여하는 부분은 붉은 화살표로 표시한 줄입니다.


▲ 그 줄을 Options -Indexes 로 바꿔주고 저장 후 빠져나오세요.

(Options -Indexes FollowSymLinks 처럼 입력하면 안 됩니다.)

아니면 Indexes를 지워버리고 Options FollowSymLinks 처럼 써도 됩니다. => 라엘님 추천 값.


▲ 터미널 창을 띄우고 sudo service apache2 restart 라고 입력하여 아파치 서비스를 재시작해 줍니다.


▲ 웹브라우저 주소창에 경로를 입력해 보면 접근이 차단되는 것을 확인할 수 있습니다.

하위 디렉토리들도 영향을 받아서 index.html 파일이 없다면 똑같이 접근 차단됩니다.


▲ 그래서 노출을 원하는 하위 디렉토리는 이런 식으로 -Indexes에서 -를 빼주고

(Options +Indexes 라고 쳐도 됩니다.)


▲ 아파치 서비스를 재시작해주면...


▲ 해당 하위 디렉토리(+해당 하위 디렉토리의 하위 디렉토리들)는 목록이 노출됩니다.



2. 멀티사이트 환경에서 서버 IP주소로 접근하는 것을 차단하기


여러 개의 도메인을 한 서버에 연결시키는 것까지는 처리했는데, 어떤 사람이 서버의 IP를 알아내서 IP로 접근한다면 그 사람은 어디로 향하게 될까요? 제일 첫번째 conf 파일의 첫번째 <VirtualHost>의 경로로 접근하게 됩니다. /etc/apache2/sites-enabled/ 경로에 000-default.conf 파일이 기본으로 있다면 (그 파일보다 먼저 로딩되는 conf 파일이 없는 한) 000-default.conf 파일의 최상단 <VirtualHost> 경로인 /var/www/html/ 에 있는 index.html 파일이 로딩되겠죠.

만약 000-default.conf 파일의 내용을 유지하고 있다면 (1번 팁처럼) /var/www/html/ 경로의 index.html 파일을 날려버리고(삭제/이름 변경 등) 디렉토리 목록을 볼 수 없게끔 조치하면 IP주소로 접근하는 것이 차단되겠지만, 이것은 부작용으로 얻는 결과일 뿐인데요,


어쨌든, 한 서버에 여러 도매인이 연결되어 있다면 (어떤 이유로든) IP주소로 접근하는 것을 차단하길 원하는 운영자가 있을 수 있다고 생각합니다.

http://blog.ivps.kr/74

https://nikles.it/2015/devops/block-direct-ip-access-to-your-server-in-apache-2-4/

https://kldp.org/node/154891

구글링 해보면 위 링크들처럼 몇가지 방법들이 나오는데,

저는 이런 식으로 조합해서 IP주소로 접근하는 것을 차단해 봤습니다.


첫번째 방법 : 꼼수.


▲ ServerName 없는 VirtualHost를 생성합니다. 그리고 존재하지 않는 경로(디렉토리)를 DocumentRoot에 적어주세요.


터미널 창(Ctrl+Alt+T)에서 sudo service apache2 restart 라고 쳐서 아파치 서비스를 재시작해 준다음 웹브라우저 주소창에 본인의 IP주소를 넣어보면... (What is my IP?)


▲ 404 Not Found가 뜨겠죠.

전달하는 의미는 좋네요. 서버에 요청한 URL 없음! ㅋ


사실 위에서 부작용이라고 언급했던 방식이 아주 몹쓸 것은 아닙니다.


   <VirtualHost>

      DocumentRoot 존재하는 빈 디렉토리(해당 위치에 index.html도 없음)

   </VirtualHost>

   <Directory 그 디렉토리 경로>

      Options -Indexes

   </Directory>


이런 식으로 처리하는 것도 하나의 방법이 될 수는 있으니까 적어놓긴 할게요. 이렇게 하면 403 Forbidden 메세지가 뜨면서 막힐 겁니다.

그리고 파일목록이 뜨는 하위 디렉토리를 만들고 싶다면 하위 디렉토리의 옵션을 별도로 추가해야겠지요.


각설하고,

두번째 방법 - 논리적임. 추천.



   <VirtualHost>

      DocumentRoot 존재하는 빈 디렉토리(해당 위치에 index.html도 없음)

   </VirtualHost>

   <Directory 그 디렉토리 경로>

      Order deny,allow

      Deny from all

   </Directory>


이런 식으로 ServerName 없는 VirtualHost를 생성한 다음

디렉토리 설정에서 기본으로 접근 거부(deny)하고, 특정한 경우에만 허용(allow)하라고 적은 후 다음 줄에서 전부 거부하게끔 하면... (아파치 서비스 재시작해 줘야겠죠? sudo service apache2 restart )


▲ 403 Forbidden(접근 거부) 에러 뜨면서 차단되는 것을 확인할 수 있습니다.


저는 두번째 방법이 논리적이라 마음에 듭니다. 다만 <Directory> 설정은 하위 디렉토리에도 영향을 미치니까, 위위 스크린샷의 초록 밑줄처럼 하위 웹문서 경로에는 Order allow,deny | Allow from all 이라고 허용 정책을 추가해줘야 연결된 홈페이지로의 접근이 정상적으로 된다는 점을 주의해야 합니다!



3. 특정 IP 차단하기


방화벽에서 IP를 차단할 수 있지만, 방화벽 대신 아파치에서도 IP를 차단할 수 있습니다.


▲ 웹문서 <Directory 경로> 옵션에 붉게 네모 친 것처럼 추가하면 되는데요,


Order allow,deny 는 허용사항을 먼처 처리한 다음 거부사항을 처리하라는 의미고,

allow from all 은 먼저 모든 접근을 허용하라는 뜻, Deny from IP는 이후 해당 IP의 접근을 차단하라는 뜻입니다. "Deny from IP하나 IP둘 IP셋" 형식처럼 IP들 사이에 공백을 두면서 한 줄에 전부 적어도 되는데, 저는 한 줄에 IP 하나씩 적는 게 보기 편해서 스크린 샷처럼 관리하고 있습니다. 178, 107, 104로 시작하는 IP들은 IP를 바꿔가면서 너무 자주 괴롭히길래 해당 대역 전체를 차단해 버렸네요.


▲ 차단된 IP에서 접근을 시도하면 403 Forbidden 거부 창이 뜹니다. ^^



4. mod_rewrite 세팅


아파치 mod rewrite 모듈은 주소 형식을 변경하는 데 쓰이는데요, 아파치 설치 시점에는 비활성화 상태입니다.

워드프레스에서 permalink(고유주소) 기능을 쓰려면 mod_rewrite가 활성화되어 있어야 합니다. 워드프레스 말고도 요구하는 경우가 종종 있는 것 같더군요.

참고로 https://www.sobi.tips/?p=622 형식의 주소를

https://www.sobi.tips/nuc5ppyh-사용기-part2/  이렇게 바꾸더라도 동일한 웹문서가 출력되게끔 처리하는 게 워드프레스 고유주소 기능이에요.


▲ 터미널 창(Ctrl+Alt+T)에서 sudo a2enmod rewrite 라고 치면 mod_rewrite 모듈 봉인이 풀립니다.

(/etc/apache2/mods-enabled/ 디렉토리에 rewrite 심볼릭링크가 생성됨)

그리고 아파치 서비스를 재시작해주면 활성화 됩니다.


그리고...


▲ 본인의 웹문서 <Directory> 설정이 있는 conf 파일을 에디터로 여세요.

(저는 gedit로 /etc/apache2/apache2.conf 를 열었습니다(기본 설정파일).)


▲ Options 끝에 Multiviews 라는 문구를 추가하고, AllowOverride 항목을 None 에서 All 로 바꾸고 저장+빠져나옵니다.


▲ 터미널 창(Ctrl+Alt+T)을 통해 아파치 서비스를 재시작해주면 mod_rewrite 세팅 끝!


테스트해 볼까요? 웹문서 경로에 아래 스크린샷의 내용을 about.html 파일명으로 저장해 보세요.



▼ 웹브라우저 주소창에 http://도메인주소/about.html 이라고 치면 아래 첫번째 스크린 샷처럼 About Us 가 출력되겠지요(도메인 구입+IP연결 안 했으면 http://localhost/about.html 이라고 쳐보면 됨.).



▲ 이제 http://도메인주소/about (도메인 매칭 안 했으면 http://localhost/about 처럼) 라고 쳐보세요. 만약 mod_rewrite 모듈이 제대로 작동하고 있다면 about.html 과 똑같은 출력값을 볼 수 있습니다. 활성화가 제대로 안됐다면 Not Found 에러를 보게 될테니 점검해 보시고요.



5. www-redirect


DDNS 주소를 C-NAME 레코드에 연결할 때, (A네임 레코드에 IP를 연결할 때와는 달리) 도메인 앞에 www를 붙이도록 강제하는 경우가 있습니다. 아니면 도메인 소유자가 도메인 앞에 www를 붙이는 것을 선호할 수도 있고요.

이럴 때는 도메인 판매 업체 측에서 www-redirect 기능을 자체적으로 제공하여 주소창에 도메인을 쳤을 때 www.도메인 형태로 자동으로 바꾸어 주는 것이 제일 좋은데, 그렇지 않은 경우에는 이런 식으로 www-redirect 기능을 구현하는 방법이 있습니다.


▲ 우선 도메인 구입처의 관리 메뉴에서 A레코드에 본인의 IP주소를 적습니다. 유동IP라면 나중에 IP가 바뀔 때마다 갱신해줘야 합니다.

그리고 고정IP 사용자는 A레코드에 IP를 추가하면서 HostName에 www(또는 *)를, 유동IP 사용자는 C네임 레코드에 DDNS 주소를 추가하면서 HostName에 www(또는 *)를 넣어줍니다.


▲ 아파치 설정파일(conf 확장자)에서 <VirtualHost>를 두 개 만들어 주세요.

첫번째 <VirtualHost>에는 www가 없는 주소를 ServerName에 적고, 다음 줄에 "Redirect 301 / http://www.도메인/" 형식으로 적습니다(스샷에는 빠졌지만 도메인 뒤에 /를 붙이는 게 좋습니다.). 참고로 301은 빼도 됩니다. 또... 302 Redirect는 임시 주소 변경을 뜻하그로 경우에 따라 SEO에 불리할 수 있으니 302는 되도록 쓰지 맙시다.

두번째 <VirtualHost>에는 www가 있는 주소를 ServerName에 적고, 나머지 VirtualHost 설정들을 적어주면 됩니다. 그리고 <Directory> 설정도 필요에 따라 추가해 주세요.


▲ 저장하고 빠져나온 다음 아파치 서비스를 재시작해 주세요.


▲ 웹브라우저 주소창에 www를 제외한 도메인명을 입력했을 때 "www.도메인/" 형식으로 바뀌어 접속되는지 확인해봅니다.


참고로 "www.도메인" 형식을 www가 빠진 도메인으로 리다이렉트 하려면 <VirtualHost> 설정을 역순으로 구성하면 될 것입니다. 첫번째 설정의 ServerName에는 "www.도메인"을, Redirect에는 www 빠진 형태로 적고, 두번째 설정의 ServerName에는 www 빠진 도메인을 적고요.


또...

www-redirect(Non www-redrect)을 mod-rewrite 모듈로 구현하는 방법도 있던데, 저는 정규표현식을 잘 몰라서 복잡하게 느껴지더군요. 필요하신 분들은 아래 링크를 참고하세요.

https://www.vultr.com/docs/apache-2-redirects-for-non-www-sub-domains-to-www


----------------------------------------


여기까지 해서 제가 실제로 쓰고 있는 <VirtualHost>와 <Directory> 세팅 값을 공개해 보겠습니다. 참고가 되실 거예요.

(Redirect를 https 주소로 걸었는데, 이건 Let's Encrypt SSL 세팅 포스팅에서 부연설명 하겠습니다.)


   <VirtualHost *:80>

ServerName www.sobi.tips

# ServerAlias sobi.tips

DocumentRoot /var/www/html/

ErrorLog ${APACHE_LOG_DIR}/error-www.sobi.tips.log

CustomLog ${APACHE_LOG_DIR}/access-www.sobi.tips.log combined

Redirect / https://www.sobi.tips/

   </VirtualHost>


   <Directory /var/www/html/>

        Options FollowSymLinks MultiViews

        AllowOverride All

        Order allow,deny

        allow from all


        Deny from 206.217.138.221


# BEGIN WordPress Permalink

   <IfModule mod_rewrite.c>

RewriteEngine On

RewriteBase /

RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . /index.php [L]

   </IfModule>

# END WordPress Permalink


# 주요 파일 형식들 캐시 설정

   <IfModule mod_expires.c>

      ExpiresActive On

      ExpiresDefault "access plus 1 month"

      ExpiresByType image/png "access plus 1 month"

      ExpiresByType image/jpg "access plus 1 month"

      ExpiresByType image/gif "access plus 1 month"

      ExpiresByType text/javascript "access plus 1 month"

      ExpiresByType text/x-javascript "access plus 1 month"

      ExpiresByType application/javascript "access plus 1 month"

      ExpiresByType application/x-javascript "access plus 1 month"

   </IfModule>


# GZip 설정

   <IfModule mod_deflate.c>

     <IfModule mod_filter.c>

        # these are known to be safe with MSIE 6

              AddOutputFilterByType DEFLATE text/html text/plain text/xml

 

        # everything else may cause problems with MSIE 6

         AddOutputFilterByType DEFLATE text/css

         AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript

         AddOutputFilterByType DEFLATE application/rss+xml

         AddOutputFilterByType DEFLATE application/xml

     </IfModule>

   </IfModule>

   </Directory>


▲ 세팅값 공개 끝. 텍스트 파일로도 첨부합니다.


My Setting.txt


아래 설정 값은 라엘님 아파치 서버 세팅 포스팅에 나온 보안 세팅입니다. 저는 터미널 창에서 sudo gedit /etc/apache2/sites-available/0-boan.conf 라고 치고 아래 내용을 입력+저장한 다음, sudo a2ensite 0-boan  /  sudo service apache2 restart 를 차례로 입력하여 적용했습니다.


# deny file, folder start with dot

<DirectoryMatch "^\.|\/\.">

    Require all denied

</DirectoryMatch>

  

# deny (log file, binary, certificate, shell script, sql dump file) access.

<FilesMatch "\.(?i:log|binary|pem|enc|crt|conf|cnf|sql|sh|key|yml|lock|gitignore)$">

    Require all denied

</FilesMatch>

  

# deny access.

<FilesMatch "(?i:composer\.json|contributing\.md|license\.txt|readme\.rst|readme\.md|readme\.txt|copyright|artisan|gulpfile\.js|package\.json|phpunit\.xml|access_log|error_log|gruntfile\.js|config)$">

    Require all denied

</FilesMatch>

 

# Allow Lets Encrypt Domain Validation Program

<DirectoryMatch "\.well-known/acme-challenge/">

    Require all granted

</DirectoryMatch>


▲ 라엘님 보안 세팅 끝. 텍스트 파일로도 첨부합니다.


0-boan.txt


------------------------------------------


자세하게 적다 보니 엄청 길어졌는데, 알아두면 좋은 내용도 있지만 몰라도 지장 없는 내용도 있으니까 적당히 받아들이세요.

도통 모르겠다 하시면

https://blog.lael.be/post/73

라엘님 세팅 가이드 보고 그대로 따라하세요. 매커니즘 몰라도 서버 구성 완벽에 가깝게 됩니다.


※ libapache2-mpm-itk 아파치 모듈은 VirtualHost를 우분투 사용자/그룹 별로 접근/쓰기 제한하는 기능을 한답니다. 홈서버 운영 시에는 필요가 없을 듯합니다(Shared Hosting 구축한다면 필요할 듯함.).


참고할 만한 링크들 남기면서 마치겠습니다. 서버 쪼개기 할 때 도움이 될만한 글이 보이네요.

https://httpd.apache.org/docs/2.4/en/vhosts/name-based.html

http://pshcode.tistory.com/88

https://blog.xianchoi.kr/311

http://zzaps.tistory.com/245

http://ngee.tistory.com/753


다음 글은 (이변이 없다면) Let's Encrypt 튜토리얼이 될 겁니다.

트랙백 0 개   l   댓글 0

★ 댓글을 남겨주시면 감사하겠습니다. ★