Wednesday, June 20, 2018

Nginx pointed to wrong directory with Docker on Windows

Leave a Comment

I'm setting up a Laravel application with Docker, using a Docker image configuration I found here: https://blog.pusher.com/docker-for-development-laravel-php/

Now, this works fine on my Ubuntu machine (16.04), but on Window (10 Pro) I get a weird error. It first complains about not finding a composer.json file. Then, with each request I make to localhost:8000, I get the following error:

15#15: *1 open() "/var/www/public404" failed (2: No such file or directory), client: 172.17.0.1, server: , request: "GET / HTTP/1.1", host: "localhost:8000" 

I am very new to this, but it seems that nginx points to /var/www/public404 - I have no idea how that "404" got there. I have a feeling it has to do with the line try_files $uri = 404; in the site.conf file, however, I don't really know how that works and I don't want to break it... The weird thing is that this works with Ubuntu, but not on Windows (or maybe that's not weird at all?).

I use docker build . -t my-image to build the image and docker run -p 8000:80 --name="my-container" my-image to run a container using the image.

The EOL of all the config files is set to line feed. Does anybody have any idea how I might fix this?

Dockerfile

FROM nginx:mainline-alpine LABEL maintainer="John Doe <john@doe>"  COPY start.sh /start.sh COPY nginx.conf /etc/nginx/nginx.conf COPY supervisord.conf /etc/supervisord.conf COPY site.conf /etc/nginx/sites-available/default.conf  RUN apk add --update \ php7 \ php7-fpm \ php7-pdo \ php7-pdo_mysql \ php7-mcrypt \ php7-mbstring \ php7-xml \ php7-openssl \ php7-json \ php7-phar \ php7-zip \ php7-dom \ php7-session \ php7-tokenizer \ php7-zlib && \ php7 -r "copy('http://getcomposer.org/installer', 'composer-setup.php');" && \ php7 composer-setup.php --install-dir=/usr/bin --filename=composer && \ php7 -r "unlink('composer-setup.php');" && \ ln -s /etc/php7/php.ini /etc/php7/conf.d/php.ini  RUN apk add --update \ bash \ openssh-client \ supervisor  RUN mkdir -p /etc/nginx && \ mkdir -p /etc/nginx/sites-available && \ mkdir -p /etc/nginx/sites-enabled && \ mkdir -p /run/nginx && \ ln -s /etc/nginx/sites-available/default.conf /etc/nginx/sites-enabled/default.conf && \ mkdir -p /var/log/supervisor && \ rm -Rf /var/www/* && \ chmod 755 /start.sh  RUN sed -i -e "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g" \ -e "s/variables_order = \"GPCS\"/variables_order = \"EGPCS\"/g" \ /etc/php7/php.ini && \ sed -i -e "s/;daemonize\s*=\s*yes/daemonize = no/g" \ -e "s/;catch_workers_output\s*=\s*yes/catch_workers_output = yes/g" \ -e "s/user = nobody/user = nginx/g" \ -e "s/group = nobody/group = nginx/g" \ -e "s/;listen.mode = 0660/listen.mode = 0666/g" \ -e "s/;listen.owner = nobody/listen.owner = nginx/g" \ -e "s/;listen.group = nobody/listen.group = nginx/g" \ -e "s/listen = 127.0.0.1:9000/listen = \/var\/run\/php-fpm.sock/g" \ -e "s/^;clear_env = no$/clear_env = no/" \ /etc/php7/php-fpm.d/www.conf  EXPOSE 443 80 WORKDIR /var/www  CMD ["/start.sh"] 

start.sh

#!/bin/bash  # ---------------------------------------------------------------------- # Create the .env file if it does not exist. # ----------------------------------------------------------------------  if [[ ! -f "/var/www/.env" ]] && [[ -f "/var/www/.env.example" ]]; then cp /var/www/.env.example /var/www/.env fi  # ---------------------------------------------------------------------- # Run Composer # ----------------------------------------------------------------------  if [[ ! -d "/var/www/vendor" ]]; then cd /var/www composer update composer dump-autoload -o fi  # ---------------------------------------------------------------------- # Start supervisord # ----------------------------------------------------------------------  exec /usr/bin/supervisord -n -c /etc/supervisord.conf 

site.conf

server { listen 80;  root /var/www/public; index index.php index.html;  location / { try_files $uri $uri/ /index.php?$query_string; }  location ~ /\. { deny all; }  location ~ \.php$ { try_files $uri = 404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } 

nginx.conf

user nginx; worker_processes 1;  error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;  events { worker_connections 1024; }  http { include /etc/nginx/mime.types; default_type application/octet-stream; access_log off; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/sites-enabled/*.conf; } 

supervisord.conf

[unix_http_server] file=/dev/shm/supervisor.sock  [supervisord] logfile=/tmp/supervisord.log logfile_maxbytes=50MB logfile_backups=10 loglevel=warn pidfile=/tmp/supervisord.pid nodaemon=false minfds=1024 minprocs=200 user=root  [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface  [supervisorctl] serverurl=unix:///dev/shm/supervisor.sock  [program:php-fpm7] command = /usr/sbin/php-fpm7 --nodaemonize --fpm-config /etc/php7/php-fpm.d/www.conf autostart=true autorestart=true priority=5 stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0  [program:nginx] command=/usr/sbin/nginx -g "daemon off;" autostart=true autorestart=true priority=10 stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 

1 Answers

Answers 1

site.conf

server {   listen 80 default_server;   root /var/www/public;    index index.php;   server_name localhost;    location / {     try_files $uri /index.php?$query_string;   }    location ~* \.php$ {     fastcgi_split_path_info ^(.+\.php)(.*)$;     fastcgi_pass 127.0.0.1:9000;     fastcgi_params SCRIPT_FILENAME $document_root$fastcgi_script_name;     include fastcgi_params;   } } 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment