【问题标题】:HTTP redirected to HTTPS in nginx.confHTTP 重定向到 nginx.conf 中的 HTTPS
【发布时间】:2020-09-29 10:02:30
【问题描述】:

我有一个 nginx.conf,我在 localhost 上运行一个应用程序。我需要将应用程序从 HTTP 重定向到 HTTPS。在nginx.conf,我有如下配置:


http {
  error_log /etc/nginx/error/error.log warn; #./nginx/error.log warn;
  client_max_body_size 20m;

  proxy_cache_path /etc/nginx/cache keys_zone=one:500m max_size=1000m;

  server {
    listen 80;
    server_name localhost; 
    return 301 https://$server_name$request_uri;
     }

  server {
    listen 443 ssl http2;

    server_name localhost; 

    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    ssl_certificate /etc/nginx/ssl.crt;
    ssl_certificate_key /etc/nginx/ssl.key;

    ssl_protocols TLSv1.2;
    ssl_ciphers EECDH+AESGCM:EDH+AESGCM:EECDH:EDH:!MD5:!RC4:!LOW:!MEDIUM:!CAMELLIA:!ECDSA:!DES:!DSS:!3DES:!NULL;
    ssl_prefer_server_ciphers on;

    keepalive_timeout 70;

    location / {
      proxy_pass http://localhost:80; 
      proxy_ssl_certificate /etc/nginx/ssl.crt; 
      proxy_ssl_certificate_key /etc/nginx/ssl.key; 
      proxy_ssl_verify    off;
      allow all;
      proxy_redirect          off;
      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-Host $server_name;
      proxy_set_header   X-Forwarded-Proto https;
      #access_log      /var/log/nginx/access.log;
      #error_log       /var/log/nginx/error.log;
      client_max_body_size    0;
      client_body_buffer_size 128k;
      proxy_connect_timeout   1200s;
      proxy_send_timeout      1200s;
      proxy_read_timeout      1200s;
      proxy_buffers           32 4k;
    }

    }

和 docker-compose.yml 如下:-

version: '2'
services:

  mysql:
    image: mysql:5.7.21
    restart: always
    environment:
    - MYSQL_ROOT_PASSWORD=admin
    - MYSQL_DATABASE=bookstack
    - MYSQL_USER=bookstack
    - MYSQL_PASSWORD=admin
    volumes:
    - ./mysql:/var/lib/mysql
    networks:
    - bookstack-bridge


  bookstack:
    
    image: solidnerd/bookstack:latest
    container_name: bookstack
    restart: always
    depends_on:
    - mysql
    environment:
 
    - APP_URL=http://localhost:8080

    volumes:
    - ./uploads:/var/www/bookstack/public/uploads
    - ./storage-uploads:/var/www/bookstack/public/storage
    ports:
    - 8080:8080
    networks:
    - bookstack-bridge

  nginx:
    image: nginx:latest
    container_name: bookstack-nginx
    restart: always


在 docker-compose.yml 中,我确实有 APP_URL=http://localhost:8080 env 变量。

有人知道,从 HTTP 重定向到 HTTPS 需要更改哪些内容?

提前致谢。

【问题讨论】:

    标签: docker nginx docker-compose devops


    【解决方案1】:

    我定制了你的 docker-compose-yml。

    1. 您的 docker-compose.yml 不适用于 https,因为某些部分错误或缺失。

    2. 要使用 HTTPS,您必须使用 Openssl 创建证书。这些必须在容器的 /etc/nginx/certs 文件夹中。

    3. 当您将证书放入您必须设置的文件夹中 - VIRTUAL_PORT=8080 到 443 并将 APP_URL 从 http 更改为 https

    4. 当您启动服务并将其分配给网络“web”时,nginx 会自动看到新服务已注册。它会自动映射到映像中指定的端口。音量命令“/tmp/docker.sock:ro”会发生这种情况。 ":ro" 代表只读

    5. 如果您将服务分配给“内部”网络,则无法从外部访问它,Nginx 会忽略它。参见“mysql”服务。

    6. 使用“depends_on:”我说所有服务都必须在 bookstack 启动之前启动。这个很重要!首先是 Nginx,然后是 MySql,最后是 bookstack。

    7. 我更喜欢在自己的本地域上使用 VIRTUAL_HOST。您也可以在那里使用 localhost,唯一重要的是操作系统中的“主机”文件指向您的外部 Docker IP。示例:“192.168.5.121 bookstack.local”

    8. 我的小费!我会将服务“nginx--proxy”存储在单独的 docker-compose 文件中。然后您可以轻松地向 nginx 注册更多服务。

    祝你好运,如果你只想在本地使用 Bookstack,现在 HTTPS 可能不是那么紧迫。否则搜索“为 Nginx 本地创建证书”

    在开始创建网络“web”之前:

    docker network create web
    
    version: '2.4'
    
    services:
    
      mysql:
        image: mysql:5.7.21
        container_name: bookstack-mysql
        restart: unless-stopped
        networks:
          - "internal"
        healthcheck:
          test: "exit 0"
        environment:
          - MYSQL_ROOT_PASSWORD=admin
          - MYSQL_DATABASE=bookstack
          - MYSQL_USER=bookstack
          - MYSQL_PASSWORD=admin
        volumes:
          - ./docker/data/mysql:/var/lib/mysql
    
      bookstack:
        image: solidnerd/bookstack:0.29.3
        container_name: bookstack
        restart: unless-stopped
        networks:
          - "web"
          - "internal"
        depends_on:
          nginx--proxy:
            condition: service_started
          mysql:
            condition: service_healthy
        environment:
          - VIRTUAL_HOST=bookstack.local
          - VIRTUAL_PORT=8080
          - DB_HOST=mysql:3306
          - DB_DATABASE=bookstack
          - DB_USERNAME=bookstack
          - DB_PASSWORD=admin
          - APP_URL=http://bookstack.local
        volumes:
          - ./docker/data/uploads:/var/www/bookstack/public/uploads
          - ./docker/data/storage-uploads:/var/www/bookstack/storage/uploads
    
      nginx--proxy:
        image: jwilder/nginx-proxy:latest
        container_name: nginx--proxy
        restart: always
        environment:
          DEFAULT_HOST: default.vhost
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - ./docker/data/certs:/etc/nginx/certs
          - /var/run/docker.sock:/tmp/docker.sock:ro
        networks:
          - "web"
          - "internal"
    
    networks:
      web:
        external: true
      internal:
        external: false
    

    【讨论】:

    • 但我不想使用符号链接。需要使用服务器块。您能否告诉我需要更改哪些配置?
    • 你能告诉我你的 nginx 错误日志说什么吗?并设置proxy_passlocalhost:80;到 proxy_pass 127.0.0.1:8080;如果你确定你的容器端口是 8080?
    • 我看不到容器内的错误日志。它卡住了。
    • 这是错误日志:- 2020/09/28 10:08:25 [警告] 29#29: *7 上游服务器在连接到上游时暂时禁用,客户端:192.168.16.1,服务器:本地主机,请求:“GET / HTTP/2.0”,上游:“127.0.0.1:8080”,主机:“本地主机”
    • 很抱歉,您可以将 proxy_pass 设置为容器中的 IP 或容器名称吗?请测试一下。
    【解决方案2】:

    解决方案对我有用:-

    在docker-compose.yml中,在nginx服务部分添加networks标签-

        networks:
        - bookstack-bridge
    
    

    并且在 nginx.conf 中添加了 proxy_pass as-

    proxy_pass http://bookstack:8080;
    

    谢谢你们的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-06
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多