This guide covers different deployment options for the C++ HTTP Server.
# Build the image
docker build -t cpp-http-server .
# Run the container
docker run -d -p 8080:8080 --name cpp-server cpp-http-server
# Check logs
docker logs cpp-server
# Stop the container
docker stop cpp-serverCreate docker-compose.yml:
version: '3.8'
services:
cpp-server:
build: .
ports:
- "8080:8080"
environment:
- LOG_LEVEL=INFO
- SERVER_PORT=8080
- THREAD_POOL_SIZE=4
volumes:
- ./logs:/app/logs
- ./data:/app/data
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3Run with:
docker-compose up -d- Ubuntu 20.04+ or similar Linux distribution
- 2+ CPU cores
- 4GB+ RAM
- 10GB+ disk space
- Network access on port 8080
- Install dependencies:
sudo apt-get update
sudo apt-get install -y libboost-all-dev nlohmann-json3-dev libssl-dev libsqlite3-dev cmake build-essential- Create service user:
sudo useradd -r -s /bin/false cppserver
sudo mkdir -p /opt/cpp-server
sudo chown cppserver:cppserver /opt/cpp-server- Deploy application:
# Copy files to production directory
sudo cp -r . /opt/cpp-server/
sudo chown -R cppserver:cppserver /opt/cpp-server
# Build application
cd /opt/cpp-server
sudo -u cppserver make clean && make- Create systemd service:
Create /etc/systemd/system/cpp-server.service:
[Unit]
Description=C++ HTTP Server
After=network.target
[Service]
Type=simple
User=cppserver
Group=cppserver
WorkingDirectory=/opt/cpp-server
ExecStart=/opt/cpp-server/server
Restart=always
RestartSec=10
Environment=LOG_LEVEL=INFO
Environment=SERVER_PORT=8080
# Security settings
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/cpp-server/logs /opt/cpp-server/data
[Install]
WantedBy=multi-user.target- Start service:
sudo systemctl daemon-reload
sudo systemctl enable cpp-server
sudo systemctl start cpp-server
sudo systemctl status cpp-serverCreate /etc/nginx/sites-available/cpp-server:
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:8080;
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;
}
location /health {
proxy_pass http://localhost:8080/health;
access_log off;
}
}Enable the site:
sudo ln -s /etc/nginx/sites-available/cpp-server /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxThe server reads configuration from:
config/server.conf(default values)- Environment variables (override config file)
| Variable | Default | Description |
|---|---|---|
SERVER_PORT |
8080 | Server listening port |
LOG_LEVEL |
INFO | Logging level (DEBUG, INFO, WARN, ERROR, FATAL) |
LOG_FILE |
logs/server.log | Log file path |
THREAD_POOL_SIZE |
4 | Number of worker threads |
DB_PATH |
data/server.db | SQLite database path |
RSA_PRIVATE_KEY |
config/privateKey.pem | RSA private key file |
RSA_PUBLIC_KEY |
config/publicKey.pem | RSA public key file |
BCRYPT_ROUNDS |
12 | Bcrypt hashing rounds |
# Create production environment file
sudo tee /opt/cpp-server/.env << EOF
SERVER_PORT=8080
LOG_LEVEL=WARN
LOG_FILE=/opt/cpp-server/logs/server.log
THREAD_POOL_SIZE=8
DB_PATH=/opt/cpp-server/data/server.db
EOF
sudo chown cppserver:cppserver /opt/cpp-server/.envThe server provides a health endpoint at /health that returns:
- Server status and uptime
- System resource usage
- Configuration details
- Dependency status
Set up log rotation with /etc/logrotate.d/cpp-server:
/opt/cpp-server/logs/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 644 cppserver cppserver
postrotate
systemctl reload cpp-server
endscript
}
Monitor key metrics:
- CPU and memory usage
- Request response times
- Error rates
- Connection counts
Use tools like:
htopfor system resourcescurl http://localhost:8080/healthfor application healthjournalctl -u cpp-server -ffor real-time logs
Run multiple instances behind a load balancer:
# docker-compose.yml for multiple instances
version: '3.8'
services:
cpp-server-1:
build: .
ports:
- "8081:8080"
environment:
- SERVER_PORT=8080
cpp-server-2:
build: .
ports:
- "8082:8080"
environment:
- SERVER_PORT=8080
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- cpp-server-1
- cpp-server-2Nginx upstream configuration:
upstream cpp_servers {
server cpp-server-1:8080;
server cpp-server-2:8080;
}
server {
listen 80;
location / {
proxy_pass http://cpp_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}# Allow only necessary ports
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enableUse Let's Encrypt with Certbot:
sudo apt-get install certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.comAdd security headers in Nginx:
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";-
Port already in use:
sudo lsof -i :8080 sudo kill -9 <PID>
-
Permission denied:
sudo chown -R cppserver:cppserver /opt/cpp-server sudo chmod +x /opt/cpp-server/server
-
Missing dependencies:
ldd /opt/cpp-server/server sudo apt-get install --fix-missing
Check logs for issues:
# System logs
sudo journalctl -u cpp-server -n 100
# Application logs
tail -f /opt/cpp-server/logs/server.log
# Error patterns
grep -i error /opt/cpp-server/logs/server.log# Backup SQLite database
cp /opt/cpp-server/data/server.db /backup/server-$(date +%Y%m%d).db
# Automated backup script
#!/bin/bash
BACKUP_DIR="/backup"
DB_PATH="/opt/cpp-server/data/server.db"
DATE=$(date +%Y%m%d_%H%M%S)
cp "$DB_PATH" "$BACKUP_DIR/server_$DATE.db"
find "$BACKUP_DIR" -name "server_*.db" -mtime +7 -delete# Backup configuration
tar -czf /backup/cpp-server-config-$(date +%Y%m%d).tar.gz /opt/cpp-server/config