解决docker容器下php-fpm模式的wordpress无法被nginx代理,静态CSS文件无法请求

部署视图

整体如下,主机只开放一个80端口,我不同域名通过nginx反向代理,比如www.trilliongame.fun代理到3300端口,而3300是被wordpress的container映射的服务,其他域名类似横向扩展。

2 安装过程

  1. 前置条件是拉取mysql镜像,并启动容器,写好初始化脚本,既创建MySQL用户,数据库,给用户分配权限。(可以重新写dockerfile,我是写好脚本传入contaier运行初始化)
console 复制代码
mysql -uroot -p<pass> -- 一般是在mysql容器启动run 的时候传入的环境变量-e

-- 进入mysql交互窗口
CREATE DATABASE IF NOT EXISTS <db>; -- 创建数据库

use mysql;

CREATE USER '<username>'@'%' IDENTIFIED BY '<pass>'; -- 增加一个用户
GRANT ALL PRIVILEGES ON <db>.* TO '<username>'@'%';

-- 刷新权限表
FLUSH PRIVILEGES;
  1. 安装好nginx,并用nginx代理好80端口
  2. 拉取镜像:docker pull wordpress:beta-php8.4-fpm-alpine
  3. 启动wordpress容器
console 复制代码
docker run --name wp_tg_ct -p 3300:9000 -e WORDPRESS_DB_PASSWORD=<mysql_password>  -e WORDPRESS_DB_HOST=<mysql的docker网段172.17.0.2>  -e WORDPRESS_DB_USER=<username> -e WORDPRESS_DB_NAME=<db> -d wordpress:beta-php8.4-fpm-alpine
  1. 修改nginx配置文件使反向代理生效

    1. 注意点1:fpm模式下,是用的fast-cgi,所以通过curl,http是无法访问。所以nginx配置的时候不能用proxy_pass,要用fastcgi_pass
    2. wordpress里面的静态资源,css文件在wp-includes下,这些无法透穿出来(我没想到其他好方法),所以容器启动后,需要通过docker cp将容器的wordpress的代码拷贝一份到宿主机上。然后再在nginx里面配置静态文件解析路径,否则网站没有样式。不用-v映射容器的/var/www/html是因为如果宿主机的文件夹为空,而容器内的文件不为空,容器内的文件夹会被覆盖,wordpress的代码会不可见
    3. 最坑的一点,wordpress的根目录是/var/www/html,同时,nginx安装后,它也会在宿主机上创建一个根目录/var/www/html,里面存放了一个nginx的欢迎页面index.nginx-debain.html,会产生一个情况,当访问www.trilliongame.fun的时候报错403, nginx forbidden,但是访问www.trilliongame.fun/index.php是可以的。原因就是这个冲突,我的处理是删掉宿主机上的/var/www/html文件夹。
  2. nginx配置文件生效前宿主机的操作

console 复制代码
rm -rf /var/www/html -- 删除nginx的欢迎页面

groupadd www-data 
useradd -g www-data www-data -d /home/www-data
cd /home/www-data
mkdir wp_game_workdir
docker cp wp_tg_ct:/var/www/html  /home/www-data/wp_game_workdir/  -- 拷贝代码到宿主机
chown -R www-data:www-data /home/www-data
  1. nginx配置: vim /etc/nginx/sites-enabled/default
nginx 复制代码
server {
    listen 80;
    server_name trilliongame.fun www.trilliongame.fun;
    root /var/www/html;
    # index index.php index.html;
    # autoindex on;
    # === 宿主机:优先放行静态文件(不再代理)
    location ~* \.(css|js|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf|eot)$ {
        root /home/www-data/wp_game_workdir/html; # WordPress 映射目录(宿主机)
        expires 30d;
        add_header Cache-Control "public";
    }

    location / {
        #try_files $uri $uri/ =404;
        index index.php;
        try_files $uri $uri/ /index.php?$query_string;
        include mime.types;               # 引入 /etc/nginx/mime.types
        default_type application/octet-stream;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:3300;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
  1. 重启和日志
console 复制代码
tail -f -n 20 /var/log/nginx/error.log -- 查看nginx日志
nginx -s reload && systemctl restart nginx -- 重加载重启nginx
相关推荐
a***59261 小时前
docker离线安装及部署各类中间件(x86系统架构)
docker·中间件·系统架构
程序辕日记2 小时前
Linux环境docker离线安装教程
linux·docker
可可苏饼干2 小时前
容器与 Docker
运维·笔记·学习·docker·容器
black_blank2 小时前
综合组网实验
网络·智能路由器·php
107102 小时前
Docker学习笔记
笔记·学习·docker
洛可可白2 小时前
Ubuntu 上安装 Docker
linux·ubuntu·docker
霸王大陆2 小时前
《零基础学PHP:从入门到实战》教程-模块七:MySQL 数据库基础-4
数据库·mysql·php
徐同保2 小时前
Nginx不能转发带有websocket功能的项目解决方案
运维·websocket·nginx
赴前尘2 小时前
docker 配置ipv6地址
java·docker·容器