2026/5/18 23:53:13
网站建设
项目流程
安陆建设局网站,网站建设维护与网页设计,国外服务器租赁,wordpress去掉尾巴在HTTPS成为网站标配的今天#xff0c;通过宝塔面板配置Nginx SSL证书看似简单#xff0c;但实际操作中很容易遇到证书不匹配、混合内容拦截、跨域请求失败等问题。本文结合真实项目实战经验#xff0c;从准备工作到核心配置#xff0c;再到常见问题排查#xff0c;完整讲…在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的官方默认目录登录宝塔面板点击左侧「文件」进入路径/www/server/nginx/新建文件夹「ssl」若已存在则跳过。进入「ssl」文件夹点击「上传」将本地的cert.pem公钥和privkey.key私钥上传到该目录。选中上传的2个证书文件右键「权限」设置所有者为www、权限为644确保Nginx能正常读取。步骤2修改Nginx配置文件核心关键宝塔中Nginx主配置文件路径为/www/server/nginx/conf/nginx.conf我们需要修改该文件实现HTTPS监听、80跳转443、接口代理及跨域配置。操作步骤面板左侧「软件商店」-找到「Nginx」-点击「设置」-「配置修改」打开nginx.conf文件。替换为以下优化后的配置适配多域名、接口代理、跨域场景关键部分已标注注释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/svgxml application/xmlrss 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 zoneperip:10m; limit_conn_zone $server_name zoneperserver: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端口强制跳转443HTTP转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才能生效面板操作Nginx设置页面点击「配置检查」若提示“语法正确”则继续若报错根据提示修正配置常见错误为路径写错、括号不匹配。点击「重启」Nginx服务等待重启完成面板提示“重启成功”。可选SSH命令验证登录服务器执行以下命令确保配置无错且服务正常# 检查Nginx配置语法/www/server/nginx/sbin/nginx -t平滑重启Nginx不中断业务/www/server/nginx/sbin/nginx -s reload三、前端配合配置避免混合内容拦截配置完Nginx后前端需调整接口请求地址避免浏览器“混合内容拦截”HTTPS页面禁止请求HTTP接口错误写法会被拦截// 错误硬编码HTTP接口地址constbaseURLhttp://100.100.100.100:48080;axios.get(baseURL/admin-api/system/captcha/get);正确写法推荐相对路径自动继承HTTPS协议// 正确相对路径零改动适配HTTPSconstbaseURLhttps://baidu.com;// 或写为 /axios.get(baseURL/admin-api/system/captcha/get);效果请求会自动变为https://baidu.com/admin-api/system/captcha/get与页面同域同协议无拦截风险。四、常见问题排查实战踩坑总结配置过程中若遇到问题优先按以下场景排查覆盖99%的常见错误问题1ERR_CERT_COMMON_NAME_INVALID证书域名不匹配【报错原因】访问的域名与SSL证书绑定的域名不匹配如泛域名证书*.baidu.com不支持三级域名www.readinwar.baidu.com。【解决方案】放弃三级域名如www.readinwar.baidu.cn使用二级域名readinwar.baidu.cn确保与泛域名证书匹配若必须使用三级域名重新申请支持多级泛域名的证书如*.readinwar.baidu.com。问题2Mixed Content混合内容拦截【报错原因】HTTPS页面请求了HTTP接口浏览器安全策略拦截。【解决方案】前端接口地址改为相对路径如上述前端配置确保Nginx已配置80跳转443避免用户访问HTTP页面。问题3CORS请求未能成功跨域【报错原因】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; }问题4502 Bad Gateway网关错误【报错原因】Nginx无法连接后端接口服务如后端服务未启动、端口被防火墙拦截。【解决方案】检查后端服务是否启动如执行curl http://106.54.216.92:48080验证放行服务器防火墙/云安全组的后端端口如48080。五、最终验证确认HTTPS配置生效完成所有配置后通过以下步骤验证效果浏览器访问域名如https://readinwar.baidu.com地址栏显示「绿色安全锁头」说明证书生效打开F12控制台-Network发起接口请求如验证码接口查看请求地址为HTTPS协议状态码为200返回正常数据无任何证书、混合内容、跨域报错。六、总结通过宝塔配置Nginx SSL的核心要点的是确保证书路径与域名匹配、配置80强制跳转443、接口代理补全请求头与跨域配置、前端使用相对路径避免混合内容拦截。本文的配置方案已覆盖所有实战坑点直接复用即可实现网站HTTPS平稳上线同时支持前端正常调用本地或远程后端接口。如果配置过程中仍有问题可通过宝塔日志/www/wwwlogs/nginx_error.log或浏览器控制台排查具体错误针对性解决即可。