使用unix套接字进行php-fpm和nginx docker设置的实例介绍

647 阅读1分钟

按照下面的例子,使用unix套接字配置,让PHP-FPM和Nginx docker容器相互对话。两个容器都以相同的用户身份运行inanzzz

结构

当你运行docker的时候,php-fpm.sock 会被自动创建。

.
├── docker
│   ├── docker-compose.yml
│   ├── nginx
│   │   ├── app.conf
│   │   ├── Dockerfile
│   │   └── nginx.conf
│   ├── php
│   │   ├── Dockerfile
│   │   └── www.conf
│   └── socket
│       └── php-fpm.sock
├── index.html
└── index.php

文件

docker/docker-compose.yml

version: "3.4"

services:

  socket_php:
    build:
      context: "php"
    hostname: "socket-php"
    working_dir: "/app"
    volumes:
      - "..:/app"
      - "../docker/socket:/socket"
    environment:
      PS1: "\\u@\\h:\\w\\$$ "

  socket_nginx:
    build:
      context: "nginx"
    hostname: "socket-nginx"
    working_dir: "/app"
    ports:
      - "6080:8080"
    volumes:
      - "..:/app"
      - "../docker/socket:/socket"
    environment:
      PS1: "\\u@\\h:\\w\\$$ "

docker/nginx/app.conf

我们的用户inanzzz 没有nginx 用户的权限,所以我们不能再使用默认的80443 端口,所以使用不同的端口。

server {
    listen 8080 default_server;

    server_name localhost;

    root /app;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/socket/php-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    error_log /var/log/nginx/app_error.log;
    access_log /var/log/nginx/app_access.log;
}

docker/nginx/Dockerfile

FROM nginx:1.15.8-alpine

RUN addgroup -g 1000 -S inanzzz
RUN adduser -u 1000 -S -G inanzzz inanzzz

COPY app.conf /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/nginx.conf

RUN touch /var/run/nginx.pid \
 && chown -Rf inanzzz:inanzzz \
    /var/run/nginx.pid \
    /var/cache/nginx \
    /var/log/nginx

USER inanzzz

docker/nginx/nginx.conf

我保留了这个标准,但删除了user ,因为nginx会忽略它,并发出警告:"'user'指令只有在主进程以超级用户权限运行时才有意义"。

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;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;

    keepalive_timeout 65;

    include /etc/nginx/conf.d/*.conf;
}

docker/php/Dockerfile

FROM php:7.2.13-fpm-alpine3.8

RUN addgroup -g 1000 -S inanzzz
RUN adduser -u 1000 -S -G inanzzz inanzzz

COPY www.conf /usr/local/etc/php-fpm.d/www.conf
RUN rm /usr/local/etc/php-fpm.d/zz-docker.conf

USER inanzzz

CMD ["php-fpm", "--nodaemonize"]

docker/php/www.conf

[global]
daemonize=no

[www]
listen=/socket/php-fpm.sock
listen.owner=inanzzz
listen.group=inanzzz
listen.mode=0660

# I leave these standard as well
pm=dynamic
pm.max_children=5
pm.start_servers=2
pm.min_spare_servers=1
pm.max_spare_servers=3

构建

$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS                            NAMES
2d681f533292        docker_socket_php     "docker-php-entrypoi…"   About a minute ago   Up About a minute   9000/tcp                         docker_socket_php_1
7a27f4d3add4        docker_socket_nginx   "nginx -g 'daemon of…"   About a minute ago   Up About a minute   80/tcp, 0.0.0.0:6080->8080/tcp   docker_socket_nginx_1

测试

$ curl -i http://0.0.0.0:6080
HTTP/1.1 200 OK

Hello HTML
$ curl -i http://0.0.0.0:6080/index.php
HTTP/1.1 200 OK

Hello PHP