Docker’da PHP dosya gönderme (file upload) limitini artırmak!
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.