推倒重来,方便后续折腾

Docker 常用指令

  • docker logs -f xxx : 查看容器日志
  • docker logs --since "1h" xxx : 查看一个小时内的日志
  • docker inspect --format='{{.NetworkSettings.IPAddress}}' xxx : 查看容器 ip
  • docker rm xxx : 删除容器
  • docker rmi xxx : 删除镜像
  • docker exec -it xxx /bin/bash 或 docker exec -it xxx bash : 进入容器
  • exit : 退出容器
  • docker ps : 查看运行中容器
  • docker ps -a : 查看所有容器
  • docker stop xxx : 停止容器
  • docker images : 查看下载的镜像
  • docker rm -f xxx : 在运行的情况下删除容器,不建议
  • docker restart xxx : 重启容器
  • docker cp 容器名:path path : 容器拷贝到宿主机
  • docker cp path 容器名:path : 宿主机拷贝到容器
  • 进入容器,apt-get update : 更新后才能安装 vim,ping 之类的工具。

docker 配置

docker 设置自启动

  • 阿里云重置成 docker 环境,省去了 docker 安装步骤,查看自启动

    [root@iZ2vcg1pccavtnljogn3gkZ /]# systemctl list-unit-files | grep docker
    docker.service                                enabled 
    docker.socket                                 disabled
  • Docker 服务(docker.service)是负责管理和运行 Docker 容器的主要系统服务。通过启用 docker.service,系统可以在启动时自动加载并启动 Docker 服务,以便您可以使用 Docker 命令进行容器管理。
  • Docker 套接字(docker.socket)是一种用于与 Docker 服务通信的机制。禁用 docker.socket 意味着系统在启动时不会自动加载和启动该套接字。就是可以通过 Docker 命令可以与 Docker 引擎进行交互,并且可以在容器中执行对应的指令。
  • 添加自启动

    [root@iZ2vcg1pccavtnljogn3gkZ /]# systemctl enable docker.socket
    Created symlink from /etc/systemd/system/sockets.target.wants/docker.socket to /usr/lib/systemd/system/docker.socket.

换源

  • 查看是否换源

    [root@iZ2vcg1pccavtnljogn3gkZ /]# docker info
    ...
     Registry: https://index.docker.io/v1/
    ...
  • 没有换源,换源

    • 创建或修改 /etc/docker/daemon.json 文件,修改为如下形式

      {
      "registry-mirrors": [
          "http://hub-mirror.c.163.com",
          "https://docker.mirrors.ustc.edu.cn",
          "https://registry.docker-cn.com"
      ]
      }
  • 加载重启 docker

    [root@iZ2vcg1pccavtnljogn3gkZ /]# service docker restart
    • 检查是否成功
    [root@iZ2vcg1pccavtnljogn3gkZ /]# docker info

docker 安装 mysql

下载镜像

  • 拉去镜像,之前我安装的是 8.0.23,现在打算安装下最新的 8.2.0,所以用以下指令:

    [root@iZ2vcg1pccavtnljogn3gkZ ~]# docker pull mysql:8.2.0-oracle
  • 查看自己下载的镜像

    [root@iZ2vcg1pccavtnljogn3gkZ ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    mysql               8.2.0-oracle        73246731c4b0        9 days ago          619MB

创建运行容器

  • 创建容器并运行

    docker run \
    --name mysql \
    -d \
    -p 3306:3306 \
    --restart unless-stopped \
    -v /usr/local/docker/mysql/cnf:/etc/mysql/conf.d \
    -v /usr/local/docker/mysql/data:/var/lib/mysql \
    -v /usr/local/docker/mysql/log:/var/log \
    -v /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files \
    -e MYSQL_ROOT_PASSWORD='单引号加密码' \
    mysql:8.2.0-oracle
命令描述
docker run创建一个新的容器 , 同时运行这个容器
–name mysql启动容器的名字
-d后台运行
-p 3306:3306将容器的 3306 (后面那个) 端口映射到主机的 3306 (前面那个) 端口
–restart unless-stopped容器重启策略
-v /usr/local/docker/mysql/log:/var/log将日志文件夹挂载到主机
-v /usr/local/docker/mysql/data:/var/lib/mysql将mysql储存文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD='root'设置 root 用户的密码
mysql:8.2.0-oracle启动哪个版本的 mysql (本地镜像的版本)
\shell 命令换行符
  • 查看是否运行成功

    [root@iZ2vcg1pccavtnljogn3gkZ ~]# docker ps -a
    CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                          PORTS               NAMES
    xxx        mysql:8.2.0-oracle   "docker-entrypoint.s…"   40 seconds ago      Restarting (1) 10 seconds ago                       mysql
docker psdocker ps -a
列出正在运行的容器列出所有容器,包括未运行的
  • 查看 docker ip

    docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql容器名
    
  • 记住这个 IP,后面连接数据库填写的就是这个 IP。

问题处理

问题 1:

  • Error response from daemon: Container 【CONTAINER ID】 is restarting, wait until the container is running。问题描述是容器并没有启动,而是在 restarting 状态。
  • 查看日志

    [root@iZ2vcg1pccavtnljogn3gkZ ~]# docker logs mysql
    [ERROR] [Entrypoint]: mysqld failed while attempting to check config
          command was: mysqld --verbose --help --log-bin-index=/tmp/tmp.1zH2OCMlVM
          mysqld: Can't read dir of '/etc/mysql/conf.d/' (OS errno 2 - No such file or directory)
    mysqld: [ERROR] Stopped processing the 'includedir' directive in file /etc/my.cnf at line 36.
    mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
    ...
  • 解决方案:
  • 将 -v /usr/local/docker/mysql/cnf:/etc/mysql/ 改为 -v /usr/local/docker/mysql/cnf:/etc/mysql/conf.d

Docker 安装 PHP

下载镜像

docker pull php:fpm

创建运行容器

docker run \
--name php \
-p 9000:9000 \
-v /usr/local/docker/nginx/www:/usr/share/nginx/html \
-d \
php:fpm

# 后来出了问题,我重新 pull 了一个老点的镜像,如下:
# 狗屎的 PHP8.2 ,在 8.0 都没问题的!!!!
docker run \
--name php \
-p 9000:9000 \
-v /usr/local/docker/nginx/www:/usr/share/nginx/html \
-d \
php:8.0.30-fpm

安装扩展

  • 默认没有 pdo_mysql 扩展!

    1. docker exec -it php容器名 bash # 进入容器
    2. docker-php-source extract # 提取 php 扩展源码
    3. cd /usr/src/php/ext # 进入 php 扩展源码路径
    4. docker-php-ext-install pdo_mysql # 安装扩展
    5. 在 /usr/local/etc/php 下创建 php.ini 并添加内容: extension = pdo_mysql
    6. docker restart php容器名,重启,然后查看 phpinfo() ,里面出现了 pdo_mysql。

问题处理

问题一

  • 开始下了 php:cli-bookworm,结果怎么都没法连接,后来换成了 php:fpm 就好了。后在安装扩展的时候明明有 confing.m4,且在源码的扩展目录下,还是不行,换了个老版的 php 就好了。狗屎的 PHP8.2,在 8.0 里都没有问题。

问题二

  • 其他配置好了以后,为什么无返回结果,就是因为这里的挂载路径一定要和 nginx 一样,不然的话该容器内无法找到对应的 php 代码!!!!如下:

    -v /usr/local/docker/nginx/www:/usr/share/nginx/html
  • nginx 容器会传过来的内容是 /usr/share/nginx/html/index.php。如果容器内路径不一样,则无法解析到挂载路径。如果挂载路径不一样,则按照解析结果无法找到对应的 php 文件。除非你将代码 copy 一份到容器内。

php 安装扩展相关用法

docker-php-source

  • 此命令,实际上就是在PHP容器中创建一个/usr/src/php的目录,里面放了一些自带的文件而已。我们就把它当作一个从互联网中下载下来的PHP扩展源码的存放目录即可。事实上,所有PHP扩展源码扩展存放的路径: /usr/src/php/ext 里面。

    docker-php-source extract | delete
  • 参数说明
  • extract : 创建并初始化 /usr/src/php目录
  • delete : 删除 /usr/src/php目录

    root@803cbcf702a4:/usr/src# ls -l
    total 11896 #此时,并没有php目录
    -rw-r--r-- 1 root root 12176404 Jun 28 03:23 php.tar.xz
    -rw-r--r-- 1 root root      801 Jun 28 03:23 php.tar.xz.asc
    
    root@803cbcf702a4:/usr/src# docker-php-source extract
    root@803cbcf702a4:/usr/src# ls -l
    total 11900 #此时,生产了php目录,里面还有一些文件,由于篇幅问题,就不进去查看了
    drwxr-xr-x 14 root root     4096 Aug  9 09:01 php
    -rw-r--r--  1 root root 12176404 Jun 28 03:23 php.tar.xz
    -rw-r--r--  1 root root      801 Jun 28 03:23 php.tar.xz.asc
    
    root@803cbcf702a4:/usr/src# docker-php-source delete
    root@803cbcf702a4:/usr/src# ls -l
    total 11896 #此时,将已创建 php 目录给删除了
    -rw-r--r-- 1 root root 12176404 Jun 28 03:23 php.tar.xz
    -rw-r--r-- 1 root root      801 Jun 28 03:23 php.tar.xz.asc
    
    root@803cbcf702a4:/usr/src#

docker-php-ext-enable

  • 这个命令,就是用来启动 PHP扩展 的。我们使用pecl安装PHP扩展的时候,默认是没有启动这个扩展的,如果想要使用这个扩展必须要在php.ini这个配置文件中去配置一下才能使用这个PHP扩展。而 docker-php-ext-enable 这个命令则是自动给我们来启动PHP扩展的,不需要你去php.ini这个配置文件中去配置。

    # 查看现有可以启动的扩展
    root@517b9c67507a:/usr/local/etc/php# ls /usr/local/lib/php/extensions/no-debug-non-zts-20170718/
    opcache.so  redis.so  sodium.so
    root@517b9c67507a:/usr/local/etc/php#
    
    # 查看redis 扩展是否可以启动
    root@517b9c67507a:/usr/local/etc/php# php -m | grep redis
    root@517b9c67507a:/usr/local/etc/php#
    
    # 启动 redis 扩展
    root@517b9c67507a:/usr/local/etc/php# docker-php-ext-enable redis
    # 启动 成功
    root@517b9c67507a:/usr/local/etc/php# php -m | grep redis
    redis
    root@517b9c67507a:/usr/local/etc/php#
    
    #说明,php容器中默认是没有php.ini配置文件的,加载原理如下所示
    
    root@517b9c67507a:/usr/local/etc/php# php -i | grep -A 5 php.ini
    Configuration File (php.ini) Path => /usr/local/etc/php
    Loaded Configuration File => (none)
    # 核心是 /usr/local/etc/php/conf.d 目录下的扩展配置文件
    Scan this dir for additional .ini files => /usr/local/etc/php/conf.d
    Additional .ini files parsed => /usr/local/etc/php/conf.d/docker-php-ext-redis.ini,
    /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
    
    root@517b9c67507a:/usr/local/etc/php#

docker-php-ext-install

  • 这个命令,是用来安装并启动PHP扩展的。
  • 命令格式:
  • docker-php-ext-install “源码包目录名”
  • 注意点:

    • “源码包“需要放在 /usr/src/php/ext 下
    • 默认情况下,PHP容器没有 /usr/src/php这个目录,需要使用 docker-php-source extract来生成。
    • docker-php-ext-install 安装的扩展在安装完成后,会自动调用docker-php-ext-enable来启动安装的扩展。
    • 卸载扩展,直接删除/usr/local/etc/php/conf.d 对应的配置文件即可。

      # 卸载redis 扩展
      root@803cbcf702a4:/usr/local# rm -rf /usr/local/etc/php/conf.d/docker-php-ext-redis.ini
      root@803cbcf702a4:/usr/local# php -m 
      [PHP Modules]
      Core
      ctype
      curl
      date
      dom
      fileinfo
      filter
      ftp
      hash
      iconv
      json
      libxml
      mbstring
      mysqlnd
      openssl
      pcre
      PDO
      pdo_sqlite
      Phar
      posix
      readline
      Reflection
      session
      SimpleXML
      sodium
      SPL
      sqlite3
      standard
      tokenizer
      xml
      xmlreader
      xmlwriter
      zlib
      
      [Zend Modules]
      
      root@803cbcf702a4:/usr/local#
      
      #PHP容器默认是没有redis扩展的。所以我们通过docker-php-ext-install安装redis扩展
      
      root@803cbcf702a4:/# curl -L -o /tmp/reids.tar.gz https://codeload.github.com/phpredis/phpredis/tar.gz/5.0.2
      
      root@803cbcf702a4:/# cd /tmp
      root@517b9c67507a:/tmp# tar -xzf reids.tar.gz
      root@517b9c67507a:/tmp# ls
      phpredis-5.0.2    reids.tar.gz
      root@517b9c67507a:/tmp# docker-php-source extract
      root@517b9c67507a:/tmp# mv phpredis-5.0.2 /usr/src/php/ext/phpredis
      
      #检查移过去的插件源码包是否存在
      root@517b9c67507a:/tmp# ls -l /usr/src/php/ext | grep redis
      drwxrwxr-x  6 root root 4096 Jul 29 15:04 phpredis
      root@517b9c67507a:/tmp# docker-php-ext-install phpredis
      
      # 检查redis 扩展是否已经安装上
      root@517b9c67507a:/tmp# php -m | grep redis
      redis
      root@517b9c67507a:/tmp#
      

docker-php-ext-configure

  • docker-php-ext-configure 一般都是需要跟 docker-php-ext-install搭配使用的。它的作用就是,当你安装扩展的时候,需要自定义配置时,就可以使用它来帮你做到。

    FROM php:7.1-fpm
    RUN apt-get update \
      # 相关依赖必须手动安装
      && apt-get install -y \
          libfreetype6-dev \
          libjpeg62-turbo-dev \
          libmcrypt-dev \
          libpng-dev \
      # 安装扩展
      && docker-php-ext-install -j$(nproc) iconv mcrypt \
      # 如果安装的扩展需要自定义配置时
      && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
      && docker-php-ext-install -j$(nproc) gd
    

Docker 安装 Nginx

nginx 相关命令

nginx -t # 检测配置文件
nginx -s stop # 关闭 
nginx -s reload # 重启
systemctl enable nginx.service # 设置 nginx 开机自启动。
systemctl disable nginx.service # 关闭开机自启动。
ps aux | grep nginx # 查找 nginx 进程

下载镜像

docker pull nginx:stable-perl

创建运行容器

  • 创建挂载目录

    mkdir /usr/local/docker/
    mkdir /usr/local/docker/nginx/
    mkdir /usr/local/docker/nginx/www/
    mkdir /usr/local/docker/nginx/conf.d/
  • 因为想要将配置文件也挂载文件夹,首先需要创建临时容器将默认配置文件复制出来

    docker run --name 临时容器名 -d nginx镜像名
    docker cp 临时容器名:/etc/nginx/nginx.conf /挂载的conf.d路径
    docker rm -f 临时容器名
    
    docker run --name nginx -d nginx:stable-perl
    docker cp nginx:/etc/nginx/nginx.conf /usr/local/docker/nginx/nginx.conf
    docker cp nginx:/etc/nginx/conf.d/default.conf /usr/local/docker/nginx/conf.d/default.conf
    docker cp nginx:/usr/share/nginx/html/50x.html /usr/local/docker/nginx/www/50x.html
    docker cp nginx:/usr/share/nginx/html/index.html /usr/local/docker/nginx/www/index.html
    docker rm -f nginx
  • 这里复制了两个 html 文件是为了后面测试用的,不复制也行。记住 nginx.conf 和 conf.d 中的 default.conf 都要复制出来,有些教程这里没有复制,后面写配置文件的时候全程手写或者找很难受。
  • 启动镜像

    docker run --name nginx \
    -p 80:80 \
    -p 443:443 \
    -d \
    -v /usr/local/docker/nginx/www:/usr/share/nginx/html \
    -v /usr/local/docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
    -v /usr/local/docker/nginx/conf.d:/etc/nginx/conf.d \
    nginx:stable-perl
    
    docker run --name nginx \
    -p 80:80 \
    -p 443:443 \
    -d \
    -v /usr/local/docker/nginx/www:/usr/share/nginx/html \
    -v /usr/local/docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
    -v /usr/local/docker/nginx/conf.d:/etc/nginx/conf.d \
    nginx:stable-perl
  • 测试: curl http://localhost:80 没问题。
  • 然后进入 conf.d ,修改配置文件,发现下面有调用 php 的配置,取消注释后修改下。

    location ~ \.php$ { 
      root html; # 这行删去
      fastcgi_pass 47.108.189.61:9000;  # 因为是容器,这里需要填写的不能是 localhost 
      fastcgi_index index.php; 
      fastcgi_param SCRIPT_FILENAME 这个是挂载前html路径$fastcgi_script_name; 
      include fastcgi_params; 
      }
  • 这里要修改成 php 的 docker ip,不能填写 127.0.0.1。
  • server_name 这里填写你的域名
  • root 填写映射前的原始路径
  • index 这是个 php 站点,需要加个 index.php。

问题处理

问题一

  • 启动后打开 IP 出现 503 报错

    docker logs nginx容器名
    /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
  • 按照官网的 nginx 提示,我们首先需要创建未挂载的容器,将其中的 nginx.conf 复制出来即可。

    docker run --name 临时容器名 -d nginx镜像名
    docker cp 临时容器名:/etc/nginx/nginx.conf /挂载的conf.d路径
    docker rm -f 临时容器名

问题二

  • 使用docker logs nginx容器名出现以下报错:

    [emerg] 1#1: "user" directive is not allowed here in /etc/nginx/conf.d/nginx.conf:2
    nginx: [emerg] "user" directive is not allowed here in /etc/nginx/conf.d/nginx.conf:2
    
  • 看了下 nginx.conf 文件,发现最下面有如下内容:

    include /etc/nginx/conf.d/*.conf;
  • nginx.conf 本来放置在 /etc/nginx 中。在创建临时镜像复制配置文件的时候,我为了方便是将其放在了挂载路径(/usr/local/docker/nginx/conf.d)下的,也就是对应容器的 /etc/nginx/conf.d 中,也就是说,nginx.conf 最后又将自己 include 了一遍,就出现了报错。
  • 最简单解决方案:将 nginx.conf 文件换个文件夹放置,然后在 docker run 的时候单独给这个配置文件挂载,如:-v /usr/local/docker/nginx/nginx.conf:/etc/nginx/nginx.conf

问题三

  • 访问被拒绝:需要将 nginx:/etc/nginx/conf.d/ 中的 .conf 后缀的文件也复制出来,放到挂载的 conf.d 文件夹下。

问题四

  • 访问正常的 html 文件没问题,访问 php 文件返回为空,因为 nginx 配置文件中 ip 需要不能填写127.0.0.1 或者服务器 ip,要填写 php 容器的 ip 地址。

    location ~ \.php$ { 
      root html; 
      fastcgi_pass 47.108.189.61:9000;  # 因为是容器,这里需要填写的不能是 localhost 
      fastcgi_index index.php; 
      fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;  # nginx 映射前的原始路径
      include fastcgi_params; 
      }
  • 通过如下指令查看 php 容器 ip:

    docker inspect --format='{{.NetworkSettings.IPAddress}}' php容器名

问题五

  • 网站 403 Forbidden
  • 原因:没有对应的 index.html 等文件,防火墙问题,启动用户和 nginx 工作用户不一致
  • 简单排查后,发现是用户不一致,修改 nginx.conf 重启服务器即可

    user nginx;
    改成
    user root;
    好吧,我承认按照安全的标准来说不该这样,但是无所谓了。
  • 没有资源目录的权限:chmod -R 777 [文件夹]

问题六

  • PHP + nginx file not found。
  • 在 nginx 的配置中,fastcgi_param SCRIPT_FILENAME 的路径要写 nginx 映射前的原始路径。

问题七

  • typecho 数据库适配器没有 mysql,应该是缺少 php_mysql。参考前面【docker 安装 PHP】下的 【安装扩展】

http 网站配置(后续没问题后,再修改为 https)

docker容器化部署nginx php项目(步骤清晰简洁)_docker部署php项目-CSDN博客

网站.conf:注意下面 php 容器的 IP

server { 
    listen 80; 
    listen [::]:80; 
    server_name feifeitan.cn; 
    
    #配置客户端请求体最大值 
    client_max_body_size 20M; 
    #配置请求体缓存区大小 
    client_body_buffer_size 10m; 
    #access_log /var/log/nginx/host.access.log main; 
    
    location / { 
        root /usr/share/nginx/html/typecho; 
        index index.html index.htm index.php; 
        
        if (-f $request_filename/index.html){ 
            rewrite (.*) $1/index.html break; 
        } 
        if (-f $request_filename/index.php){ 
            rewrite (.*) $1/index.php; 
        } 
        if (!-f $request_filename){ 
            rewrite (.*) /index.php; 
        } 
    } 
    
    #error_page 404 /404.html; 
    # redirect server error pages to the static page /50x.html 
    # error_page 500 502 503 504 /50x.html; 
    # location = /50x.html { 
        # root /usr/share/nginx/html; 
        # 
    } 
    
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
    #location ~ \.php$ { 
    location ~ .*\.php(\/.*)*$ { 
        fastcgi_pass php容器的IP:9000; 
        fastcgi_index index.php; 
        fastcgi_split_path_info ^(.+?.php)(/.*)$; 
        # fastcgi_param SCRIPT_FILENAME /usr/share/nginx/www$fastcgi_script_name; 
        fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/typecho$fastcgi_script_name; 
        include fastcgi_params; 
    } 
}

nginx 配置参考

typecho 安装

  • 记住 mysql 数据库填写 docker 的 mysql容器 ip。
  • 提前创好 typecho 的数据库。
  • 一步一步往下,然后解决如下问题,登录网站后台上传备份文件,登录服务器后台上传 图片,主题,插件即可。

问题解决

问题一:

  • 文章和后台全部都是 404:nginx 配置问题。

    location / { 
      root /usr/share/nginx/html/typecho; 
      index index.html index.htm index.php; 
      # 在这里面加上下面的内容:
      if (-f $request_filename/index.html){ 
          rewrite (.*) $1/index.html break; 
      } 
      if (-f $request_filename/index.php){
          rewrite (.*) $1/index.php; 
      } 
      if (!-f $request_filename){ 
          rewrite (.*) /index.php; 
      }
    }
  • 修改下 location 中的 php 默认配置

      #location ~ \.php$  {  # 改成下面一行
      location ~ .*\.php(\/.*)*$ { # 改成这样就好了
          fastcgi_pass   172.17.0.4:9000;
          fastcgi_index  index.php;
          # fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/www$fastcgi_script_name;
          fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/typecho$fastcgi_script_name;
          include        fastcgi_params;
      }

问题二

  • 413 Request Entity Too Large,备份还原的时候报错,是因为大小限制。修改 nginx 网站的配置,在 server{} 中添加如下内容即可。

    #配置客户端请求体最大值 
    client_max_body_size 20M; 
    #配置请求体缓存区大小 
    client_body_buffer_size 10m;

问题三

  • 打不开 typecho 的文章只需要在 location XXXphpXXX {} 中添加 fastcgi_split_path_info ^(.+?.php)(/.*)$; 即可。

    location ~ .*\.php(\/.*)*$ { # 改成这样就好了
          fastcgi_pass   172.17.0.4:9000;
          fastcgi_index  index.php;
          fastcgi_split_path_info ^(.+?.php)(/.*)$; # 添加这个!!!
          # fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/www$fastcgi_script_name;
          fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/typecho$fastcgi_script_name;
          include        fastcgi_params;
      }
          

问题四

  • 文章导入后,配置设置好,打开文章但是发现图片不能显示,有两个可能的原因

    1. 图片没有上传,路径是 网站根目录/usr/uploads ,将图片用远程工具上传即可。
    2. 原来博客就是 https ,现在还没有配置 https ,所以无法访问。

http 转 https

  • 修改网站配置文件如下,注意 PHP容器IP 的填写。

    server { 
      listen 80; 
      listen [::]:80; 
      server_name feifeitan.cn; # 
      rewrite ^/(.*)$ https://feifeitan.cn:443/$1 permanent; 
    } 
    server { 
      listen 443 ssl,http2; 
      #对应你的域名 
      server_name feifeitan.cn; 
      
      ssl_certificate /etc/nginx/conf.d/www.feifeitan.cn.pem; # 证书路径,写的是 nginx 挂载前的路径,证书放到挂载后的文件夹中 ssl_certificate_key 
      /etc/nginx/conf.d/www.feifeitan.cn.key; # key 路径,要求同上。 
      ssl_session_timeout 5m; 
      ssl_protocols TLSv1.3; 
      ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
      ssl_prefer_server_ciphers on; 
      
      #配置客户端请求体最大值 
      client_max_body_size 20M; 
      #配置请求体缓存区大小 
      client_body_buffer_size 10m; 
      #access_log /var/log/nginx/host.access.log main; 
      
      location / { 
          root /usr/share/nginx/html/typecho; 
          index index.html index.htm index.php; 
          if (-f $request_filename/index.html){ 
              rewrite (.*) $1/index.html break; 
          } 
          if (-f $request_filename/index.php){ 
              rewrite (.*) $1/index.php; 
          } 
          if (!-f $request_filename){ 
              rewrite (.*) /index.php; 
          } 
      } 
      
      location ~ .*\.php(\/.*)*$ { 
          fastcgi_pass PHP容器ip:9000; 
          fastcgi_index index.php; 
          fastcgi_split_path_info ^(.+?.php)(/.*)$; 
          # fastcgi_param SCRIPT_FILENAME /usr/share/nginx/www$fastcgi_script_name; 
          fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/typecho$fastcgi_script_name; include fastcgi_params; 
      } 
    }
  • 最后的最后,将网站备案号和公安备案号填进去就行啦。

问题解决

  • 证书找不到
  • 很简单,将证书放到 nginx 挂载的目录下,并且使用映射后的文件夹路径,比如你放到了 /usr/local/docker/nginx/conf.d 中,那你的路径应该写成 /etc/nginx/conf.d/XXX.pem。