I tried many many advises, but can't make it working. I want to create a docker-compose.yml
file with NGINX-PHP
cooperation.
Here's what I made:
version: "2"
services:
nginx:
image: nginx:latest
restart: always
ports:
- "80:80"
- "443:443"
links:
- php
depends_on:
- php
expose:
- "80"
- "443"
volumes:
- ./www:/var/www/html
- ./config/nginx/site.conf:/etc/nginx/sites-available/default
- ./config/nginx/site.conf:/etc/nginx/sites-enabled/default
php:
image: php:7-fpm
restart: always
volumes:
- ./www:/var/www/html
Docker
images run without errors, but when I want to access Nginx
, I get this:
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org. Commercial support is available at nginx.com.
Thank you for using nginx.
I tried to log into both images and check volumes. I also checked if I can ping php
from nginx
. Everything seems to be fine...
Here's my Nginx
site configuration:
server {
server_name ncp-docker;
listen 80;
index index.php index.html index.htm;
root /var/www/html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~ /(inc|uploads/avatars) {
deny all;
}
}
You are defaulting to default server configuration, so you need to overwrite the default nginx virtual host:
- ./config/nginx/site.conf:/etc/nginx/conf.d/default.conf
Use that and remove both sites-enabled and sites-available volumes
i think you might be approaching this incorrectly.
the nginx configuration should not be running PHP directly. PHP is running on a separate container.
instead, you should have nginx reverse proxy to the PHP app.
something like this:
server {
listen 80;
server_name yourdomain.example.com;
location / {
proxy_pass http://php:9000/;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
}
}
there's probably some detail you need to add / change... but this is the basic reverse proxy that i cut & paste when i need it, in nginx
As Robert suggested you have to overwrite the default nginx virtual host, however, I would like to add that you can also add an extra Dockerfile for your nginx container and avoid using volumes. In your docker-compose.yml
you have to change image: nginx:latest
with build: ./nginx/
. For the Dockerfile something like this should do the trick:
FROM nginx:latest
RUN rm /etc/nginx/conf.d/default.conf
ADD conf.d/ /etc/nginx/conf.d/ #Replace the default nginx virtual host
I find this easier as later on you can easily add more things to the container for example SSL certificates for a HTTPS connection:
ADD ssl/ /etc/nginx/ssl/
This will save you using volumes and will make your life easier for future nginx settings.