当前位置:首页 > 技术 > 正文内容

网站根目录构建、服务器配置与安全加固实践

访客 技术 2026年9月26日 14

根目录的初始化与命名策略

Web服务的根目录(DocumentRoot)是浏览器请求映射到服务器文件系统的基础锚点。在类Unix环境中,虽然传统路径多位于/var/www,但现代部署更推荐根据业务隔离需求自定义路径。初始化操作可通过图形化传输工具或终端指令完成。

创建与赋权流程

通过终端执行是最直接且可审计的方式。以下为标准化创建步骤:

# 建立目标路径
sudo mkdir -p /srv/web/app-core

# 绑定Web服务运行账户
sudo chown -R www:www /srv/web/app-core

# 赋予标准读写执行权限
sudo chmod -R 755 /srv/web/app-core

目录命名规范

科学的命名有助于后期运维。建议遵循以下原则:

  • 业务标识法:使用项目缩写或域名主体(如client_dashboard、shop_v2)
  • 环境隔离法:附加阶段后缀(如staging_assets、live_frontend)
  • 字符限制:仅使用小写英文、数字及中划线,严禁包含空格或特殊符号

Web服务器虚拟主机映射

创建目录后,需将域名请求准确指向该路径。以下是Apache与Nginx的核心配置范式。

Apache 2.4 配置模板

配置文件通常存放于/etc/apache2/sites-available/,示例如下:

<VirtualHost *:80>
    ServerName main.site.com
    ServerAlias www.main.site.com
    ServerAdmin ops@main.site.com
    DocumentRoot /srv/web/app-core/public

    # 日志分流
    ErrorLog ${APACHE_LOG_DIR}/main.site_err.log
    CustomLog ${APACHE_LOG_DIR}/main.site_req.log combined

    <Directory "/srv/web/app-core/public">
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # 动态脚本处理
    <FilesMatch "\.ph(p3?|tml)$">
        SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

激活站点并重载服务:

sudo a2ensite main.site.conf
sudo apachectl graceful

Nginx 配置模板

Nginx配置侧重于高效的路由匹配与静态资源处理:

server {
    listen 80;
    server_name main.site.com www.main.site.com;
    root /srv/web/app-core/public;
    index index.php index.html;

    access_log /var/log/nginx/main.site.access.log;
    error_log /var/log/nginx/main.site.error.log warn;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # 阻断敏感后缀访问
    location ~* \.(env|git|bak|sql)$ {
        return 403;
    }
}

软链接至启用目录并验证语法后重载:

sudo ln -sf /etc/nginx/sites-available/main.site /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

请求解析链路与静态结构规划

当客户端发起请求时,Web服务器会经历DNS解析、端口监听匹配、虚拟主机路由,最终在配置的根目录下查找相对路径对应的物理文件。若匹配到静态资源(如.css、.png)则直接输出;若为动态脚本,则交由后端解释器或FastCGI进程处理。

推荐的应用目录树

现代架构通常采用单一入口设计,将公开资源与核心逻辑物理隔离:

/srv/web/app-core
├── public/           # 唯一对外暴露目录
│   ├── index.php     # 请求统一入口
│   ├── uploads/      # 用户文件存储
│   └── static/       # JS/CSS/图片资源
├── src/              # 业务逻辑层
│   ├── routes/
│   ├── handlers/
│   └── middleware/
├── config/           # 运行时参数
│   └── services.yaml
├── storage/          # 缓存与日志
│   ├── framework/
│   └── runtime/
└── .env.production   # 环境变量(严禁置于public内)

路由映射对照表

浏览器地址物理文件路径处理机制
/public/index.php前端控制器接管
/api/userspublic/index.php内部路由分发
/static/app.jspublic/static/app.js静态文件直出

访问控制与纵深防御

根目录安全不仅依赖防火墙,更需在Web服务器层配置严格的访问策略。

Apache 规则强化

在根目录或public目录下放置.htaccess可实施细粒度控制:

# 关闭目录浏览
Options -Indexes

# 启用重写引擎
RewriteEngine On
# 伪静态处理:非真实文件/目录的请求转发至入口
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php [QSA,L]

# 拦截危险后缀
<FilesMatch "\.(git|htaccess|log|ini)$">
    Require all denied
</FilesMatch>

Nginx 对应策略

location / {
    try_files $uri $uri/ =404;
}

location ~* \.(git|htaccess|log|ini|bak)$ {
    deny all;
    access_log off;
    log_not_found off;
}

权限模型与安全加固

Linux文件系统权限是防止越权读写的第一道防线。建议采用最小权限原则(Least Privilege)。

精细化的用户组管理

# 建立运维专属组
sudo groupadd deployers
sudo usermod -aG deployers www
sudo usermod -aG deployers $USER

# 调整属主与属组
sudo chown -R $USER:deployers /srv/web/app-core
sudo find /srv/web/app-core -type d -exec chmod 775 {} \;
sudo find /srv/web/app-core -type f -exec chmod 664 {} \;

# 上传目录特殊处理(允许Web写入)
sudo chown -R www:www /srv/web/app-core/public/uploads
sudo chmod -R 775 /srv/web/app-core/public/uploads

响应头与协议限制

通过安全头部防御XSS、点击劫持及MIME嗅探攻击。Apache配置示例:

<Directory "/srv/web/app-core/public">
    Options -Indexes -ExecCGI
    AllowOverride None
    Require all granted

    # 仅允许标准请求方法
    <LimitExcept GET POST HEAD>
        Require all denied
    </LimitExcept>

    # 安全响应头注入
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "DENY"
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always unset Server
</Directory>

Nginx等效实现:

server {
    # ... 基础配置 ...
    if ($request_method !~ ^(GET|HEAD|POST)$) {
        return 405;
    }

    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "DENY" always;
    add_header Referrer-Policy "no-referrer" always;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'" always;
    server_tokens off;
}

自动化巡检与日志审计

定期执行脚本可快速识别权限异常或非法注入文件。以下为Bash巡检示例:

#!/usr/bin/env bash
TARGET_DIR="/srv/web/app-core"

echo ">>> 扫描目录权限异常..."
find "$TARGET_DIR" -type d ! -perm 775 -ls

echo ">>> 扫描文件权限异常..."
find "$TARGET_DIR" -type f ! -perm 664 -ls

echo ">>> 检索非预期脚本文件..."
find "$TARGET_DIR" -name "*.php" -o -name "*.sh" | grep -vE "(public|src)" | grep -v "vendor"

echo ">>> 列出近三日修改项..."
find "$TARGET_DIR" -type f -mtime -3 -exec ls -lh {} \;

日志分析应重点关注高频404状态码、路径穿越尝试(如../)、异常大体积POST请求以及非业务时段的访问峰值。结合logrotate实现日志分卷归档,并保留60至90天的历史数据以供溯源。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。