2025-11-10 13:10
文件:/etc/nginx/nginx.conf 或 /etc/nginx/sites-available/your-site
nginx
复制下载
# 运行Nginx的用户和组user nginx;# Worker进程数,通常设置为CPU核心数worker_processes auto;# 错误日志路径和级别error_log /var/log/nginx/error.log warn;# PID文件位置pid /var/run/nginx.pid;events {
# 每个worker进程的最大连接数
worker_connections 1024;
# 使用高效的事件驱动模型(Linux下推荐epoll)
use epoll;
# 开启多连接接受
multi_accept on;}http {
# 包含MIME类型定义
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式定义
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"';
# 访问日志
access_log /var/log/nginx/access.log main;
# 性能优化参数
sendfile on; # 启用高效文件传输
tcp_nopush on; # 在sendfile模式下,等待数据包充满再发送
tcp_nodelay on; # 禁用Nagle算法
keepalive_timeout 65; # 保持连接超时时间
types_hash_max_size 2048;
# Gzip压缩配置
gzip on;
gzip_vary on;
gzip_min_length 1024; # 小于此值不压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml;
# 上游服务器定义(用于负载均衡)
upstream backend_servers {
# 负载均衡算法,可选:ip_hash, least_conn, hash
least_conn;
server 192.168.1.101:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.102:8080 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.1.103:8080 weight=1 max_fails=3 fail_timeout=30s;
# 可选的健康检查
# check interval=3000 rise=2 fall=3 timeout=1000 type=http;
}
# HTTP虚拟主机配置(强制跳转HTTPS)
server {
listen 80;
server_name example.com www.example.com;
# HTTP强制跳转HTTPS
return 301 https://$server_name$request_uri;
}
# HTTPS虚拟主机配置
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# SSL证书配置
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# SSL安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:!aNULL:!MD5:!RC4;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 根目录和默认文件
root /var/www/html;
index index.html index.htm;
# 静态资源服务配置
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
# 反向代理到应用服务器
location /api/ {
proxy_pass http://backend_servers;
# 传递必要的头部信息
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;
# 超时设置
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
# PHP-FPM配置
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 安全头设置
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
}}文件:/etc/mysql/my.cnf 或 /etc/my.cnf
ini
复制下载
[mysqld]# ===== 基础设置 =====# 数据目录datadir = /var/lib/mysqlsocket = /var/lib/mysql/mysql.sock# 禁止符号链接以防止安全风险symbolic-links = 0# ===== 网络与连接 =====# 绑定地址,生产环境建议绑定内网IPbind-address = 127.0.0.1port = 3306# 连接设置max_connections = 200max_connect_errors = 10000back_log = 300# ===== 字符集设置 =====character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci# ===== 存储引擎设置 =====default-storage-engine = InnoDB# ===== InnoDB 配置 =====# InnoDB缓冲池大小,建议为系统内存的50%-70%innodb_buffer_pool_size = 1G# InnoDB日志文件大小innodb_log_file_size = 256Minnodb_log_buffer_size = 16M# InnoDB刷新日志策略innodb_flush_log_at_trx_commit = 1innodb_flush_method = O_DIRECT# InnoDB锁等待超时innodb_lock_wait_timeout = 50# ===== 查询缓存(MySQL 5.7中建议关闭,8.0中已移除) =====query_cache_type = 0query_cache_size = 0# ===== 二进制日志(用于主从复制) =====server-id = 1log_bin = /var/log/mysql/mysql-bin.logexpire_logs_days = 7max_binlog_size = 100Mbinlog_format = row# ===== 慢查询日志 =====slow_query_log = 1slow_query_log_file = /var/log/mysql/mysql-slow.loglong_query_time = 2log_queries_not_using_indexes = 0# ===== 其他优化 =====tmp_table_size = 64Mmax_heap_table_size = 64Mthread_cache_size = 16table_open_cache = 2000[mysql]default-character-set = utf8mb4[client]default-character-set = utf8mb4socket = /var/lib/mysql/mysql.sock
文件:/etc/redis/redis.conf
ini
复制下载
# 基础配置bind 127.0.0.1 # 生产环境建议绑定内网IP port 6379# 守护进程模式daemonize yes pidfile /var/run/redis/redis-server.pid# 日志配置loglevel notice logfile /var/log/redis/redis-server.log# 数据库数量databases 16# 持久化配置# RDB持久化save 900 1 # 900秒内至少有1个key被改变 save 300 10 # 300秒内至少有10个key被改变 save 60 10000 # 60秒内至少有10000个key被改变 rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir /var/lib/redis# AOF持久化appendonly yes appendfilename "appendonly.aof" appendfsync everysec # 每秒同步,兼顾性能和数据安全# AOF重写配置auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb# 内存管理maxmemory 2gb maxmemory-policy allkeys-lru # 内存满时的淘汰策略# 安全配置requirepass your-strong-redis-password-here # 设置访问密码# 重命名危险命令(可选但推荐)rename-command FLUSHALL "" rename-command FLUSHDB "" rename-command CONFIG ""# 慢查询日志slowlog-log-slower-than 10000 # 超过10毫秒的查询 slowlog-max-len 128# 客户端连接配置timeout 0 # 客户端空闲N秒后关闭连接,0表示禁用 tcp-keepalive 300# 监控配置# monitor-threshold 100
文件:/etc/systemd/system/your-app.service
ini
复制下载
[Unit]# 服务描述Description=Your Application ServiceDocumentation=https://your-app-docs.com# 在network.target之后启动,如果需要网络的话After=network.target# 如果依赖其他服务,可以在这里指定# After=mysql.service redis.service[Service]# 服务类型Type=simple# 启动服务的用户和组User=appuserGroup=appgroup# 工作目录WorkingDirectory=/opt/your-app# 启动命令ExecStart=/usr/bin/java -jar /opt/your-app/your-app.jar# 或者对于其他应用:# ExecStart=/usr/local/bin/gunicorn --workers 3 --bind 0.0.0.0:8000 wsgi:app# ExecStart=/usr/bin/node /opt/your-app/app.js# 环境变量Environment=NODE_ENV=productionEnvironment=DB_HOST=localhostEnvironment=DB_PORT=3306# 重启策略Restart=alwaysRestartSec=10# 优雅停止超时时间TimeoutStopSec=30# 信号处理KillSignal=SIGTERM# 标准输出和错误输出StandardOutput=journalStandardError=journal# 安全设置NoNewPrivileges=yesPrivateTmp=yesProtectSystem=strictProtectHome=yesReadWritePaths=/opt/your-app/logs /opt/your-app/data[Install]# 在什么target下启用WantedBy=multi-user.target
文件:docker-compose.yml
yaml
复制下载
version: '3.8'services: # Web应用服务 web: build: context: . dockerfile: Dockerfile image: your-registry/your-app:latest container_name: your-app-web restart: unless-stopped ports: - "80:8000" environment: - NODE_ENV=production - DATABASE_URL=postgresql://user:pass@db:5432/yourdb - REDIS_URL=redis://redis:6379/0 depends_on: - db - redis volumes: - ./logs:/app/logs networks: - app-network # 数据库服务 db: image: postgres:13 container_name: your-app-db restart: unless-stopped environment: POSTGRES_DB: yourdb POSTGRES_USER: user POSTGRES_PASSWORD: your-strong-db-password volumes: - db_data:/var/lib/postgresql/data - ./backups:/backups networks: - app-network # Redis缓存服务 redis: image: redis:6-alpine container_name: your-app-redis restart: unless-stopped command: redis-server --requirepass your-strong-redis-password volumes: - redis_data:/data networks: - app-network # Nginx反向代理 nginx: image: nginx:alpine container_name: your-app-nginx restart: unless-stopped ports: - "443:443" - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./ssl:/etc/nginx/ssl:ro depends_on: - web networks: - app-network# 数据卷定义volumes: db_data: redis_data:# 网络定义networks: app-network: driver: bridge
文件:/etc/sysctl.d/99-custom-optimizations.conf
bash
复制下载
# ===== 网络优化 =====# 扩大本地端口范围net.ipv4.ip_local_port_range = 1024 65535# 启用TIME-WAIT重用和快速回收net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_fin_timeout = 30# 增大连接队列net.core.somaxconn = 65535net.ipv4.tcp_max_syn_backlog = 65535# TCP缓冲区大小net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.ipv4.tcp_rmem = 4096 87380 16777216net.ipv4.tcp_wmem = 4096 16384 16777216# 网络设备积压队列net.core.netdev_max_backlog = 30000# ===== 内存优化 =====# 降低Swappiness倾向vm.swappiness = 10# 脏页回写策略vm.dirty_background_ratio = 5vm.dirty_ratio = 10# 减少VFS缓存压力vm.vfs_cache_pressure = 50# ===== 文件系统优化 =====# 增加文件描述符限制fs.file-max = 100000# 提高inode缓存大小vm.vfs_cache_pressure = 50
使用说明:
这些模板基于通用最佳实践,实际使用时请根据您的具体硬件配置和业务需求进行调整。
所有密码和敏感信息应使用环境变量或密钥管理服务,避免硬编码在配置文件中。
修改配置文件前请务必备份原始文件。
修改系统级配置(如内核参数)后,需要重新加载或重启相应服务才能生效。