You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx启用SSL服务器报400 Bad Request错误求助

问题排查与解决方案

错误核心原因

你遇到的400 Bad Request: The plain HTTP request was sent to HTTPS port错误,本质是用HTTP协议访问了配置为HTTPS的443端口——你的Nginx配置中443端口仅监听HTTPS请求,当HTTP请求抵达该端口时,Nginx无法解析,直接返回错误。你尝试添加ssl off的操作完全错误,这个指令会让443端口禁用SSL、运行HTTP服务,和你启用SSL的需求完全相悖,所以毫无效果。

配置文件与Dockerfile问题排查

Nginx配置问题

现有配置仅定义了443端口的HTTPS服务,缺少对HTTP请求的处理逻辑,没有适配用户可能的错误访问方式:

server {
    listen 443 ssl;
    
    root /usr/share/nginx/html;
    index index.html index.htm;

    server_name example;

    ssl_protocols           TLSv1.2 TLSv1.3;
    ssl_certificate         /etc/nginx/ssl/example.crt;
    ssl_certificate_key     /etc/nginx/ssl/example.key;

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

Dockerfile潜在优化点

  • 安装命令可合并,减少镜像构建层数;
  • 未暴露80端口,若要支持HTTP访问或重定向,需补充配置。

具体解决方案

方案1:规范访问协议

直接使用https://你的服务器IP/域名:443访问,禁止用http://前缀访问443端口。

方案2:添加HTTP端口监听并自动重定向到HTTPS

修改Nginx配置,新增处理80端口的server块,将所有HTTP请求重定向到HTTPS:

# 处理HTTP请求,自动跳转到HTTPS
server {
    listen 80;
    server_name example;
    return 301 https://$server_name$request_uri;
}

# 原HTTPS服务配置
server {
    listen 443 ssl;
    
    root /usr/share/nginx/html;
    index index.html index.htm;

    server_name example;

    ssl_protocols           TLSv1.2 TLSv1.3;
    ssl_certificate         /etc/nginx/ssl/example.crt;
    ssl_certificate_key     /etc/nginx/ssl/example.key;

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

同时修改Dockerfile,补充暴露80端口并优化安装命令:

FROM debian:buster

RUN apt-get -y update \
    && apt-get -y install nginx openssl \
    && rm -rf /var/lib/apt/lists/* \
    && mkdir /etc/nginx/ssl

RUN openssl req -x509 -newkey rsa:4096 -sha256 -days 365 -nodes \
        -keyout /etc/nginx/ssl/example.key \
        -out /etc/nginx/ssl/example.crt \
        -subj "/C=FR/ST=IDF/L=Paris/O=42/OU=42/CN=example/UID=example"

COPY conf/default /etc/nginx/sites-enabled/default

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

方案3:检查容器端口映射

如果启动容器时用了docker run -p 80:443 ...这类命令,会把主机的80端口(默认HTTP端口)映射到容器的443端口(HTTPS端口),导致访问主机80时发送HTTP请求到容器443端口触发错误。正确的端口映射命令应为:

docker run -p 80:80 -p 443:443 你的镜像名

内容的提问来源于stack exchange,提问作者user15047606

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:30:30