【问题标题】:Serve containerized wordpress with nginx [closed]使用 nginx 提供容器化的 wordpress [关闭]
【发布时间】:2018-10-07 00:15:38
【问题描述】:

我有一台安装了 nginx 的服务器和多个容器,我希望 nginx 将请求定向到适当的容器。
其中一个容器是暴露端口 8000 的 Wordpress 容器:

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: **
       MYSQL_DATABASE: wordpress
       MYSQL_USER: **
       MYSQL_PASSWORD: **

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: **
       WORDPRESS_DB_PASSWORD: **
volumes:
    db_data:

我已成功输入地址中的 Wordpress 实例:http://my_wordpress.com:8000
我应该如何配置我的 nginx,以便当我请求 http://my_wordpress.com 时,它会将请求转发到 WordPress?
我现在的wordpress.conf

server {
        listen 80;
        server_name my_wordpress.com;
        return 301 https://my_wordpress.com$request_uri;
}
server {
        listen 443 ssl spdy; 
        server_name my_wordpress.com;
        ssl_certificate ***********.pem;
        ssl_certificate_key ***************.pem;
        ssl_protocols ***************;
        ssl_ciphers '*******************';
        ssl_prefer_server_ciphers on;
        location / {
            try_files $uri $uri/ /index.php?$args;
        }

    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass my_wordpress.com:8000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
}

【问题讨论】:

  • 这个wordpress.conf在哪里?
  • @AlexanderAzarov /etc/nginx/conf.d/wordpress.conf
  • 我很好奇您的工作 Wordpress 如何显示静态文件,例如CSS、图像等。它们都可以吗?
  • 谢谢! Wordpress 使用错误的 URL 呈现静态资产,有关更多信息,请参阅我的答案。

标签: wordpress docker nginx


【解决方案1】:

您可以使用nginx-proxy,它会自动创建您要公开的容器的反向代理。使用起来非常简单快捷。

因此,例如,您的部署将是:

version: '3.3'

services:
   nginx-proxy:
     image: jwilder/nginx-proxy
     ports:
       - "80:80"
     volumes:
       - /var/run/docker.sock:/tmp/docker.sock:ro
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: **
       MYSQL_DATABASE: wordpress
       MYSQL_USER: **
       MYSQL_PASSWORD: **

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: **
       WORDPRESS_DB_PASSWORD: **
       VIRTUAL_HOST=my_wordpress.local
volumes:
    db_data:

【讨论】:

  • 谢谢!但我不想在容器中有 Nginx。另外,我后来发现该图像已经包含 Apache。看我的回答。
【解决方案2】:

你可以这样做

version: '3.3'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: **
      MYSQL_DATABASE: wordpress
      MYSQL_USER: **
      MYSQL_PASSWORD: **
    networks:
      - my_network

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: **
      WORDPRESS_DB_PASSWORD: **
    networks:
      - my_network

  nginx:
    image: nginx_revpxy    
    build:
      context: .
      dockerfile: DockerfileForNginx
    networks:
      - my_network

network:
  my_network:
    driver: bridge

# DockerfileForNginx file
# 
# FROM nginx:alpine
# RUN rm /etc/nginx/nginx.conf
# COPY nginx.conf /etc/nginx/


# Example of nginx.conf
# server {
#         listen 80;
#         server_name wordpress;
#         return 301 https://my_wordpress.com$request_uri;
# }

如果您设置了网络,您可以通过服务名称与容器通信。只需确保将正确的 nginx.conf 加载到 docker 容器中,并且您有一个反向代理容器,它将与同一个 docker 网络中的其余容器进行通信。

【讨论】:

    【解决方案3】:

    解决方案是将 Wordpress 设置中的主机名配置设置为:https://my_wordpress.com

    最终发现,Wordpress 通过 config 声明其主机名,默认配置(安装 Wordpress 后)为:http://my_wordpress.com:8000,因此 Wordpress 从 https://my_wordpress.com 重定向到 http://my_wordpress.com:8000,造成了很多麻烦。

    因为我是 Nginx、docker 和 Wordpress 的新手,所以我感到困惑并认为 Wordpress 根据从服务器获取的内容获取主机名,问题出在服务器配置级别。

    作为参考,这是工作中的wordpress.conf

    server {
            listen 80;
            server_name my_wordpress.com;
            return 301 https://my_wordpress.com$request_uri;
    }
    server {
            listen 443 ssl http2;
            server_name my_wordpress.com;
            ssl_certificate ***************.pem;
            ssl_certificate_key **************.pem;
            ssl_protocols ************;
            ssl_ciphers '*********';
            ssl_prefer_server_ciphers on;
            location / {
                    proxy_pass http://localhost:8000;
                    proxy_set_header HOST $host;
                    proxy_set_header X-Forwarded-Proto $scheme;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多