프롤로그
시험이 끝났다. 내일 프로젝트 발표 2개 하면 이제 종강인데, 그 전까지 해야할 일이 많은데, ...일단 블로그라도 빨리 작성해보자.
Apache
아파치는 가장 널리 사용되는 오픈 소스 웹 서버 중 하나이다. Apache HTTP Server (아파치)는 웹 페이지를 제공하는데 사용되며, HTTP 프로토콜을 통해 클라이언트에 데이터를 전달하는 역할을 한다.
리눅스에서 아파치 설치 방법
sudo apt update
sudo apt upgrade
로 일단 최신 버전으로 업데이트 해주고
그 다음
sudo apt install apache2
로 아파치를 설치할 수 있다.
설치가 됐는지 확인하려면
sudo systemctl status apache2
를 입력해보면
그 다음에, 방화벽 열어준 다음에, 해당 아이피:80 번으로 접속하면
아파치 서버로 접근이 성공하였다.
아파치의 기본 구조와 모듈
아파치는 모듈 기반의 구조를 가지고 있으며, 서버의 다양한 기능을 모듈로 확장할 수 있다.
(1) Apache 실행파일(httpd)
서버의 핵심 실행 파일이다. 이 파일을 통해 서버가 실행된다.
/usr/sbin/apache2
에 위치한다.
저렇게 apache2는, systemctl 를 이용해서 제어하는데, httpd 프로세스는 자동으로 시작된다.
(2) 설정파일
Apache의 동작을 정의한다. 여러 개로 나뉘어 있다.
1. 주요 설정파일
/etc/apache2/apache2.conf
에 위치하며, 전체 서버의 설정을 정의한다.
2. 포트 설정 파일
아파치가 수신할 포트가 적여있다.
지금 보면 Listen 80이라고 적혀있는데, 저기 부분을 8080으로 바꾼다면, 8080포트에서 열릴 것이다.
이렇게 Listen을 1111로 설정하고
sudo systemctl restart apache2
sudo ufw allow 1111
방화벽을 키면
1111번 포트에서 아파치 서버가 열린다.
3. 로그 파일
아래위치에 존재하며, 로그를 본다.
/var/log/apache2/
access.log는 접속기록, error.log는 에러 로그가 나온다.
(3) 문서 루트
Apache에서 제공하는 웹 콘텐츠의 기본 디렉터리이다. sites-available/000-default.conf 파일에서 설정할 수 있다.
/var/www/html
에 가면 문서 루트가 있는데
이쪽으로 가면, 해당 문서가 있고, 저게 아까 위에서 나온 사진
이걸 html로 나타낸거다.
cd /etc/apache2/sites-available/
로 가면
000-default.conf가 있고
저기 보면
DocumentRoot /var/www/html이 있다. 저 위치를 바꿀려면 DocumentRoot 위치를 바꿔주면 되고, index.html로 안 쓰게 할 거면
<VirtualHost *:80>
# 기본 서버 관리자 이메일
ServerAdmin webmaster@localhost
# 문서 루트를 /var/www/a로 변경
DocumentRoot /var/www/a
# 기본 파일을 a.html로 설정
DirectoryIndex a.html
</VirtualHost>
이런식으로 수정하면 된다.
(4) 가상 호스트 설정
Apache의 가상 호스트는 여러 도메인을 하나의 서버에서 처리할 수 있게 해준다.
/etc/apache2/sites-available/ #새로운 가상 호스트 설정 파일
/etc/apache2/sites-enabled/ #활성화된 가상 호스트들의 심볼릭 링크 위치
아까 있던 000-default 이런 거 들어있는 곳이다.
(5) 모듈 및 추가 설정
다양한 모듈을 통해 기능을 확장할 수 있다.
밑에 보면 저 심볼릭 링크들이 이제 하나하나 활성화된 모듈들이 있는데
예시를 들자면
mod_ssl : SSL/TLS 지원, 안전한 연결을 할 수 있게 해준다.
sudo a2enmod ssl # mod_ssl 모듈 활성화
sudo systemctl restart apache2 # Apache 재시작
이렇게 설정하고
default-ssl.conf 가서 설정한다.
mod_rewrite : url을 재작성하거나 리다이렉션을 하게 해준다.
www.example.com/product/123을 ....?id=123과 같은 형태로 변환해준다.
이런식으로 설정한다.
.htaccess 파일과 사용법
.htaccess 파일은 아파치에서 디렉토리별 설정을 조절해주는 파일이다.
URL 재작성, 보안 설정, 리디렉션, 캐시 설정등을 할 수 있는데, 아까 여러 모듈을 사용하여 다양한 설정을 할 수 있다. 뭐 서버 설정을 디렉터리 별로 설정한다고 하는데, 특정 디렉터리의 동작을 변경하고 싶을 때 유용하다고 하는데, 이건 직접 해봐야 할 거 같다.
sudo nano /var/www/html/.htaccess
이렇게 숨김 파일로 만든다.
(1) 리디렉션
RewriteEngine On
RewriteRule ^oldpage$ /newpage [R=301,L]
oldpage를 /newpage로 리다이렉트(301)한다.
만약에 HTTPS로 하게 하려면
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
(2) URL 재작성
RewriteEngine On
RewriteRule ^product/([0-9]+)$ /product?id=$1 [L,QSA]
product/123 을 product?id=123 으로 바꾼다.
(3) 디렉토리 인덱스 파일을 변경
DirectoryIndex a.html
아파치는 기본적으로 index.html을 따라가는데, 그것을 a.html로 바꿔준다.'
(4) IP접근 제어
Order Deny,Allow
Deny from all
Allow from 192.168.1.100
IP 접근 허용.
(5) 에러 페이지 지정
ErrorDocument 404 /404.html
ErrorDocument 500 /500.html
에러 404 가 뜨면 404.html을 보여줘라.'
(6) 캐시 설정
<FilesMatch "\.(jpg|jpeg|png|gif|css|js)$">
ExpiresActive On
ExpiresDefault "access plus 1 year"
</FilesMatch>
.jpg, .jpeg, .png... 저 파일들을 1년동안 캐시한다는 것이다. 브라우저 캐시하도록 설정하는 것이다.
이렇게 사용할 떄 주의해야할 점은, 웹 서버의 동작을 제어하므로 보안에 문제 생길 수 있다. 그리고, .htaccess 파일은 매번 요청 시마다 읽히기 때문에 복잡한 규칙 많이 설정하면 큰일난다. 그러니까 웬만하면 httpd.conf로 전역설정을 하고, 따로 관리할 것은 .htaccess 파일로 관리해야한다.
아 그리고, .htaccess 동작하려면, 전역설정에서 AllowOverride 지시어가 ALL로 설정되어 있어야한다.
그러니까
/etc/apache2/sits-available/000-default.conf 파일에서
<Directory /var/www/html>
AllowOverride All
</Directory>
이거 켜줘야한다.
**왜 httpd.conf가 아니라 sites-availanle/000-default.conf에서 설정하냐?
- httpd.conf / apache2.conf: Apache의 전역 설정을 관리하는 파일. 여기서 Apache 서버 전체의 동작을 설정
- sites-available/000-default.conf: Apache의 가상 호스트 설정 파일로, 특정 사이트에 대한 설정을 정의. 예를 들어, 특정 디렉토리에서 .htaccess 파일을 사용할지 말지를 설정
- AllowOverride All: .htaccess 파일을 통해 디렉토리별로 설정을 변경할 수 있도록 허용하는 설정
따라서, .htaccess 파일을 사용하고 싶다면 **AllowOverride All**을 설정해야 하며, 이는 **sites-available/000-default.conf**와 같은 가상 호스트 설정 파일에서 적용
아파치 성능 튜닝
말 그대로 아파치 성능을 최적화하기 위한 설정이다. 다양한 설정을 조정하여 효율적인 리소스 사용과 빠른 응답 속도를 보장할 수 있다.
1. Apache의 프로세스 모델 설정
아파치는 다양한 멀티 프로세싱 모듈(MPM)을 제공한다.
-prefork MPM : 각 요청을 처리하는 별도의 프로세스를 생성한다. PHP와 같은 동적 컨텐츠를 처리할 때 유용하지만, 메모리 사용량이 많다.
-worker MPM : 쓰레드를 사용하여 요청을 처리한다. 더 적은 메모리를 사용하고 성능이 향상될 수 있지만, 일부 구형 모듈과의 호환성 문제가 있을 수 있다.
-event MPM : worker랑 비슷한데, 비동기 이벤트를 처리하여 더욱 효율적으로 리소스를 관리한다. 지속적이 연결을 많이 하는 웹 애플리케이션에서 유리하다.
저거 3개중에 모드를 이제 선택한다고 보면 되는데,
/etc/apache2/mods-available에 가면, mpm 저것들 event, prefork, worker들이 있다. available이 아닌, enable에 가서 저거를 껐다 킬 수 있는데, 현재 내가 무슨 모드를 쓰는지 확인해보자.
apache2ctl -V
현재 event 모드이다.
아니면
ls /etc/apache2/mods-enabled | grep mpm
로 현재
이벤트 모드가 활성화 되어 있는 것을 알 수 있다.
이제 모드를 worker로 바꿔보자.
sudo a2dismod mpm_event
sudo a2enmod mpm_worker
sudo systemctl restart apache2
worker로 변경된 것을 확인할 수 있다.
그리고 worker이랑 event일 때, mods-available에 가서 각 conf를 확인해보자.
저기 보면
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
이렇게 적혀이쓴데,
StartServers: Apache 시작 시 생성할 초기 서버 프로세스 수.
MinSpareThreads / MaxSpareThreads: 여유 스레드의 최소 및 최대 수.
ThreadsPerChild: 각 프로세스가 생성할 스레드 수.
MaxRequestWorkers: 동시에 처리할 수 있는 최대 요청 수.
MaxConnectionsPerChild: 각 프로세스가 처리할 수 있는 최대 요청 수 (0이면 무제한).
이렇게 설정할 수 있다.
2. KeepAlive 설정
클라이언트와의 연결을 유지하여 여러 요청을 처리할 수 있게 한다.
/etc/apache2/apache2.conf
가서
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 5
이렇게 기본값으로 설정되어있다.
- KeepAlive On: KeepAlive를 활성화하기
- MaxKeepAliveRequests: 하나의 연결에서 처리할 수 있는 최대 요청 수 (기본값은 100).
- KeepAliveTimeout: 클라이언트가 요청을 보내지 않고 기다릴 수 있는 시간 (초). 너무 길면 리소스를 낭비할 수 있고, 너무 짧으면 연결을 자주 새로 열어 성능이 떨어질 수 있음
(3) 로그 파일 최적화
로그가 성능에 영향을 미칠 수 있는데, 로그 레벨을 조정하여 불필요한 로그 작성을 줄이거나, 로그 형식을 최적화 할 수 있다.
아까 그 파일에서
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog ${APACHE_LOG_DIR}/error.log
#
# LogLevel: Control the severity of messages logged to the error_log.
# Available values: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the log level for particular modules, e.g.
# "LogLevel info ssl:warn"
#
LogLevel warn
LogLevel warn이라면, 경고 이상의 로그만 기록되며, 디버그 수준의 로그는 기록되지 않는다. 로그 파일이 거질때 주기적으로 롤링하기 위해 logrotate를 사용하여 주기적으로 롤링하고, 파일 크기 관리하고 성능 저하를 방지할 수 있다.
(4) 모듈 최적화
a2dismod , a2enmod로 불필요한 모듈을 비활성화 하거나 모듈을 활성화 할 수 있다.
mod_autoindex, mod_status, **mod_info**와 같은 디버그 관련 모듈은 비활성화하는 것이 좋다.
sudo a2dismod ~~~~~
sudo a2enmod ~~~~~~
로 모듈을 껐다켰다 할 수 있다. 다만, 저것으로 설정하면
sudo systemctl restart apache2
로 다시 시작해주어야한다.
(5) 압축
sudo a2enmod deflate
모듈을 활성화 하고
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
이렇게 mods-available/deflate.conf 에다가 작성하면, 저 파일들이 압축되어 클라이언트로 전송된다.
(6) 캐시
expires에서 캐시 기간을 정할 수 있다고 쿠키부분에서 배웠다. 그거 설정하는 건데
sudo a2enmod expires
sudo systemctl restart apache2
로 expires설정하고,
cache.conf 파일에서
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 month"
</IfModule>
<IfModule mod_headers.c>
Header set Cache-Control "max-age=2592000, public"
</IfModule>
설정할 수 있다.
에필로그
금토일 3일간 php 다 배우고 mysql 써서 서버 올릴 수 있을라나;
'KnockOn' 카테고리의 다른 글
[3주차 TIL] KnockOn Bootcamp PHP (0) | 2024.12.21 |
---|---|
[3주차 TIL] KnockOn Bootcamp MySQL (1) | 2024.12.20 |
[1주차 TIL] KnockOn Bootcamp HTML, CSS, JS (0) | 2024.12.09 |
[1주차 TIL] KnockOn Bootcamp 프록시 (1) | 2024.12.07 |
[1주차 TIL] KnockOn Bootcamp 패킷 (1) | 2024.12.06 |