发布时间:2026-09-17 09:30:41 发布者:网站维护托管搭建专家
在云计算和容器化大行其道的今天,Linux 服务器依然是全球超过 90% 网站的底层运行环境。无论是企业官网、电商平台还是个人博客,掌握 Linux 环境下的网站搭建能力,是每一位运维工程师的核心基本功。
本文以实战为导向,系统梳理从操作系统初始化到网站上线全流程所需的关键命令,覆盖 CentOS 7/8 与 Ubuntu 20.04/22.04 两大主流发行版,力求让读者"一文在手,建站无忧"。
第一章:系统环境初始化
万丈高楼平地起,服务器环境的初始化是一切部署的基石。
1.1 系统更新与基础工具安装
CentOS / RHEL / Rocky Linux:
# 更新所有软件包 sudo yum update -y # 安装基础开发工具 sudo yum groupinstall "Development Tools" -y # 安装常用运维工具 sudo yum install -y wget curl vim git tar unzip net-tools lrzsz \ htop iotop sysstat ntpdate epel-release # 安装编译依赖 sudo yum install -y gcc gcc-c++ make cmake openssl-devel \ pcre-devel zlib-devel libxml2-devel libxslt-devel
Ubuntu / Debian:
# 更新软件源与升级所有包 sudo apt update && sudo apt upgrade -y # 安装基础开发工具 sudo apt install -y build-essential # 安装常用运维工具 sudo apt install -y wget curl vim git tar unzip net-tools \ htop iotop sysstat ntpdate software-properties-common # 安装编译依赖 sudo apt install -y gcc g++ make cmake libssl-dev \ libpcre3-dev zlib1g-dev libxml2-dev libxslt1-dev
1.2 时间同步配置
# 设置时区为中国标准时间 sudo timedatectl set-timezone Asia/Shanghai # 安装并启用 chrony(推荐替代 ntp) sudo yum install -y chrony # CentOS sudo apt install -y chrony # Ubuntu # 启动并设为开机自启 sudo systemctl start chronyd sudo systemctl enable chronyd # 验证时间同步状态 chronyc tracking chronyc sources -v
1.3 创建运维专用用户(避免直接使用 root)
# 创建用户并设置密码 sudo useradd -m -s /bin/bash webadmin sudo passwd webadmin # 授予 sudo 权限 sudo usermod -aG wheel webadmin # CentOS sudo usermod -aG sudo webadmin # Ubuntu # 验证切换 su - webadmin sudo whoami # 应输出 root
1.4 内核参数优化(针对 Web 服务器场景)
# 编辑 sysctl 配置 sudo vim /etc/sysctl.conf
追加以下内容:
# ===== Web 服务器内核优化 ===== # 最大文件描述符数 fs.file-max = 655350 # TCP 连接优化 net.core.somaxconn = 65535 net.core.netdev_max_backlog = 65535 net.ipv4.tcp_max_syn_backlog = 65535 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_max_tw_buckets = 6000 net.ipv4.ip_local_port_range = 1024 65535 # 缓冲区优化 net.core.rmem_default = 262144 net.core.rmem_max = 16777216 net.core.wmem_default = 262144 net.core.wmem_max = 16777216
# 使配置立即生效 sudo sysctl -p
1.5 文件描述符限制调整
sudo vim /etc/security/limits.conf
追加:
* soft nofile 655350 * hard nofile 655350 * soft nproc 655350 * hard nproc 655350 root soft nofile 655350 root hard nofile 655350

第二章:Web 服务器安装与配置
2.1 Nginx 安装与配置
方式一:包管理器安装(快速部署)
CentOS:
# 添加 Nginx 官方源 sudo vim /etc/yum.repos.d/nginx.repo
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key
sudo yum install -y nginx sudo systemctl start nginx sudo systemctl enable nginx nginx -v # 查看版本
Ubuntu:
sudo add-apt-repository ppa:nginx/stable -y sudo apt update sudo apt install -y nginx sudo systemctl start nginx sudo systemctl enable nginx nginx -v
方式二:源码编译安装(生产推荐,可自定义模块)
# 下载源码 cd /usr/local/src sudo wget https://nginx.org/download/nginx-1.26.2.tar.gz sudo tar -zxvf nginx-1.26.2.tar.gz cd nginx-1.26.2 # 编译配置(含常用模块) sudo ./configure \ --prefix=/usr/local/nginx \ --sbin-path=/usr/local/nginx/sbin/nginx \ --conf-path=/usr/local/nginx/conf/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx.pid \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --with-http_sub_module \ --with-stream \ --with-pcre \ --with-zlib # 编译与安装 sudo make -j$(nproc) sudo make install # 创建 systemd 服务文件 sudo vim /etc/systemd/system/nginx.service
[Unit] Description=The NGINX HTTP and reverse proxy server After=syslog.target network-online.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/var/run/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop PrivateTmp=true [Install] WantedBy=multi-user.target
sudo systemctl daemon-reload sudo systemctl start nginx sudo systemctl enable nginx
Nginx 核心配置模板
sudo vim /usr/local/nginx/conf/nginx.conf
user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
http {
include 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"';
# 基础优化
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
client_max_body_size 50m;
server_tokens off;
# Gzip 压缩
gzip on;
gzip_min_length 1k;
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/javascript
text/xml application/xml application/xml+rss text/javascript;
gzip_vary on;
# 引入站点配置
include /usr/local/nginx/conf/conf.d/*.conf;
}虚拟主机配置示例
sudo mkdir -p /usr/local/nginx/conf/conf.d sudo vim /usr/local/nginx/conf/conf.d/example.com.conf
server {
listen 80;
server_name example.com www.example.com;
root /data/www/example.com;
index index.html index.php;
# 访问日志
access_log /var/log/nginx/example.com.access.log main;
error_log /var/log/nginx/example.com.error.log warn;
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2|svg)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# PHP 处理
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;
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
}
}# 检测配置语法 sudo nginx -t # 平滑重载 sudo nginx -s reload
2.2 Apache (httpd) 安装与配置
CentOS:
sudo yum install -y httpd httpd-devel mod_ssl sudo systemctl start httpd sudo systemctl enable httpd httpd -v
Ubuntu:
sudo apt install -y apache2 apache2-dev libapache2-mod-php sudo systemctl start apache2 sudo systemctl enable apache2 apache2 -v
Apache 常用管理命令
# 检查配置语法 sudo apachectl configtest # 或 httpd -t # 优雅重启(不中断现有连接) sudo apachectl graceful # 查看已加载模块 sudo apachectl -M # 查看虚拟主机配置 sudo apachectl -S # Ubuntu 启用/禁用站点与模块 sudo a2ensite example.com.conf # 启用站点 sudo a2dissite example.com.conf # 禁用站点 sudo a2enmod rewrite # 启用 mod_rewrite sudo a2enmod ssl # 启用 SSL 模块 sudo a2enmod headers # 启用 headers 模块
Apache 虚拟主机配置示例
sudo vim /etc/httpd/conf.d/example.com.conf # CentOS sudo vim /etc/apache2/sites-available/example.com.conf # Ubuntu
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com DocumentRoot /data/www/example.com <Directory /data/www/example.com> Options -Indexes +FollowSymLinks AllowOverride All Require all granted </Directory> # 日志 ErrorLog /var/log/httpd/example.com-error.log CustomLog /var/log/httpd/example.com-access.log combined # 安全头 Header always set X-Content-Type-Options "nosniff" Header always set X-Frame-Options "SAMEORIGIN" Header always set X-XSS-Protection "1; mode=block" </VirtualHost>
第三章:数据库安装与配置
3.1 MySQL 8.0 安装
CentOS:
# 添加 MySQL 官方源 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm # 安装 MySQL sudo yum install -y mysql-community-server # 启动服务 sudo systemctl start mysqld sudo systemctl enable mysqld # 获取临时密码 sudo grep 'temporary password' /var/log/mysqld.log
Ubuntu:
sudo apt install -y mysql-server-8.0 sudo systemctl start mysql sudo systemctl enable mysql
安全初始化
# 运行安全脚本(修改 root 密码、删除匿名用户、禁止远程 root 登录等) sudo mysql_secure_installation # 登录 MySQL sudo mysql -u root -p
创建网站专用数据库与用户
-- 创建数据库 CREATE DATABASE webapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建专用用户(仅限本地连接) CREATE USER 'webapp_user'@'localhost' IDENTIFIED BY 'YourStrongP@ssw0rd!'; -- 授权 GRANT ALL PRIVILEGES ON webapp_db.* TO 'webapp_user'@'localhost'; -- 刷新权限 FLUSH PRIVILEGES; -- 验证 SHOW GRANTS FOR 'webapp_user'@'localhost';
MySQL 核心配置优化
sudo vim /etc/my.cnf # CentOS sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf # Ubuntu
[mysqld] # 基础配置 datadir = /data/mysql socket = /var/lib/mysql/mysql.sock port = 3306 character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci default-authentication-plugin = mysql_native_password # 连接数 max_connections = 500 max_connect_errors = 1000 wait_timeout = 600 interactive_timeout = 600 # InnoDB 优化(建议设为物理内存的 50%-75%) innodb_buffer_pool_size = 2G innodb_buffer_pool_instances = 4 innodb_log_file_size = 512M innodb_flush_log_at_trx_commit = 2 innodb_flush_method = O_DIRECT innodb_io_capacity = 2000 # 查询缓存(MySQL 8.0 已移除 query_cache) # 慢查询日志 slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 # 二进制日志(主从复制/数据恢复必备) server-id = 1 log-bin = mysql-bin binlog_format = ROW expire_logs_days = 7
sudo systemctl restart mysqld
3.2 MariaDB 安装(MySQL 替代方案)
CentOS:
sudo yum install -y mariadb mariadb-server sudo systemctl start mariadb sudo systemctl enable mariadb sudo mysql_secure_installation
Ubuntu:
sudo apt install -y mariadb-server mariadb-client sudo systemctl start mariadb sudo systemctl enable mariadb sudo mysql_secure_installation
3.3 Redis 缓存数据库安装
# CentOS sudo yum install -y redis # Ubuntu sudo apt install -y redis-server # 启动 sudo systemctl start redis sudo systemctl enable redis # 验证连接 redis-cli ping # 应返回 PONG
Redis 安全配置
sudo vim /etc/redis.conf # CentOS: /etc/redis/redis.conf
# 绑定地址(仅本地) bind 127.0.0.1 # 设置密码 requirepass YourRedisP@ssw0rd! # 禁止危险命令 rename-command FLUSHDB "" rename-command FLUSHALL "" rename-command KEYS "" rename-command CONFIG "" # 最大内存限制 maxmemory 256mb maxmemory-policy allkeys-lru
第四章:编程语言运行时环境
4.1 PHP 安装与配置(LNMP / LAMP 必备)
CentOS:
# 添加 Remi 源(获取最新 PHP 版本) sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm sudo yum install -y yum-utils sudo yum-config-manager --enable remi-php82 # 安装 PHP 及常用扩展 sudo yum install -y php php-fpm php-cli php-mysqlnd php-pdo \ php-gd php-mbstring php-xml php-curl php-zip php-opcache \ php-redis php-bcmath php-intl php-soap php-json
Ubuntu:
sudo add-apt-repository ppa:ondrej/php -y sudo apt update sudo apt install -y php8.2 php8.2-fpm php8.2-cli php8.2-mysql \ php8.2-gd php8.2-mbstring php8.2-xml php8.2-curl php8.2-zip \ php8.2-opcache php8.2-redis php8.2-bcmath php8.2-intl
PHP-FPM 配置优化
sudo vim /etc/php-fpm.d/www.conf # CentOS sudo vim /etc/php/8.2/fpm/pool.d/www.conf # Ubuntu
[www] user = nginx # 与 Web 服务器用户一致 group = nginx listen = 127.0.0.1:9000 ; 进程管理模式:dynamic(动态)或 static(静态) pm = dynamic pm.max_children = 50 # 最大子进程数 pm.start_servers = 10 # 启动时的进程数 pm.min_spare_servers = 5 # 最少空闲进程 pm.max_spare_servers = 20 # 最多空闲进程 pm.max_requests = 1000 # 单进程最大请求数(防内存泄漏) pm.process_idle_timeout = 10s ; 慢日志 slowlog = /var/log/php-fpm/www-slow.log request_slowlog_timeout = 5s ; 状态页面(监控用) pm.status_path = /fpm-status ping.path = /fpm-ping
sudo systemctl restart php-fpm # CentOS sudo systemctl restart php8.2-fpm # Ubuntu
PHP 生产环境核心参数
sudo vim /etc/php.ini # CentOS sudo vim /etc/php/8.2/fpm/php.ini # Ubuntu
; 安全设置 expose_php = Off display_errors = Off log_errors = On error_log = /var/log/php_errors.log ; 资源限制 memory_limit = 256M max_execution_time = 30 max_input_time = 30 post_max_size = 50M upload_max_filesize = 50M ; 时区 date.timezone = Asia/Shanghai ; OPcache 优化 opcache.enable = 1 opcache.memory_consumption = 256 opcache.interned_strings_buffer = 16 opcache.max_accelerated_files = 20000 opcache.validate_timestamps = 0 # 生产环境建议关闭(部署后手动清除)
4.2 Node.js 安装
# 使用 NodeSource 安装 Node.js 20.x LTS curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - # Ubuntu curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - # CentOS sudo apt install -y nodejs # Ubuntu sudo yum install -y nodejs # CentOS # 验证 node -v npm -v # 安装 PM2 进程管理器 sudo npm install -g pm2 # PM2 常用命令 pm2 start app.js --name "my-webapp" pm2 start ecosystem.config.js pm2 list pm2 logs my-webapp pm2 restart my-webapp pm2 stop my-webapp pm2 delete my-webapp pm2 monit # 设置开机自启 pm2 startup pm2 save
4.3 Python (Django / Flask) 环境
# 安装 Python 3.12 sudo yum install -y python3 python3-pip python3-venv # CentOS sudo apt install -y python3 python3-pip python3-venv # Ubuntu # 创建项目虚拟环境 cd /data/www/myproject python3 -m venv venv source venv/bin/activate # 安装依赖 pip install django gunicorn mysqlclient redis # 或 pip install flask gunicorn # Gunicorn 启动命令示例 gunicorn myproject.wsgi:application \ --workers 4 \ --bind 127.0.0.1:8000 \ --access-logfile /var/log/gunicorn/access.log \ --error-logfile /var/log/gunicorn/error.log \ --daemon
4.4 Java (Spring Boot) 环境
# 安装 JDK 17 sudo yum install -y java-17-openjdk java-17-openjdk-devel # CentOS sudo apt install -y openjdk-17-jdk # Ubuntu # 验证 java -version # 设置 JAVA_HOME echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk' >> ~/.bashrc source ~/.bashrc # Spring Boot 项目启动 nohup java -jar -Xms512m -Xmx1024m \ -Dspring.profiles.active=prod \ myapp-1.0.0.jar > /var/log/myapp/app.log 2>&1 &
第五章:SSL 证书与 HTTPS 配置
5.1 使用 Let's Encrypt 免费证书(Certbot)
# 安装 Certbot sudo yum install -y certbot python3-certbot-nginx # CentOS + Nginx sudo apt install -y certbot python3-certbot-nginx # Ubuntu + Nginx sudo yum install -y certbot python3-certbot-apache # CentOS + Apache sudo apt install -y certbot python3-certbot-apache # Ubuntu + Apache # 自动申请并配置 SSL(Nginx) sudo certbot --nginx -d example.com -d www.example.com # 手动申请(适用于自定义配置) sudo certbot certonly --webroot -w /data/www/example.com -d example.com -d www.example.com # 自动续期测试 sudo certbot renew --dry-run # Certbot 自动续期已注册为 systemd timer 或 cron sudo systemctl list-timers | grep certbot # 手动续期 sudo certbot renew sudo nginx -s reload
5.2 Nginx HTTPS 完整配置模板
# HTTP → HTTPS 强制跳转
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
# HTTPS 主配置
server {
listen 443 ssl http2;
server_name example.com www.example.com;
root /data/www/example.com;
index index.html index.php;
# SSL 证书路径(Certbot 自动生成)
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-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_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# HSTS(Strict-Transport-Security)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 8.8.8.8 223.5.5.5 valid=300s;
resolver_timeout 5s;
# 安全头
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
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;
}
}第六章:防火墙与安全配置
6.1 firewalld(CentOS 默认)
# 查看状态 sudo systemctl status firewalld # 开放 HTTP 和 HTTPS sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https # 开放自定义端口 sudo firewall-cmd --permanent --add-port=8080/tcp # 开放 MySQL(仅限内网 IP) sudo firewall-cmd --permanent --add-rich-rule=' rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept' # 移除端口 sudo firewall-cmd --permanent --remove-port=8080/tcp # 重新加载 sudo firewall-cmd --reload # 查看所有规则 sudo firewall-cmd --list-all
6.2 UFW(Ubuntu 默认)
# 启用 UFW sudo ufw enable # 默认策略 sudo ufw default deny incoming sudo ufw default allow outgoing # 开放 SSH(务必先开!) sudo ufw allow 22/tcp # 开放 HTTP/HTTPS sudo ufw allow 80/tcp sudo ufw allow 443/tcp # 限制 SSH 暴力破解(限速) sudo ufw limit 22/tcp # 开放指定 IP 访问 MySQL sudo ufw allow from 192.168.1.0/24 to any port 3306 # 查看状态 sudo ufw status verbose # 删除规则 sudo ufw delete allow 8080/tcp
6.3 iptables(通用方案)
# 清除所有规则 sudo iptables -F sudo iptables -X # 默认策略 sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP sudo iptables -P OUTPUT ACCEPT # 允许本地回环 sudo iptables -A INPUT -i lo -j ACCEPT # 允许已建立连接 sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 开放 SSH sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 开放 HTTP/HTTPS sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 防暴力破解 SSH(每分钟最多 3 次) sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update \ --seconds 60 --hitcount 4 -j DROP # 保存规则 sudo iptables-save > /etc/sysconfig/iptables # CentOS sudo apt install -y iptables-persistent # Ubuntu sudo netfilter-persistent save
6.4 SSH 安全加固
sudo vim /etc/ssh/sshd_config
# 更改默认端口 Port 22222 # 禁止 root 远程登录 PermitRootLogin no # 仅允许密钥认证 PasswordAuthentication no PubkeyAuthentication yes # 限制登录用户 AllowUsers webadmin deploy # 登录超时 LoginGraceTime 30 ClientAliveInterval 300 ClientAliveCountMax 2
sudo systemctl restart sshd
6.5 Fail2Ban 防暴力破解
# 安装 sudo yum install -y fail2ban # CentOS sudo apt install -y fail2ban # Ubuntu # 配置 sudo vim /etc/fail2ban/jail.local
[DEFAULT] bantime = 3600 findtime = 600 maxretry = 3 banaction = iptables-multiport [sshd] enabled = true port = 22222 filter = sshd logpath = /var/log/secure # CentOS # logpath = /var/log/auth.log # Ubuntu [nginx-http-auth] enabled = true filter = nginx-http-auth port = http,https logpath = /var/log/nginx/error.log
sudo systemctl start fail2ban sudo systemctl enable fail2ban # 查看封禁状态 sudo fail2ban-client status sudo fail2ban-client status sshd # 手动解封 IP sudo fail2ban-client set sshd unbanip 192.168.1.100
第七章:常见 Web 应用部署实战
7.1 WordPress 部署
# 1. 创建目录 sudo mkdir -p /data/www/wordpress cd /data/www/wordpress # 2. 下载 WordPress sudo wget https://cn.wordpress.org/latest-zh_CN.tar.gz sudo tar -zxvf latest-zh_CN.tar.gz --strip-components=1 sudo rm -f latest-zh_CN.tar.gz # 3. 创建数据库 mysql -u root -p -e " CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'WpStr0ng!Pass'; GRANT ALL ON wordpress.* TO 'wp_user'@'localhost'; FLUSH PRIVILEGES;" # 4. 配置 wp-config.php sudo cp wp-config-sample.php wp-config.php sudo vim wp-config.php
修改以下关键配置:
define('DB_NAME', 'wordpress');
define('DB_USER', 'wp_user');
define('DB_PASSWORD', 'WpStr0ng!Pass');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', '');
// 安全密钥(从 https://api.wordpress.org/secret-key/1.1/salt/ 获取)
define('AUTH_KEY', '替换为随机值');
define('SECURE_AUTH_KEY', '替换为随机值');
// ... 其他密钥# 5. 设置文件权限
sudo chown -R nginx:nginx /data/www/wordpress # Nginx
# sudo chown -R www-data:www-data /data/www/wordpress # Ubuntu Apache
sudo find /data/www/wordpress -type d -exec chmod 755 {} \;
sudo find /data/www/wordpress -type f -exec chmod 644 {} \;
# 6. 配置 Nginx 虚拟主机(参考第二章配置模板)
# 7. 浏览器访问 http://yourdomain.com 完成安装向导7.2 静态网站部署(Hugo / Hexo / Vite 构建产物)
# 构建产物上传到服务器 scp -r ./dist/* webadmin@yourserver:/data/www/static-site/ # 或使用 rsync 增量同步 rsync -avz --delete ./dist/ webadmin@yourserver:/data/www/static-site/ # Nginx 配置(极简版)
server {
listen 80;
server_name example.com;
root /data/www/static-site;
index index.html;
# SPA 应用 history 模式
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源强缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# gzip 静态文件
gzip_static on;
}7.3 Docker 容器化部署
# 安装 Docker curl -fsSL https://get.docker.com | sudo sh sudo systemctl start docker sudo systemctl enable docker # 安装 Docker Compose sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" \ -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose # Docker Compose 一键部署 LNMP vim docker-compose.yml
version: '3.8' services: nginx: image: nginx:1.26-alpine ports: - "80:80" - "443:443" volumes: - ./nginx/conf.d:/etc/nginx/conf.d - ./www:/var/www/html - ./nginx/ssl:/etc/nginx/ssl depends_on: - php restart: always php: image: php:8.2-fpm-alpine volumes: - ./www:/var/www/html depends_on: - mysql - redis restart: always mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: RootP@ssw0rd! MYSQL_DATABASE: webapp_db volumes: - mysql_data:/var/lib/mysql ports: - "127.0.0.1:3306:3306" restart: always redis: image: redis:7-alpine command: redis-server --requirepass RedisP@ss! ports: - "127.0.0.1:6379:6379" restart: always volumes: mysql_data:
# 启动所有服务 sudo docker-compose up -d # 查看运行状态 sudo docker-compose ps # 查看日志 sudo docker-compose logs -f nginx # 停止并清除 sudo docker-compose down
第八章:域名解析与 DNS 配置
# 验证域名解析是否生效 dig example.com +short nslookup example.com host example.com # 检查指定 DNS 服务器 dig @8.8.8.8 example.com dig @223.5.5.5 example.com # 检查 CNAME 记录 dig CNAME www.example.com +short # 检查 MX 记录(邮件) dig MX example.com +short # 检查 TXT 记录(SSL 验证、SPF 等) dig TXT example.com +short # 持续监测 DNS 解析 watch -n 5 "dig example.com +short"
第九章:日志管理与监控
9.1 日志轮转(logrotate)
sudo vim /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 nginx adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}9.2 实时监控命令速查
# ===== 系统资源监控 =====
top # 实时进程监控
htop # 增强版 top
vmstat 1 10 # 每秒刷新,共10次
iostat -xz 1 # 磁盘 IO 监控(需 sysstat)
free -h # 内存使用概况
df -h # 磁盘空间
du -sh /data/www/* # 目录占用空间
# ===== 网络监控 =====
ss -tlnp # 查看监听端口
ss -s # 连接统计
netstat -anp | grep :80 # 查看 80 端口连接
iftop -i eth0 # 实时流量监控
nload eth0 # 带宽监控
# ===== Nginx 相关 =====
# 实时查看访问日志
tail -f /var/log/nginx/access.log
# 统计访问量 Top 10 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# 统计 HTTP 状态码分布
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# 统计请求最多的 URL Top 10
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# 统计每秒请求数(QPS)
awk '{print $4}' /var/log/nginx/access.log | cut -d: -f1-3 | uniq -c | sort -rn | head -10
# ===== MySQL 监控 =====
mysqladmin -u root -p status # MySQL 状态
mysqladmin -u root -p extended-status # 详细状态
mysql -u root -p -e "SHOW PROCESSLIST;" # 当前查询
mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Threads%';"
# ===== PHP-FPM 监控 =====
curl -s http://127.0.0.1/fpm-status # 需在 Nginx 中配置允许访问
curl -s http://127.0.0.1/fpm-ping # 存活检测第十章:自动化运维脚本
10.1 一键部署脚本模板
#!/bin/bash
# ============================================
# 网站一键部署脚本
# 用法: sudo bash deploy.sh <domain> <app_type>
# 示例: sudo bash deploy.sh example.com wordpress
# ============================================
set -euo pipefail
DOMAIN=${1:?"用法: $0 <domain> <app_type>"}
APP_TYPE=${2:-"static"}
WEB_ROOT="/data/www/${DOMAIN}"
NGINX_CONF="/usr/local/nginx/conf/conf.d/${DOMAIN}.conf"
LOG_DIR="/var/log/nginx"
echo "=========================================="
echo " 开始部署: ${DOMAIN}"
echo " 应用类型: ${APP_TYPE}"
echo "=========================================="
# 1. 创建目录
echo "[1/5] 创建网站目录..."
mkdir -p "${WEB_ROOT}"
# 2. 配置 Nginx
echo "[2/5] 生成 Nginx 配置..."
cat > "${NGINX_CONF}" << EOF
server {
listen 80;
server_name ${DOMAIN} www.${DOMAIN};
root ${WEB_ROOT};
index index.html index.php;
access_log ${LOG_DIR}/${DOMAIN}.access.log main;
error_log ${LOG_DIR}/${DOMAIN}.error.log warn;
location / {
try_files \$uri \$uri/ /index.php?\$query_string;
}
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;
}
}
EOF
# 3. 设置权限
echo "[3/5] 设置文件权限..."
chown -R nginx:nginx "${WEB_ROOT}"
chmod -R 755 "${WEB_ROOT}"
# 4. 测试 Nginx 配置
echo "[4/5] 测试 Nginx 配置..."
nginx -t
# 5. 重载 Nginx
echo "[5/5] 重载 Nginx..."
nginx -s reload
echo "=========================================="
echo " 部署完成!"
echo " 网站目录: ${WEB_ROOT}"
echo " Nginx 配置: ${NGINX_CONF}"
echo " 请访问: http://${DOMAIN}"
echo "=========================================="10.2 自动备份脚本
#!/bin/bash
# ============================================
# 网站数据自动备份脚本
# 建议通过 cron 每日凌晨执行
# ============================================
BACKUP_DIR="/data/backup"
DATE=$(date +%Y%m%d_%H%M%S)
WEB_ROOT="/data/www"
DB_USER="backup_user"
DB_PASS="BackupP@ss!"
RETENTION_DAYS=7
mkdir -p "${BACKUP_DIR}/db"
mkdir -p "${BACKUP_DIR}/files"
echo "[$(date)] 开始备份..."
# 1. 备份所有数据库
DATABASES=$(mysql -u ${DB_USER} -p${DB_PASS} -N -e "SHOW DATABASES;" | grep -v "information_schema\|performance_schema\|sys")
for db in ${DATABASES}; do
mysqldump -u ${DB_USER} -p${DB_PASS} --single-transaction --routines \
--triggers "${db}" | gzip > "${BACKUP_DIR}/db/${db}_${DATE}.sql.gz"
echo " 数据库 ${db} 备份完成"
done
# 2. 备份网站文件
tar -czf "${BACKUP_DIR}/files/web_${DATE}.tar.gz" \
--exclude='*.log' --exclude='cache' "${WEB_ROOT}"
echo " 网站文件备份完成"
# 3. 清理过期备份
find "${BACKUP_DIR}/db" -name "*.sql.gz" -mtime +${RETENTION_DAYS} -delete
find "${BACKUP_DIR}/files" -name "*.tar.gz" -mtime +${RETENTION_DAYS} -delete
echo " 已清理 ${RETENTION_DAYS} 天前的备份"
echo "[$(date)] 备份全部完成"# 添加定时任务(每天凌晨 2:00 执行) crontab -e 0 2 * * * /bin/bash /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
10.3 证书自动续期 + 服务重载
# Certbot 自动续期 cron(通常安装时已自动添加) 0 3 * * * certbot renew --quiet --post-hook "nginx -s reload" >> /var/log/certbot-renew.log 2>&1
第十一章:常见故障排查速查表
| 问题现象 | 排查命令 | 常见原因 |
|---|---|---|
| 网站无法访问 | curl -I http://example.com | DNS 未生效、防火墙拦截、服务未启动 |
| 502 Bad Gateway | tail -f /var/log/nginx/error.log | PHP-FPM 未启动、端口不匹配 |
| 504 Gateway Timeout | tail -f /var/log/nginx/error.log | 后端响应超时、数据库慢查询 |
| 403 Forbidden | ls -la /data/www/ + namei -om /data/www/ | 权限不足、SELinux 拦截 |
| MySQL 连接失败 | mysqladmin ping + ss -tlnp | grep 3306 | 密码错误、连接数满、端口未监听 |
| 磁盘空间不足 | df -h + du -sh /data/* | 日志未轮转、备份未清理 |
| 内存不足 | free -h + cat /proc/meminfo | 进程泄漏、配置参数过大 |
| CPU 占用过高 | top → 按 P 排序 + pidstat -u 1 | 恶意请求、代码死循环、数据库负载 |
| SSL 证书错误 | openssl s_client -connect example.com:443 | 证书过期、域名不匹配、中间链缺失 |
| SELinux 阻止访问 | getenforce + audit2allow -a | SELinux 策略限制(可临时 setenforce 0) |
# SELinux 相关(CentOS) getenforce # 查看状态 setenforce 0 # 临时关闭(调试用) chcon -Rt httpd_sys_content_t /data/www/ # 设置 Web 内容安全上下文 setsebool -P httpd_can_network_connect 1 # 允许 httpd 发起网络连接 # 查看系统日志 tail -f /var/log/messages # CentOS 系统日志 tail -f /var/log/syslog # Ubuntu 系统日志 journalctl -xe # systemd 日志 journalctl -u nginx --since "1 hour ago" # 指定服务日志 dmesg | tail # 内核日志(OOM 等)
第十二章:运维效率工具箱
# ===== 进程管理 =====
systemctl start/stop/restart/status <service> # 服务管理
systemctl enable/disable <service> # 开机自启
systemctl list-units --type=service --state=running # 所有运行中的服务
# ===== 用户与权限 =====
useradd / userdel / usermod # 用户管理
chown -R user:group /path # 修改所有者
chmod 755 / chmod 644 /path # 修改权限
visudo # 编辑 sudoers
# ===== 网络诊断 =====
curl -I URL # HTTP 头信息
wget --spider URL # 链接可用性检测
dig / nslookup / host # DNS 查询
traceroute example.com # 路由追踪
mtr example.com # 综合网络诊断
tcpdump -i eth0 -nn port 80 # 抓包分析
# ===== 文件操作 =====
find /data/www -name "*.log" -mtime +30 -delete # 删除30天前的日志
find /data/www -type f -name "*.php" -exec grep -l "eval" {} \; # 查找可疑文件
rsync -avz --delete src/ dest/ # 高效同步
lsof -i :80 # 查看端口占用进程
# ===== 性能压测 =====
ab -n 10000 -c 100 http://example.com/ # Apache Bench 压测
wrk -t4 -c100 -d30s http://example.com/ # wrk 压测结语
网站搭建绝非"装个 Nginx 就跑起来"那么简单。一个生产级的 Web 环境,需要在系统初始化、服务配置、安全防护、日志监控、自动备份等每一个环节做到位。
本文覆盖了 Linux 环境下网站搭建从零到上线的全流程命令,建议运维人员:
- 收藏本文,在实际操作时随时查阅
- 将常用命令封装为脚本,提升部署效率
- 定期审查安全配置,及时更新软件版本
- 建立完善的备份与监控体系,防患于未然
最佳实践提示:随着业务规模增长,建议逐步引入 Ansible 自动化编排、Prometheus + Grafana 监控告警、ELK/EFK 日志分析平台,将运维能力从"手动操作"升级为"自动化运维"。
文章标签:网站搭建,