Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

FireBlade's avatar

Multiple HTTPS Laravel Apps On Docker

Trying to setup NGINX reverse proxy on my server to connect to a Laravel app on Docker. The default NGINX server block is still untouched. I have added and enabled this server block:

server {

    server_name example.com www.example.com;

    listen [::]:443 ssl http2 ipv6only=on; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    #include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    add_header Strict-Transport-Security "max-age=15768000" always;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    server_tokens off;
    ssl_buffer_size 8k;
    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    ssl_ecdh_curve secp384r1;
    ssl_session_tickets off;
    charset utf-8;

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8;
    location / {
        proxy_pass http://localhost:8080;
        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;
    }
}
server {
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    client_max_body_size 8M;
    if ($host = www.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot



    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    location ~ /\.(?!well-known).* {
        deny all;
    }
    return 404; # managed by Certbot
}

My Laravel .env file has this configuration:

APP_URL=http://localhost:8080

My docker-compose.yml file looks like this:


version: "3.7"
services:
  app:
    build:
      args:
        user: sammy
        uid: 1000
      context: ./
      dockerfile: Dockerfile
    image: laraapp
    container_name: laraapp-app
    restart: unless-stopped
    working_dir: /var/www/html/
    volumes:
      - web-root:/var/www/html
    networks:
    - laranet
  db:
    image: mysql/mysql-server:8.0
    container_name: laraapp-db
    restart: unless-stopped
    tty: true
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_USER: ${DB_USERNAME}
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - ./mysql:/etc/mysql/conf.d/
      - mysqldata:/var/lib/mysql
    networks:
      - laranet

  nginx:
    image: nginx:1.21-alpine
    container_name: laraapp-nginx
    tty: true
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - web-root:/var/www/html
      - ./nginx:/etc/nginx/conf.d/
    depends_on:
      - app
    networks:
    - laranet
networks:
  laranet:
    driver: bridge

# Volumes
volumes:

  mysqldata:
  web-root:
    driver: local
    driver_opts:
      type: none
      device: /home/sammy/laraapp/src/
      o: bind


When I access the laravel app from the browser, the padlock icon on the browser bar indicates that parts of my website are not secure, especially images. How do I make my Docker app available on HTTPS ?

0 likes
1 reply
FireBlade's avatar
FireBlade
OP
Best Answer
Level 2

SOLVED !! Copy the domains ( example.com )SSL certs from host to your /etc/nginx folder inside container:

volumes:
      - web-root:/var/www/html
      - /etc/letsencrypt/live/example.com/fullchain.pem:/etc/nginx/fullchain.pem
      - /etc/letsencrypt/live/example.com/privkey.pem:/etc/nginx/privkey.pem
      - /etc/letsencrypt/ssl-dhparams.pem:/etc/nginx/ssl-dhparams.pem
      - ./nginx:/etc/nginx/conf.d/

Then load those files in the NGINX HTTPS server block


ssl_certificate /etc/nginx/fullchain.pem;
ssl_certificate_key /etc/nginx/privkey.pem;
ssl_buffer_size 8k;
ssl_dhparam /etc/nginx/ssl-dhparams.pem;

1 like

Please or to participate in this conversation.