Saya mencoba mengkonfigurasi webapp php menggunakan buruh pelabuhan. Idenya adalah menjalankan aplikasi menggunakan php-fpm
wadah 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 nginx
memproses 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 Makefile
yang terlihat seperti ini (tidak tertarik docker-compose
untuk 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.conf
penampilan 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.php
file itu akan berhasil. Namun, file statis tidak akan disajikan, menghasilkan 404
kesalahan 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 webapp
container, gagal kembali @webapp
.
Apakah ada cara yang bisa saya konfigurasi nginx
untuk melayani file-file yang berada di wadah lain?
sumber
nginx
file permintaan dalam aplikasi php, saya sedang proksifpm
untuk melakukannya dan saya perlunginx
mengakses file non-php statis.webapp
wadah, bukan dalamnginx
satu.Jawaban:
Saya berhasil memecahkan masalah dengan memasang
webapp
volume dinginx
wadah. Seperti aparun-nginx
pekerjaan itu sekarang:Dan ini adalah
webapp.conf
file, yang akan mencoba memuat file statis dari wadah dan, jika itu tidak mungkin, proksi permintaan tersebut kepadafpm
pekerja:Namun, saya ingin tahu apakah ada cara yang lebih baik untuk melakukannya daripada berbagi volume yang sama dua kali. Terima kasih banyak!
sumber
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.
sumber
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:
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.
sumber