4 Haziran 2018

Docker’da PHP dosya gönderme (file upload) limitini artırmak!

ile hasan

Saat sabahın 06.20’sinde henüz uyumamış biri olarak elimden geldiğince kısa yazıp işime döneceğim. Çözümü bulup derlemem benim yarım saatimi aldı, sizin hiç almasın inşallah.

Dosya gönderme limiti 2 yerden ayarlanmalı: Birisi web server (benim için nginx) diğeri de PHP ayarlarında. Benim Docker konfigürasyonumu bir arkadaşım yaptığı için konuya çok fazla hakim değilim. Sadece anladığım ve müdahale edebildiğim kısımları belirteyim. 

Proje klasörümde docker-compose.yml isimli bir yapılandırma dosyası mevcut. Burada kullanacağım containerlar (inşallah doğru kelimedir) mevcut. Benim projemde mysql, composer, node, nginx, redis ve son olarak app isimli servisler tanımlı. Nginx’in tanımında configürasyon dosyası ayrıca belirtilmiş ve proje ana klasörümde de o dosya mevcut. 

  nginx:
    image: nginx:latest
    ports:
      - 80:80
      - 443:443
    restart: always
    volumes:
      - ./project:/project
      - ./site.conf:/etc/nginx/conf.d/site.conf

Dolayısıyla nginx ayarlarını doğrudan bu dosyayı güncelleyerek yapabiliyorum. Ben de dosyayı açıp server bölümüne şu satırı ekledim.

client_max_body_size 64M;

Sıra geldi PHP kısmına.. PHP kısmı docker-compose dosyamda şu şekilde ayarlanmıştı:

  app:
    build:
      context: .
      dockerfile: app.dockerfile
    expose:
      - 9000
    volumes:
      - ./project:/project
    working_dir: /project
    restart: always
    links:
      - mysql
      - nginx
      - node

Aslında çözüm hemen sırıtıyor. Yukarıda nginx örneğinde olduğu gibi bu kısımda da volumes bölümüne php.ini dosyası ekleyebiliriz. Fakat bütün php.ini’yi eklemekten daha kibar bir yol varmış. Bunu bilmiyordum. Sadece güncellemek istediğimiz ayarları yazdığımız bir ini dosyası oluşturup bunu php’nin görebileceği ilgili alana koymak mümkünmüş. 18 yıllık PHP’ci olarak bunu bilmiyordum. Kullandığınız image’a bağlı olarak bu dosyanın yeri değişik olabilir. En sağlam yöntem olarak basit bir şekilde phpinfo() çıktısı alarak bu yolu öğrenebilirsiniz. 

Benim kullandığımı image için konuşursak /etc/php/7.2/fpm/conf.d klasörüne herhangi bir .ini file koyduğumda php yüklenirken bu dosya da dikkate alınacakmış meğer. Hemen öyle yaptım ve uploads.ini dosyası oluşturup projemin ana klasörüne yerleştirdim. İçerisine şunları ekledim.

file_uploads = On
memory_limit = 64M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 600

Artık bu dosyaya elzem pek çok konfigürasyonu ekleyebilirim. app isimli container’imin bu dosyayı görebilmesi için docker-compose.yml dosyasında app bölümünü nginx bölümüne benzer şekilde güncelledim. Son hali şöyle oldu:

  app:
    build:
      context: .
      dockerfile: app.dockerfile
    expose:
      - 9000
    volumes:
      - ./project:/project
      - ./project/uploads.ini:/etc/php/7.2/fpm/conf.d/uploads.ini
    working_dir: /project
    restart: always
    links:
      - mysql
      - nginx
      - node

Koyu olarak belirttiğim satırdan anlaşıldığı üzere proje ana klasörümdeki uploads.ini dosyasını container kendi içerisinde /etc/php/7.2/fpm/conf.d/uploads.ini olarak görecek.

Geriye containerları yeniden ayağa kaldırmak kalıyor. Bunu ben şu şekilde yapıyorum. Daha kısa bir yolu varsa lütfen bana yazın.

Önce mevcut containerleri stop ediyorum ya da öyle sanıyorum.

docker stop $(docker ps -a -q)

Sonra klasik docker-compose’umu çalıştırıyorum.

docker-compose up -d

Hadi geçmiş olsun.