网站维护搭建托管公司

找网站维护搭建托管公司,找我们就对了

Linux环境下网站搭建命令大全:运维人员必备的网站搭建手册

发布时间:2026-09-17 09:30:41 发布者:网站维护托管搭建专家


在云计算和容器化大行其道的今天,Linux 服务器依然是全球超过 90% 网站的底层运行环境。无论是企业官网、电商平台还是个人博客,掌握 Linux 环境下的网站搭建能力,是每一位运维工程师的核心基本功

本文以实战为导向,系统梳理从操作系统初始化到网站上线全流程所需的关键命令,覆盖 CentOS 7/8Ubuntu 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

undefined

第二章: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.comDNS 未生效、防火墙拦截、服务未启动
502 Bad Gatewaytail -f /var/log/nginx/error.logPHP-FPM 未启动、端口不匹配
504 Gateway Timeouttail -f /var/log/nginx/error.log后端响应超时、数据库慢查询
403 Forbiddenls -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 -aSELinux 策略限制(可临时 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 环境下网站搭建从零到上线的全流程命令,建议运维人员:

  1. 收藏本文,在实际操作时随时查阅
  2. 将常用命令封装为脚本,提升部署效率
  3. 定期审查安全配置,及时更新软件版本
  4. 建立完善的备份与监控体系,防患于未然

最佳实践提示:随着业务规模增长,建议逐步引入 Ansible 自动化编排、Prometheus + Grafana 监控告警、ELK/EFK 日志分析平台,将运维能力从"手动操作"升级为"自动化运维"。



文章标签:网站搭建,