news 2026/2/2 22:14:19

宝塔面板中Nginx配置SSL证书实现HTTPS访问完整指南(包含解决证书不匹配/跨域等常见问题)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
宝塔面板中Nginx配置SSL证书实现HTTPS访问完整指南(包含解决证书不匹配/跨域等常见问题)

在HTTPS成为网站标配的今天,通过宝塔面板配置Nginx SSL证书看似简单,但实际操作中很容易遇到证书不匹配、混合内容拦截、跨域请求失败等问题。本文结合真实项目实战经验,从准备工作到核心配置,再到常见问题排查,完整讲解宝塔中Nginx SSL的配置流程,帮你避开所有坑点,实现网站HTTPS平稳上线。

一、前置准备:确认3个核心条件

配置前先确保以下条件满足,避免后续无效操作:

  • 宝塔面板已正常安装:确保宝塔面板版本为最新(避免旧版本功能缺失),且Nginx服务已启动(面板->软件商店->Nginx->状态,显示“已运行”)。

  • 域名已完成解析:将需要配置HTTPS的域名(如本文案例中的readinwar.baidu.com)解析到服务器IP,解析类型为A记录,且解析已生效(可通过ping域名验证)。

  • SSL证书已获取:推荐使用免费的泛域名证书(如Let’s Encrypt),或从阿里云、腾讯云等服务商申请。证书文件需包含2个核心文件:公钥(cert.pem)和私钥(privkey.key)。

二、核心步骤:宝塔+Nginx SSL完整配置

本章节按“上传证书-配置Nginx-验证生效”的顺序操作,所有配置均基于实战优化,直接适配前端调用后端接口的场景。

步骤1:上传SSL证书到服务器

为了避免证书路径权限问题,推荐将证书上传到宝塔Nginx的官方默认目录:

  1. 登录宝塔面板,点击左侧「文件」,进入路径/www/server/nginx/,新建文件夹「ssl」(若已存在则跳过)。

  2. 进入「ssl」文件夹,点击「上传」,将本地的cert.pem(公钥)和privkey.key(私钥)上传到该目录。

  3. 选中上传的2个证书文件,右键「权限」,设置所有者为www、权限为644(确保Nginx能正常读取)。

步骤2:修改Nginx配置文件(核心关键)

宝塔中Nginx主配置文件路径为/www/server/nginx/conf/nginx.conf,我们需要修改该文件实现HTTPS监听、80跳转443、接口代理及跨域配置。

操作步骤:

  1. 面板左侧「软件商店」->找到「Nginx」->点击「设置」->「配置修改」,打开nginx.conf文件。

  2. 替换为以下优化后的配置(适配多域名、接口代理、跨域场景,关键部分已标注注释):

worker_processes auto; error_log /www/wwwlogs/nginx_error.log crit; pid /www/server/nginx/logs/nginx.pid; worker_rlimit_nofile 51200; stream { log_format tcp_format '$time_local|$remote_addr|$protocol|$status|$bytes_sent|$bytes_received|$session_time|$upstream_addr|$upstream_bytes_sent|$upstream_bytes_received|$upstream_connect_time'; access_log /www/wwwlogs/tcp-access.log tcp_format; error_log /www/wwwlogs/tcp-error.log; include /www/server/panel/vhost/nginx/tcp/*.conf; } events { use epoll; worker_connections 51200; multi_accept on; } http { include mime.types; include proxy.conf; default_type application/octet-stream; server_names_hash_bucket_size 512; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 50m; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 5; gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/json image/jpeg image/gif image/png font/ttf font/otf image/svg+xml application/xml+rss text/x-js; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE [1-6]\."; limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; server_tokens off; access_log off; # phpmyadmin默认配置(无需修改) server { listen 888; server_name phpmyadmin; index index.html index.htm index.php; root /www/server/phpmyadmin; location ~ /tmp/ { return 403; } allow 127.0.0.1; allow ::1; deny all; include enable-php.conf; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /\. { deny all; } access_log /www/wwwlogs/access.log; } # 关键:80端口强制跳转443(HTTP转HTTPS) server { listen 80; # 填写你的所有域名,多个域名用空格分隔 server_name baidu.com www.baidu.com; # 跳转至HTTPS,保留原请求路径 return 301 https://baidu.com$request_uri; } # 主域名HTTPS配置(按需调整) server { listen 443 ssl http2; server_name baidu.com # 证书路径(已上传到官方目录) ssl_certificate /www/server/nginx/ssl/cert.pem; ssl_certificate_key /www/server/nginx/ssl/privkey.key; # SSL优化配置(固定写法,无需修改) ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_session_tickets off; ssl_buffer_size 4k; # 前端静态资源路径(填写你的项目路径) location / { root /www/ydq; index index.html; try_files $uri $uri/ /index.html; } } # 核心:业务域名HTTPS配置(含接口代理+跨域解决) server{ listen 443 ssl http2; server_name baidu.com; # 证书路径(与主域名一致) ssl_certificate /www/server/nginx/ssl/cert.pem; ssl_certificate_key /www/server/nginx/ssl/privkey.key; # SSL优化配置(固定写法) ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_session_tickets off; ssl_buffer_size 4k; # 前端业务项目路径 location / { root /www/ydq/APP/web; index index.html; try_files $uri $uri/ /index.html; } # 本地接口代理(转发至127.0.0.1:48080) location /ydq { # 跨域解决核心配置(必加) add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; # 预检请求直接放行(避免跨域预检失败) if ($request_method = 'OPTIONS') { return 204; } # 代理配置(转发至后端接口) proxy_pass http://127.0.0.1:48080; 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; # 告诉后端当前是HTTPS协议 proxy_set_header REMOTE-HOST $remote_addr; proxy_http_version 1.1; proxy_set_header Connection ""; } # 远程接口代理(如验证码接口) location /admin-api/ { # 跨域配置(必加) add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; if ($request_method = 'OPTIONS') { return 204; } # 代理配置 proxy_pass http://100.100.100.100:48080/admin-api/; 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_set_header REMOTE-HOST $remote_addr; proxy_http_version 1.1; proxy_set_header Connection ""; } # 业务接口代理(app-api) location /app-api/ { # 跨域配置(必加) add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; if ($request_method = 'OPTIONS') { return 204; } # 代理配置 proxy_pass http://100.100.100.100:48080/app-api/; 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_set_header REMOTE-HOST $remote_addr; proxy_http_version 1.1; proxy_set_header Connection ""; } } # 管理后台端口配置(8998端口,按需调整) server{ listen 8998; location / { root /www/ydq/admin/dist; index index.html index.htm; try_files $uri $uri/ /index.html; } # 管理后台接口代理(同上述配置) location /admin-api/ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; if ($request_method = 'OPTIONS') { return 204; } proxy_pass http://100.100.100.100:48080/admin-api/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Connection ""; } location /app-api/ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; if ($request_method = 'OPTIONS') { return 204; } proxy_pass http://100.100.100.100:48080/app-api/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Connection ""; } } include /www/server/panel/vhost/nginx/*.conf;

配置文件修改说明:

  • 替换server_name后的域名为你的实际域名;

  • 修改root后的路径为你的前端项目实际路径(如/www/ydq/APP/web);

  • 调整proxy_pass后的后端接口地址为你的实际接口地址(如本地127.0.0.1:48080或远程IP:端口)。

步骤3:检查配置并重启Nginx

配置修改完成后,必须检查语法正确性并重启Nginx才能生效:

  1. 面板操作:Nginx设置页面点击「配置检查」,若提示“语法正确”则继续;若报错,根据提示修正配置(常见错误为路径写错、括号不匹配)。

  2. 点击「重启」Nginx服务,等待重启完成(面板提示“重启成功”)。

  3. (可选)SSH命令验证:登录服务器执行以下命令,确保配置无错且服务正常:
    `# 检查Nginx配置语法
    /www/server/nginx/sbin/nginx -t

平滑重启Nginx(不中断业务)

/www/server/nginx/sbin/nginx -s reload`

三、前端配合配置(避免混合内容拦截)

配置完Nginx后,前端需调整接口请求地址,避免浏览器“混合内容拦截”(HTTPS页面禁止请求HTTP接口):

错误写法(会被拦截):

// 错误:硬编码HTTP接口地址constbaseURL="http://100.100.100.100:48080";axios.get(baseURL+"/admin-api/system/captcha/get");

正确写法(推荐相对路径,自动继承HTTPS协议):

// 正确:相对路径(零改动适配HTTPS)constbaseURL="https://baidu.com";// 或写为 "/"axios.get(baseURL+"/admin-api/system/captcha/get");

效果:请求会自动变为https://baidu.com/admin-api/system/captcha/get,与页面同域同协议,无拦截风险。

四、常见问题排查(实战踩坑总结)

配置过程中若遇到问题,优先按以下场景排查,覆盖99%的常见错误:

问题1:ERR_CERT_COMMON_NAME_INVALID(证书域名不匹配)

【报错原因】:访问的域名与SSL证书绑定的域名不匹配(如泛域名证书*.baidu.com不支持三级域名www.readinwar.baidu.com)。

【解决方案】:

  • 放弃三级域名(如www.readinwar.baidu.cn),使用二级域名(readinwar.baidu.cn),确保与泛域名证书匹配;

  • 若必须使用三级域名,重新申请支持多级泛域名的证书(如*.readinwar.baidu.com)。

问题2:Mixed Content(混合内容拦截)

【报错原因】:HTTPS页面请求了HTTP接口,浏览器安全策略拦截。

【解决方案】:

  • 前端接口地址改为相对路径(如上述前端配置);

  • 确保Nginx已配置80跳转443,避免用户访问HTTP页面。

问题3:CORS请求未能成功(跨域)

【报错原因】:Nginx代理的后端接口未允许跨域,后端拒绝返回数据。

【解决方案】:在Nginx的接口代理location块中添加跨域配置(已包含在上述核心配置中),关键代码:

add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; if ($request_method = 'OPTIONS') { return 204; }

问题4:502 Bad Gateway(网关错误)

【报错原因】:Nginx无法连接后端接口服务(如后端服务未启动、端口被防火墙拦截)。

【解决方案】:

  • 检查后端服务是否启动(如执行curl http://106.54.216.92:48080验证);

  • 放行服务器防火墙/云安全组的后端端口(如48080)。

五、最终验证:确认HTTPS配置生效

完成所有配置后,通过以下步骤验证效果:

  1. 浏览器访问域名(如https://readinwar.baidu.com),地址栏显示「绿色安全锁头」,说明证书生效;

  2. 打开F12控制台->Network,发起接口请求(如验证码接口),查看:

    • 请求地址为HTTPS协议;

    • 状态码为200,返回正常数据;

    • 无任何证书、混合内容、跨域报错。

六、总结

通过宝塔配置Nginx SSL的核心要点的是:确保证书路径与域名匹配、配置80强制跳转443、接口代理补全请求头与跨域配置、前端使用相对路径避免混合内容拦截。本文的配置方案已覆盖所有实战坑点,直接复用即可实现网站HTTPS平稳上线,同时支持前端正常调用本地或远程后端接口。

如果配置过程中仍有问题,可通过宝塔日志(/www/wwwlogs/nginx_error.log)或浏览器控制台排查具体错误,针对性解决即可。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/30 10:41:11

poi-tl Java模板引擎终极指南:从零基础到实战高手

poi-tl Java模板引擎终极指南:从零基础到实战高手 【免费下载链接】poi-tl Generate awesome word(docx) with template 项目地址: https://gitcode.com/gh_mirrors/po/poi-tl poi-tl是一个基于Apache POI构建的Java模板引擎,专门用于高效生成Wor…

作者头像 李华
网站建设 2026/1/29 20:16:05

Flow Launcher终极效率指南:重新定义Windows操作体验

Flow Launcher终极效率指南:重新定义Windows操作体验 【免费下载链接】Flow.Launcher :mag: Quick file search & app launcher for Windows with community-made plugins 项目地址: https://gitcode.com/GitHub_Trending/fl/Flow.Launcher 还在被Window…

作者头像 李华
网站建设 2026/1/29 17:26:37

快速理解AD导出Gerber与CAM光绘数据对应关系

一次搞懂AD导出Gerber与CAM光绘的底层映射逻辑你有没有遇到过这样的情况:在Altium Designer里辛辛苦苦画完板子,信心满满地导出Gerber发给工厂,结果三天后收到回复——“阻焊开窗错了”、“丝印反了”、“钻孔对不上”?更离谱的是…

作者头像 李华
网站建设 2026/1/30 3:50:22

Page Assist浏览器扩展:本地AI助手重塑网页交互体验

Page Assist浏览器扩展:本地AI助手重塑网页交互体验 【免费下载链接】page-assist Use your locally running AI models to assist you in your web browsing 项目地址: https://gitcode.com/GitHub_Trending/pa/page-assist 在信息爆炸的数字时代&#xff0…

作者头像 李华
网站建设 2026/2/1 8:26:27

实战指南:用ZLUDA让Intel显卡变身CUDA计算利器

实战指南:用ZLUDA让Intel显卡变身CUDA计算利器 【免费下载链接】ZLUDA CUDA on Intel GPUs 项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA 你是否曾经遇到过这样的场景:手头有一台配备Intel显卡的电脑,想要运行基于CUDA的A…

作者头像 李华
网站建设 2026/1/29 17:30:58

轻量级TTS如何改变音乐学习?Supertonic深度体验

轻量级TTS如何改变音乐学习?Supertonic深度体验 1. 引言:当TTS遇上乐理学习 在数字音乐创作与学习的浪潮中,技术工具正以前所未有的方式重塑我们的认知路径。对于初学者而言,乐理知识的学习往往伴随着大量抽象概念——音阶、调式…

作者头像 李华