Docker + nginx + php-fpm kullanarak statik içerik sunma


10

Docker kullanarak bir php webapp yapılandırmaya çalışıyorum. Fikir, uygulamayı php-fpmbağımsız bir kapsayıcıda kullanarak çalıştırmak ve nginx çalıştıracak başka bir kapsayıcıya sahip olmaktır. Bu kurulumun amacı, aynı makinede çalışan diğer web uygulamalarına yapılan istekleri proxy yapmak için aynı nginx kapsayıcısını kullanmaktır. Sorun, bu nginxistekleri devam tutmak gibi düzgün statik dosyaları (js, css, vb) işlemek için alamıyorum olmasıdır fpm.

Dosya sistemi şöyle görünür:

/
├── Makefile
├── config
│   └── webapp.config
└── webapp
    └── web
        ├── index.php
        └── static.js

Ben böyle bir şey Makefile(bununla ilgilenmiyorum docker-compose) kullanarak her şeyi çalıştırıyorum :

PWD:=$(shell pwd)
CONFIG:='/config'
WEBAPP:='/webapp'

run: | run-network run-webapp run-nginx

run-network:
    docker network create internal-net

run-webapp:
    docker run --rm \
    --name=webapp \
    --net=internal-net \
    --volume=$(PWD)$(WEBAPP):/var/www/webapp:ro \
    -p 9000:9000 \
    php:5.6.22-fpm-alpine

run-nginx:
    docker run --rm \
    --name=nginx \
    --net=internal-net \
    --volume=$(PWD)$(CONFIG)/webapp.conf:/etc/nginx/conf.d/webapp.domain.com.conf:ro \
    -p 80:80 \
    nginx:1.11.0-alpine

İşte böyle config/webapp.confgörünüyor.

server {
    listen 80;
    server_name webapp.domain.com;

    # This is where the index.php file is located in the webapp container
    # This folder will contain an index.php file and some static files that should be accessed directly
    root /var/www/webapp/web;

    location / {
        try_files $uri $uri/ @webapp;
    }

    location @webapp {
        rewrite ^(.*)$ /index.php$1 last;
    }

    location ~ ^/index\.php(/|$) {
        include fastcgi_params;

        fastcgi_pass webapp:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }
}

Bu index.phpdosyayı kullanarak işlenmesi gereken her eylem çalışır. Ancak, statik dosyalar sunulmaz, bu da kötü 404hatalara neden olur (php webapp'ın bunlar için yapılandırılmış yolları olmadığından). Ben nginx aslında webappkap içinde olduklarında, kendi kapsayıcı dosya sisteminden yüklemeye çalışır inanıyorum geri @webapp.

nginxBaşka bir kapsayıcıda bulunan dosyaları sunmak için yapılandırabileceğim bir yol var mı ?


3
Nginx'in php uygulamalarındaki dosyalara erişimi olmasını gerektirirken nginx'i php uygulamalarından izole etmek için docker kullanıyor musunuz?
Stefan Schmiedl

Yorumunuzu anladığımdan emin değilim ... Altyapımı yönetmek için docker kullanıyorum. Ancak, nginxphp uygulaması içinde istek dosyaları fpmyapmıyorum, bunu yapmak için proxy ediyorum ve nginxstatik php olmayan dosyalara erişmeniz gerekiyor .
ThisIsErico

Dosyalar "başka bir kapta bulunur", yani nginx onları görebiliyor değil, değil mi?
Stefan Schmiedl

Doğru @ Stefante, sadece webappkaba değil, birime monte edilirler nginx.
ThisIsErico

Yanıtlar:


1

webappHacmi nginxkonteynere monte ederek sorunu çözmeyi başardım . Bu nedir run-nginxgörevi biraz benziyor:

run-nginx:
    docker run --rm \
    --name=nginx \
    --net=internal-net \
    --volume=$(PWD)$(CONFIG)/webapp.conf:/etc/nginx/conf.d/webapp.domain.com.conf:ro \
    --volume=$(PWD)$(WEBAPP)/web:/var/www/webapp/web:ro \
    -p 80:80 \
    nginx:1.11.0-alpine

Ve bu, webapp.confstatik dosyaları kaptan yüklemeye çalışacak olan dosyadır ve bu mümkün değilse, fpmçalışanın isteğini proxy yapar :

server {
    listen 80;
    server_name webapp.domain.com;

    root /var/www/webapp/web;

    location ~ \.(js|css|png) {
        try_files $uri $uri/;
    }

    location / {
        rewrite ^(.*)$ /index.php$1 last;
    }

    location ~ ^/index\.php(/|$) {
        include fastcgi_params;

        fastcgi_pass webapp:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }
}

Ancak, aynı birimi iki kez paylaşmak yerine bunu yapmanın daha iyi bir yolu olup olmadığını bilmek istiyorum. Çok teşekkürler!


4
Nginx ve php'yi farklı kaplara ayırmanız göz önüne alındığında, sanmıyorum. İki farklı konumdaki verilere ihtiyacınız var, iki kez sağlamanız gerekiyor. Birisi daha iyi bir fikir bulursa ben de çok merak ediyorum.
Stefan Schmiedl

0

Belki bu NFS kullanılarak gerçekleştirilebilir

NFS çalıştıran bir docker konteyneri, kodun bulunduğu yerde, nginx ve php çalıştıran konteynırlara bağlanabilir. Dosyalar yalnızca bir kapta saklanır. Bu, başka bir izolasyon katmanı da sağlayabilir.


0

Ben iki önerilen seçenek var: Birincisi, statik varlıklar örneğin / static koymak ve nginx için bunlar için farklı bir arka uç hizmeti çağırmak için talimattır. Adımlar:

1) Web sitelerinizi, statik varlıklar için / statik / * olarak işaret edecek şekilde güncelleyin; örneğin /styles.css /static/styles.css olur

2) Varlıklarınızı ya başka bir nginx tarafından sunulan ayrı bir kaba koyun (böylece konteyneri birkaç site için tekrar kullanabilirsiniz)

3) Tüm konteyneri / static / * 'a yeni konteynere göndermek için nginx.conf dosyasını düzenleyin:

location /static/ {
   proxy_pass http://static-container;
}

İkinci seçenek, statik varlıklarınızı bir CDN'ye taşımaktır , bu nedenle her statik varlığı harici bir URL'den yüklemek için web sitenizi güncellemeniz gerekir ( https: //cdnwebsite/asdsadasda/styles.css /styles.css yerine veya /static/styles.css)

İkinci seçeneğin, başta performans olmak üzere diğerlerine göre çeşitli avantajları vardır. Bir CDN bunları daha hızlı sunacaktır ve siz de bir tarayıcının her bir FQDN'ye yapabileceği eşzamanlı bağlantı sınırı etrafında çalıştığınızdan , sitenizi yüklemek için daha eşzamanlı bağlantılar kullanıldığından sayfanız daha hızlı yüklenebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.