Sajikan konten statis menggunakan buruh pelabuhan + nginx + php-fpm

10

Saya mencoba mengkonfigurasi webapp php menggunakan buruh pelabuhan. Idenya adalah menjalankan aplikasi menggunakan php-fpmwadah mandiri dan memiliki wadah lain yang akan menjalankan nginx. Gagasan untuk pengaturan ini adalah menggunakan wadah nginx yang sama untuk permintaan proxy ke webapps lain yang sudah bekerja pada mesin yang sama. Masalahnya adalah bahwa saya tidak dapat nginxmemproses file statis dengan benar (js, css, dll.), Karena permintaan kepada mereka terus berlanjut fpm.

Seperti apa sistem file itu:

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

Saya menjalankan semuanya menggunakan Makefileyang terlihat seperti ini (tidak tertarik docker-composeuntuk ini):

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

Seperti inilah config/webapp.confpenampilan saya .

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;
    }
}

Tindakan apa pun yang perlu diproses menggunakan index.phpfile itu akan berhasil. Namun, file statis tidak akan disajikan, menghasilkan 404kesalahan buruk (karena php webapp tidak benar-benar memiliki rute yang dikonfigurasi untuk itu). Saya percaya nginx mencoba memuatnya dari filesystem containernya sendiri, ketika mereka benar-benar ada di dalam webappcontainer, gagal kembali @webapp.

Apakah ada cara yang bisa saya konfigurasi nginxuntuk melayani file-file yang berada di wadah lain?

ThisIsErico
sumber
3
Apakah Anda menggunakan buruh pelabuhan untuk mengisolasi nginx dari aplikasi php sementara mengharuskan nginx memiliki akses ke file di dalam aplikasi php?
Stefan Schmiedl
Saya tidak yakin saya mengerti komentar Anda ... Saya menggunakan buruh pelabuhan untuk mengelola infrastruktur saya. Namun, saya tidak membuat nginxfile permintaan dalam aplikasi php, saya sedang proksi fpmuntuk melakukannya dan saya perlu nginxmengakses file non-php statis.
ThisIsErico
File-file "berada di wadah lain", yaitu tidak di mana nginx dapat melihatnya, kan?
Stefan Schmiedl
Itu benar @Stefan, mereka hanya bisa dipasang sebagai volume dalam webappwadah, bukan dalam nginxsatu.
ThisIsErico

Jawaban:

1

Saya berhasil memecahkan masalah dengan memasang webappvolume di nginxwadah. Seperti apa run-nginxpekerjaan itu sekarang:

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

Dan ini adalah webapp.conffile, yang akan mencoba memuat file statis dari wadah dan, jika itu tidak mungkin, proksi permintaan tersebut kepada fpmpekerja:

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;
    }
}

Namun, saya ingin tahu apakah ada cara yang lebih baik untuk melakukannya daripada berbagi volume yang sama dua kali. Terima kasih banyak!

ThisIsErico
sumber
4
Mengingat pemisahan nginx dan php Anda ke dalam wadah yang berbeda, saya rasa tidak. Anda memerlukan data di dua lokasi berbeda, Anda harus menyediakannya dua kali. Saya juga sangat ingin tahu, jika seseorang datang dengan ide yang lebih baik.
Stefan Schmiedl
0

Mungkin ini bisa dicapai dengan menggunakan NFS

Satu kontainer buruh pelabuhan yang menjalankan NFS dapat dibuat di mana kode berada, yang dapat dikaitkan dengan wadah yang menjalankan nginx dan php. File akan disimpan dalam satu wadah saja. Ini bisa memberikan lapisan isolasi lain juga.

Magarusu
sumber
0

Saya punya dua opsi yang disarankan: Yang pertama adalah untuk meletakkan aset statis Anda di eg / static dan menginstruksikan nginx untuk memanggil layanan backend yang berbeda untuk mereka. Langkah:

1) Perbarui situs web Anda untuk menunjuk ke / static / * untuk aset statis apa pun, jadi mis. /Styles.css menjadi /static/styles.css

2) Masukkan aset Anda dalam wadah terpisah yang dilayani oleh mungkin nginx lain (sehingga Anda dapat menggunakan kembali wadah itu untuk beberapa situs)

3) Edit nginx.conf untuk mengirim semua permintaan ke / static / * ke wadah baru:

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

Opsi kedua adalah hanya memindahkan aset statis Anda ke CDN, jadi Anda hanya perlu memperbarui situs web Anda untuk memuat setiap aset statis dari URL eksternal ( https: //cdnwebsite/asdsadasda/styles.css alih-alih /styles.css atau /static/styles.css)

Opsi kedua memiliki beberapa keunggulan dibandingkan yang lain, terutama seputar kinerja. Sebuah CDN akan melayani yang lebih cepat dan Anda juga bekerja di sekitar batas koneksi simultan yang dapat dilakukan browser untuk setiap FQDN, sehingga halaman Anda mungkin memuat lebih cepat karena koneksi yang lebih simultan digunakan untuk memuat situs Anda.

Pedro Perez
sumber