企业官网 Nginx 部署完整流程:HTTPS、301、静态缓存与日志配置

企业官网开发完成后,"页面能打开"并不等于部署完成。

真正上线时,至少还要处理:

  • 域名解析

  • Nginx Server 配置

  • HTTP 跳转 HTTPS

  • www / 非 www 统一

  • SSL 证书

  • 静态资源缓存

  • Gzip 压缩

  • 反向代理或 PHP-FPM

  • 访问日志与错误日志

  • 404 / 50x

  • 安全响应头

  • 配置检查与平滑重载

下面以一个典型企业官网为例,整理一套相对完整的 Nginx 部署流程。


一、先明确网站部署结构

一个常见企业官网的访问链路大致是:

复制代码
用户浏览器
    ↓
DNS
    ↓
80 / 443
    ↓
Nginx
    ↓
├── 静态文件 HTML / CSS / JS / 图片
├── PHP-FPM
└── Node.js / Java / API 服务
    ↓
数据库 / Redis / 对象存储

Nginx 在这里主要承担几个角色:

  1. Web Server

  2. HTTPS 入口

  3. 301 跳转

  4. 静态资源服务器

  5. 反向代理

  6. 缓存控制

  7. 日志记录

  8. 部分基础安全控制

企业官网部署是否稳定,Nginx 配置非常关键。


二、准备网站目录

假设域名为:

复制代码
www.example.com

网站目录:

复制代码
/www/wwwroot/www.example.com/

推荐结构:

复制代码
/www/wwwroot/www.example.com/
├── public
├── uploads
├── storage
├── logs
└── backup

如果是 ThinkPHP、Laravel 等框架,真正 Web Root 一般不要直接指向项目根目录,而应该指向:

复制代码
/public

例如:

复制代码
root /www/wwwroot/www.example.com/public;

这样可以避免:

复制代码
.env
composer.json
vendor
application
config

等敏感文件被直接访问。


三、先配置最基本的 HTTP 站点

最简单的 Nginx Server 可以这样写:

复制代码
server {
    listen 80;
    server_name example.com www.example.com;

    root /www/wwwroot/www.example.com/public;
    index index.html index.htm index.php;

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

先不要急着配置 HTTPS。

第一步应该确认:

复制代码
nginx -t

返回:

复制代码
syntax is ok
test is successful

然后重载:

复制代码
nginx -s reload

这时先通过 HTTP 测试网站是否正常。


四、统一域名:www 还是非 www?

企业官网建议只保留一个主域名。

例如统一使用:

复制代码
https://www.example.com

那么:

复制代码
http://example.com
http://www.example.com
https://example.com

最终全部应该跳转到:

复制代码
https://www.example.com

这不仅是用户体验问题,也关系到 SEO。

如果多个 URL 都可以访问相同页面,搜索引擎可能认为存在重复页面。


五、HTTP 统一 301 到 HTTPS

80 端口可以单独写一个 Server:

复制代码
server {
    listen 80;
    server_name example.com www.example.com;

    return 301 https://www.example.com$request_uri;
}

这里:

复制代码
$request_uri

非常重要。

例如用户访问:

复制代码
http://example.com/products?id=100

会跳转到:

复制代码
https://www.example.com/products?id=100

参数不会丢失。


六、HTTPS 主站配置

HTTPS 主站可以这样写:

复制代码
server {
    listen 443 ssl;
    server_name www.example.com;

    root /www/wwwroot/www.example.com/public;
    index index.html index.htm index.php;

    ssl_certificate     /etc/nginx/ssl/example.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;

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

证书通常包含:

复制代码
fullchain.pem
privkey.pem

修改配置后先检查:

复制代码
nginx -t

确认无误再:

复制代码
nginx -s reload

七、非 www HTTPS 也要跳转

仅仅处理 80 端口还不够。

如果用户访问:

复制代码
https://example.com

也应该跳转。

可以单独建立:

复制代码
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate     /etc/nginx/ssl/example.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;

    return 301 https://www.example.com$request_uri;
}

最终形成:

复制代码
http://example.com
        ↓
http://www.example.com
        ↓
https://example.com
        ↓
https://www.example.com

准确地说,前三种都直接跳向最后一个主域名。


八、PHP 网站如何连接 PHP-FPM

如果企业官网使用 PHP,可以加入:

复制代码
location ~ \.php$ {
    include fastcgi_params;

    fastcgi_pass unix:/run/php/php8.2-fpm.sock;

    fastcgi_index index.php;

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

不同服务器 PHP-FPM 地址可能不同,例如:

复制代码
/run/php/php8.2-fpm.sock

也可能是:

复制代码
127.0.0.1:9000

例如:

复制代码
fastcgi_pass 127.0.0.1:9000;

部署后如果出现:

复制代码
502 Bad Gateway

第一件事就是检查:

复制代码
systemctl status php8.2-fpm

以及:

复制代码
ls /run/php/

确认 PHP-FPM 是否运行、Socket 是否一致。


九、Node.js 网站如何反向代理

如果前端或后台是:

复制代码
Node.js
Next.js
Nuxt
NestJS

通常程序自己监听:

复制代码
127.0.0.1:3000

Nginx 再做代理:

复制代码
location / {
    proxy_pass http://127.0.0.1:3000;

    proxy_http_version 1.1;

    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;
}

链路变成:

复制代码
Browser
   ↓
HTTPS
   ↓
Nginx
   ↓
Node.js :3000

Node.js 不需要直接暴露公网 3000 端口。


十、静态资源缓存应该怎么配

企业官网的大部分流量实际上来自:

复制代码
图片
CSS
JS
字体
WebP
SVG

这些文件如果每次都重新请求,会浪费大量带宽。

可以配置:

复制代码
location ~* \.(jpg|jpeg|png|gif|webp|svg|ico)$ {
    expires 30d;
    add_header Cache-Control "public";
}

CSS / JS:

复制代码
location ~* \.(css|js)$ {
    expires 7d;
    add_header Cache-Control "public";
}

字体:

复制代码
location ~* \.(woff|woff2|ttf|otf)$ {
    expires 30d;
    add_header Cache-Control "public";
}

十一、为什么不能所有文件都缓存 30 天?

这是实际项目中经常踩的坑。

例如:

复制代码
location ~* \.(css|js)$ {
    expires 30d;
}

如果文件名一直是:

复制代码
main.css
app.js

更新后用户可能依旧读取旧缓存。

更好的做法是构建阶段加入 hash:

复制代码
main.a83f91.css
app.719bd3.js

内容发生变化以后,文件名也变化。

这时才适合:

复制代码
expires 365d;

例如:

复制代码
location ~* \.(css|js|jpg|jpeg|png|webp|svg|woff2)$ {
    expires 365d;
    add_header Cache-Control "public, immutable";
}

所以:

缓存时间不是越长越好,而是要配合静态资源版本管理。


十二、HTML 页面不要缓存太久

对于企业官网首页、新闻、产品页面,不建议简单配置:

复制代码
30d
365d

否则企业更新页面以后,部分用户可能迟迟看不到新内容。

例如 HTML 可以:

复制代码
location ~* \.html$ {
    expires -1;
    add_header Cache-Control "no-cache";
}

动态页面则主要由程序、FastCGI Cache 或 CDN 控制。


十三、开启 Gzip 压缩

文本资源开启 Gzip 后,一般能明显减少传输体积。

例如:

复制代码
gzip on;

gzip_comp_level 5;

gzip_min_length 1024;

gzip_types
    text/plain
    text/css
    application/json
    application/javascript
    application/xml
    image/svg+xml;

对于:

复制代码
HTML
CSS
JS
JSON
SVG

效果比较明显。

但对于已经压缩过的:

复制代码
JPEG
WebP
MP4
ZIP
PDF

通常没有必要再次压缩。


十四、限制敏感文件访问

企业官网经常会存在:

复制代码
.env
.git
.svn
.sql
.log

这些文件不应该被浏览器访问。

可以加入:

复制代码
location ~ /\.(?!well-known) {
    deny all;
}

再单独限制:

复制代码
location ~* \.(env|ini|log|sql|bak|conf)$ {
    deny all;
}

部署以后建议直接测试:

复制代码
https://www.example.com/.env
https://www.example.com/.git/config

正常应该无法访问。


十五、404 页面也需要处理

企业官网经常有产品删除、新闻下线、URL 调整等情况。

建议定义:

复制代码
error_page 404 /404.html;

例如:

复制代码
location = /404.html {
    internal;
}

更重要的是:

不存在的页面必须真正返回 HTTP 404。

不能访问一个错误 URL:

复制代码
/product/abc-does-not-exist

页面显示:

复制代码
页面不存在

但 HTTP Status 却是:

复制代码
200 OK

这种 Soft 404 对 SEO 不友好。

可以使用:

复制代码
curl -I https://www.example.com/abc-test-404

检查。

正常应该看到:

复制代码
HTTP/2 404

十六、配置访问日志和错误日志

企业网站上线以后,日志非常重要。

建议单独配置:

复制代码
access_log /var/log/nginx/example_access.log;
error_log  /var/log/nginx/example_error.log warn;

完整一点:

复制代码
server {

    listen 443 ssl;
    server_name www.example.com;

    access_log /var/log/nginx/example_access.log;
    error_log /var/log/nginx/example_error.log warn;

}

网站出现:

复制代码
404
403
500
502
504

时,日志往往是最快的排查入口。


十七、最常用的实时日志排查方法

查看访问日志:

复制代码
tail -f /var/log/nginx/example_access.log

查看错误日志:

复制代码
tail -f /var/log/nginx/example_error.log

查看最近 100 行:

复制代码
tail -n 100 /var/log/nginx/example_error.log

查 404:

复制代码
grep " 404 " /var/log/nginx/example_access.log

查 500:

复制代码
grep " 500 " /var/log/nginx/example_access.log

查某个 IP:

复制代码
grep "1.2.3.4" /var/log/nginx/example_access.log

企业官网被扫描、攻击或者突然出现异常流量时,这些命令都非常实用。


十八、建议自定义 Log Format

默认日志信息有时候不够。

可以增加:

复制代码
log_format main
    '$remote_addr - $remote_user [$time_local] '
    '"$request" $status $body_bytes_sent '
    '"$http_referer" '
    '"$http_user_agent" '
    '$request_time';

然后:

复制代码
access_log /var/log/nginx/example_access.log main;

其中:

复制代码
$request_time

尤其有价值。

例如日志:

复制代码
GET /products/100 200 2.835

说明整个请求耗时:

复制代码
2.835 秒

如果很多动态页面都是:

复制代码
2s
3s
5s

就不能只怪 CDN,可能需要继续检查:

复制代码
PHP
MySQL
接口
第三方 API

十九、建议增加几个基础安全响应头

可以加入:

复制代码
add_header X-Content-Type-Options "nosniff" always;

add_header X-Frame-Options "SAMEORIGIN" always;

add_header Referrer-Policy "strict-origin-when-cross-origin" always;

例如:

复制代码
server {

    listen 443 ssl;

    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

}

注意:

Content-Security-Policy 不建议直接照抄网上配置。

因为企业网站可能包含:

复制代码
Google Analytics
Google Maps
YouTube
在线客服
验证码
第三方字体
营销脚本

CSP 配错以后,很容易把正常资源也拦掉。

建议根据实际资源逐步配置。


二十、一个相对完整的 Nginx 示例

以 PHP 企业官网为例:

复制代码
server {
    listen 80;
    server_name example.com www.example.com;

    return 301 https://www.example.com$request_uri;
}


server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate     /etc/nginx/ssl/example.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;

    return 301 https://www.example.com$request_uri;
}


server {
    listen 443 ssl;
    server_name www.example.com;

    root /www/wwwroot/www.example.com/public;
    index index.php index.html;

    ssl_certificate     /etc/nginx/ssl/example.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;

    access_log /var/log/nginx/example_access.log;
    error_log  /var/log/nginx/example_error.log warn;

    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

    gzip on;
    gzip_comp_level 5;
    gzip_min_length 1024;

    gzip_types
        text/plain
        text/css
        application/json
        application/javascript
        application/xml
        image/svg+xml;


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


    location ~ \.php$ {
        include fastcgi_params;

        fastcgi_pass unix:/run/php/php8.2-fpm.sock;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }


    location ~* \.(jpg|jpeg|png|gif|webp|svg|ico|woff|woff2)$ {
        expires 30d;
        add_header Cache-Control "public";
    }


    location ~* \.(css|js)$ {
        expires 7d;
        add_header Cache-Control "public";
    }


    location ~ /\.(?!well-known) {
        deny all;
    }


    location ~* \.(env|ini|log|sql|bak|conf)$ {
        deny all;
    }


    error_page 404 /404.html;

    location = /404.html {
        internal;
    }
}

这只是一个基础模板。

真实项目还需要根据:

复制代码
PHP框架
Node.js
WordPress
ThinkPHP
Laravel
CDN
WAF
对象存储
多语言
后台路径
文件上传方式

继续调整。


二十一、修改 Nginx 后,不要直接 Restart

每次修改配置以后,第一步一定是:

复制代码
nginx -t

成功以后:

复制代码
nginx -s reload

或者:

复制代码
systemctl reload nginx

尽量不要动不动:

复制代码
systemctl restart nginx

reload 会让 Nginx 重新加载配置,同时尽量保持已有连接继续处理。

对于线上企业官网来说更加稳妥。


二十二、上线以后建议做一轮完整验证

网站正式发布后,我一般建议至少检查下面这些地址:

复制代码
http://example.com
http://www.example.com

https://example.com
https://www.example.com

最终应该只留下一个主地址,例如:

复制代码
https://www.example.com

然后继续验证:

复制代码
curl -I http://example.com

查看:

复制代码
301

再测试:

复制代码
curl -I https://www.example.com

查看:

复制代码
200

还要测试:

复制代码
404
HTTPS
静态缓存
响应时间
移动端
表单
后台
图片
下载文件

二十三、Nginx 配好了,为什么网站还是慢?

这是企业官网运维中非常常见的问题。

Nginx 只是整个链路的一部分。

网站慢还可能来自:

复制代码
DNS
CDN
服务器带宽
PHP
Node.js
MySQL
Redis
图片体积
第三方 JS
Google Fonts
海外 API
前端渲染

所以排查网站速度时,不能看到:

复制代码
Nginx 正常运行

就认为服务器端没有问题。

应该把完整链路拆开:

复制代码
DNS
 ↓
TCP / TLS
 ↓
Nginx
 ↓
Application
 ↓
Database
 ↓
HTML
 ↓
CSS / JS / Image

逐层定位。


二十四、部署不是最后一步,长期运维才是

企业官网上线以后,还需要长期关注:

复制代码
SSL 到期时间
服务器磁盘
CPU / 内存
数据库备份
访问日志
错误日志
异常流量
程序漏洞
PHP / Node 版本
CDN 缓存
网站速度

尤其制造业和外贸企业官网,网站往往要运行很多年。

所以一个完整的网站建设项目,不能只包含:

复制代码
设计 + 前端

更合理的是:

复制代码
策划
 ↓
设计
 ↓
前端
 ↓
后台
 ↓
数据库
 ↓
Nginx / Server
 ↓
HTTPS
 ↓
CDN
 ↓
备份
 ↓
监控
 ↓
长期维护

这才是企业官网真正完整的技术交付链路。


实际项目中的经验

杭州派迪科技在企业官网、制造业网站和外贸英文网站项目中,网站上线阶段通常不仅处理页面和程序,还会继续检查 Nginx、HTTPS、301、缓存、服务器环境、备份以及后续运维。

很多网站刚上线时看不出区别。

真正运行几个月甚至几年以后,服务器配置是否规范、日志是否完整、备份是否可靠、技术团队还能不能继续维护,才会逐渐体现出来。

所以企业官网部署完成的标准,不应该只是:

网站能打开。

而应该是:

网站能稳定、安全、可维护地长期运行。

这才是 Nginx 部署真正需要解决的问题。

相关推荐
2501_9151063215 小时前
安卓抓包软件2026,免证书抓包 应用层抓包 代理抓包全解析
网络协议·计算机网络·网络安全·ios·adb·https·udp
云运维笔记16 小时前
Zabbix 监控实战:Nginx、MySQL 与 Java 程序配置指南
mysql·nginx·zabbix
程序员黎剑19 小时前
Redis缓存击穿:热点Key过期打崩数据库的3种解决方案
数据库·redis·缓存
xixiaoyunya19 小时前
Redis 缓存一致性方案深度对比:从理论到工程落地
redis·spring·缓存
Zenova EdgeOS1 天前
工业边缘双写一致性:从缓存到多 DB 的工程实战
数据库·缓存·边缘计算·工业边缘
职场的momo1 天前
16384个槽怎么搬?解析Redis集群迁移与脑裂防御
数据库·redis·缓存
cfm_29141 天前
Redis大Key与热Key分析
redis·缓存
TheBestRucy1 天前
Python九阳神功之陆:数据库持久化与缓存·乾坤大挪移
数据库·python·缓存