Nginx / Apache 웹 서버
26.10 버전 차이
26.10은 OpenSSL 4를 사용합니다. 특히 PKCS#11/HSM 통합의 경우 레거시 엔진 구성을 공급자로 마이그레이션합니다. 서비스를 다시 로드하기 전에 구성 및 인증서 체인의 유효성을 검사하십시오. 패키지 설치만으로는 호환성이 확립되지 않습니다. 공식 릴리스 노트
이 문서에서는 Ubuntu 26.04에서 가장 널리 사용되는 두 가지 웹 서버인 Nginx 및 Apache을 설치하고 구성하는 방법을 다룹니다.
Nginx
Nginx 설치 중
sudo apt update
sudo apt install nginx -y
# Start and enable on boot
sudo systemctl enable --now nginx
# Check status
sudo systemctl status nginx
# Check version
nginx -v방화벽 구성
# Allow HTTP and HTTPS
sudo ufw allow 'Nginx Full'
# Or allow individually
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp디렉토리 구조
/etc/nginx/
├── nginx.conf # Main configuration file
├── sites-available/ # Available site configurations
├── sites-enabled/ # Enabled sites (symlinks)
├── conf.d/ # Additional configuration snippets
├── snippets/ # Reusable configuration snippets
└── modules-enabled/ # Enabled modules
/var/www/ # Website root directory
/var/log/nginx/ # Log directory가상 호스트 구성
# Create website directory
sudo mkdir -p /var/www/example.com/html
sudo chown -R www-data:www-data /var/www/example.com
echo "<h1>Welcome to example.com</h1>" | sudo tee /var/www/example.com/html/index.html
# Create virtual host configuration
sudo tee /etc/nginx/sites-available/example.com << 'EOF'
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm;
# Logs
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
try_files $uri $uri/ =404;
}
# Static asset caching
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# Deny access to hidden files
location ~ /\. {
deny all;
}
}
EOF
# Enable the site
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
# Remove default site (optional)
sudo rm /etc/nginx/sites-enabled/default
# Test configuration
sudo nginx -t
# Reload
sudo systemctl reload nginx역방향 프록시 구성
sudo tee /etc/nginx/sites-available/app-proxy << 'EOF'
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
EOF
sudo ln -s /etc/nginx/sites-available/app-proxy /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginxNginx 성능 튜닝
# /etc/nginx/nginx.conf key settings
sudo tee /etc/nginx/conf.d/performance.conf << 'EOF'
# Gzip compression
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_min_length 256;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml
application/rss+xml
image/svg+xml;
# File caching
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
# Connection optimization
keepalive_timeout 65;
keepalive_requests 100;
EOF
sudo nginx -t && sudo systemctl reload nginxApache
Apache 설치 중
sudo apt update
sudo apt install apache2 -y
# Start and enable on boot
sudo systemctl enable --now apache2
# Check status
sudo systemctl status apache2
# Check version
apache2 -v방화벽 구성
sudo ufw allow 'Apache Full'디렉토리 구조
/etc/apache2/
├── apache2.conf # Main configuration file
├── ports.conf # Listening ports
├── sites-available/ # Available site configurations
├── sites-enabled/ # Enabled sites
├── mods-available/ # Available modules
├── mods-enabled/ # Enabled modules
└── conf-available/ # Additional configuration
/var/www/ # Website root directory
/var/log/apache2/ # Log directory공통 모듈 관리
# Enable modules
sudo a2enmod rewrite # URL rewriting
sudo a2enmod ssl # SSL/TLS
sudo a2enmod headers # HTTP header control
sudo a2enmod proxy # Reverse proxy
sudo a2enmod proxy_http # HTTP proxy
sudo a2enmod proxy_wstunnel # WebSocket proxy
# Disable a module
sudo a2dismod autoindex
# Restart to apply changes
sudo systemctl restart apache2가상 호스트 구성
# Create website directory
sudo mkdir -p /var/www/example.com/html
sudo chown -R www-data:www-data /var/www/example.com
echo "<h1>Welcome to example.com</h1>" | sudo tee /var/www/example.com/html/index.html
# Create virtual host configuration
sudo tee /etc/apache2/sites-available/example.com.conf << 'EOF'
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
ServerAdmin admin@example.com
DocumentRoot /var/www/example.com/html
<Directory /var/www/example.com/html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Logs
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>
EOF
# Enable the site
sudo a2ensite example.com.conf
# Disable the default site (optional)
sudo a2dissite 000-default.conf
# Test configuration
sudo apache2ctl configtest
# Reload
sudo systemctl reload apache2역방향 프록시 구성
sudo a2enmod proxy proxy_http
sudo tee /etc/apache2/sites-available/app-proxy.conf << 'EOF'
<VirtualHost *:80>
ServerName app.example.com
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
# WebSocket proxy
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) ws://127.0.0.1:3000/$1 [P,L]
ErrorLog ${APACHE_LOG_DIR}/app-proxy-error.log
CustomLog ${APACHE_LOG_DIR}/app-proxy-access.log combined
</VirtualHost>
EOF
sudo a2ensite app-proxy.conf
sudo apache2ctl configtest && sudo systemctl reload apache2SSL 인증서 구성
Let’s Encrypt(Certbot) 사용
# Install Certbot
sudo apt install certbot -y
# Nginx plugin
sudo apt install python3-certbot-nginx -y
# Apache plugin
sudo apt install python3-certbot-apache -yNginx SSL 구성
# Automatically obtain and configure certificates
sudo certbot --nginx -d example.com -d www.example.com
# Test automatic renewal
sudo certbot renew --dry-run
# View certificate information
sudo certbot certificatesCertbot은 Nginx 구성을 다음과 같이 자동으로 수정합니다.
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# ... other configuration
}
# HTTP to HTTPS redirect
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}Apache SSL 구성
# Enable the SSL module
sudo a2enmod ssl
# Automatically obtain and configure certificates
sudo certbot --apache -d example.com -d www.example.com수동 SSL 구성(Nginx)
sudo tee /etc/nginx/snippets/ssl-params.conf << 'EOF'
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
# HSTS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 223.5.5.5 8.8.8.8 valid=300s;
EOF자동 갱신
# Certbot automatically configures a systemd timer during installation
sudo systemctl status certbot.timer
# Manual renewal
sudo certbot renew
# View the renewal schedule
sudo systemctl list-timers | grep certbotNginx 대 Apache: 올바른 선택
| 대본 | 추천 | 이유 |
|---|---|---|
| 동시성이 높은 정적 파일 | Nginx | 이벤트 기반, 낮은 메모리 사용량 |
| .htaccess 요구 사항 | Apache | 디렉터리 수준 구성에 대한 기본 지원 |
| 역방향 프록시/로드 밸런싱 | Nginx | 깔끔한 구성, 뛰어난 성능 |
| PHP (PHP-FPM) | 어느 하나 | 둘 다 FastCGI를 지원합니다. 26.04에서 권장됨 |
| 마이크로서비스 게이트웨이 | Nginx | API 게이트웨이 시나리오에 더 적합 |
Warning
Ubuntu 26.04에서 Apache 2.4.66 서비스는 기본적으로 MemoryDenyWriteExecute=yes을 활성화하며 이로 인해 libapache2-mod-php이 충돌하게 됩니다. 공식적인 권장 사항은 내장된 mod_php 대신 PHP-FPM(mod_proxy_fcgi + php-fpm)을 사용하는 것입니다.
일반 관리 명령
# Nginx
sudo nginx -t # Test configuration
sudo systemctl reload nginx # Graceful reload
sudo systemctl restart nginx # Restart
sudo tail -f /var/log/nginx/access.log # View access log
# Apache
sudo apache2ctl configtest # Test configuration
sudo systemctl reload apache2 # Graceful reload
sudo systemctl restart apache2 # Restart
sudo a2ensite site.conf # Enable site
sudo a2dissite site.conf # Disable site
sudo a2enmod module # Enable module
sudo a2dismod module # Disable module
sudo tail -f /var/log/apache2/access.log # View access log관련 기사
- Docker Compose Service Orchestration — Docker Compose 컨테이너를 사용하여 웹 서비스 배포
- SSH 기본 — SSH 원격 연결 및 키 관리, 서버 관리에 필수적인 기술
- UFW 방화벽 — 웹 서버에 대한 방화벽 규칙 구성, HTTP/HTTPS 포트 열기