Typecho 一键搭建

总览

使用docker-compose一键搭建typecho博客

这是一个Dockerfile / image,用于为nginx和php-fpm构建容器

  • 支持Redis缓存
  • 支持SSL配置
  • 自定义nginx配置
  • 自定义php配置
  • 优化php基础参数
  • 优化nginx基础参数
  • nginx配置文件带有反爬虫配置(默认不开启)
  • php与nginx通信使用sock
  • 使用Zend Opcache缓存
  • docker-compose一键部署

如果您有任何改进或建议,请在GitHub项目页面上打开问题或提出请求。

版本

Docker TagNginx VersionPHP VersionAlpine Versionnoteport
nginx-php7.3-fpm1.18.07.3.173.10集成NGINX80, 443
php7.3-fpm1.18.07.3.173.10

链接

拉取镜像

从docker hub拉取镜像:

sudo docker push nedvedliao/typecho

拉取配置文件

从github拉取

git init

git remote add typecho https://github.com/Nedved-liao/Dockerfile.git

git fetch typecho

git checkout typecho/master -- typecho

文件目录如下

.
├── conf
│   ├── docker-vars.ini
│   ├── nginx.conf
│   ├── nginx-site.conf
│   ├── nginx-site-ssl.conf
│   └── supervisord.conf
├── docker-compose.yaml
├── Dockerfile
└── scripts
    ├── cachetool
    └── docker-entrypoint.sh

docker快速部署详见https://www.leonisir.com/article/577.html

使用docker-compose快速部署

安装docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

$ docker-compose --version
docker-compose version 1.25.5, build 1110ad01

详见官方文档

docker-compose.yaml 配置文件修改

  • redis默认不对外开放,不推荐对外开放端口
  • mysql默认对外开放,若需要关闭直接删除端口映射即可
  • nginx和typecho通信过sock,使用顶级卷(V3后volumes_from已经取消使用)共享
  • 默认使用front,back两张网卡,使前端和数据库分离

初始化配置文件

mkdir -p nginx/{certs,conf.d,www}
cp conf/nginx.conf nginx/
cp conf/nginx-site-ssl.conf /nginx/conf.d/
#上传解压ssl证书到certs/下面

docker-compose.yaml需注意和修改部分列出

services:
  web.proxy:
    image: nginx:alpine
    container_name: nginx
    hostname: nginx
    restart: always
    ports:
    - 80:80/tcp
    - 443:443/tcp
    volumes:
    #证书路径/etc/nginx/certs在nginx配置文件中用到
    - ./nginx/certs:/etc/nginx/certs
    - ./nginx/conf.d:/etc/nginx/conf.d
    - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    - www-volume:/var/www/html
    - sock-volume:/var/run/php
    networks:
    - front

  db.mysql:
    image: mysql:5.7
    container_name: mysql
    hostname: mysql
    privileged: false
    restart: always
    ports:
    - 3306:3306
    volumes:
    - ./mysql:/var/lib/mysql
    environment:
    #只需修改mysql_root_pass,mysql_typecho_pass 即可
    - MYSQL_ROOT_PASSWORD=mysql_root_pass
    - MYSQL_DATABASE=typecho
    - MYSQL_USER=typecho
    - MYSQL_PASSWORD=mysql_typecho_pass
    networks:
    - back

Nginx配置文件修改

以ssl配置为列

  • 默认开启ipv6
  • 默认开启伪静态
  • 默认关闭图片防盗链
  • ssl算法排除RC4算法

按照//说明修改
nginx/conf.d/nginx-site-ssl.conf

server {
    listen   80; ## listen for ipv4; this line is default and implied
    // ipv6若要关闭,删除即可
    listen   [::]:80 default ipv6only=on; ## listen for ipv6

    # Make site accessible from http://localhost/
    // your_domain_name 修改为你的域名
    #server_name your_domain_name;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    // ipv6若要关闭,删除即可
    listen [::]:443 ssl http2 ipv6only=on; ## listen for ipv6
    # Make site accessible from http://localhost/
    // your_domain_name 修改为你的域名
    #server_name your_domain_name;
    
    root /var/www/html;
    index index.php index.html index.htm;

    # add ssl pem and key
    // your_pem_path 和 your_key_path修改为docker-compose中挂载对应的文件
    ssl_certificate     your_pem_path;
    ssl_certificate_key your_key_path;

    ssl_session_timeout 5m;
    ssl_protocols         TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ecdh_curve        X25519:P-256:P-384:P-521;
    # ssl算法套件排除RC4算法
    ssl_ciphers           ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE+AES128:RSA+AES128:ECDHE+AES256:RSA+AES256:ECDHE+3DES:RSA+3DES;
    ssl_prefer_server_ciphers   on;

    # Add stdout logging
    error_log /dev/stdout info;
    access_log /dev/stdout;

    # block access to sensitive information about git
    location /.git {
           deny all;
           return 403;
        }
    
    #伪静态配置
    # fix login 404 http://docs.typecho.org/faq    
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php$1 last;
    }

    # pass the PHP scripts to FastCGI server listening on socket
    #
    location ~ .*\.php(\/.*)*$ {
        fastcgi_pass backend;
        fastcgi_split_path_info ^(.+?.php)(/.*)$;
        include fastcgi.conf;

    }

    #静态文件默认缓存5天
    location ~* \.(jpg|jpeg|gif|png|css|js|ico|webp|tiff|ttf|svg)$ {
        expires           5d;
    }

    #防盗链配置
    # simple picture anti-theft chain 
    #location ~* \.(jpg|jpeg|gif|bmp|png|ico|svg|webp|mp4|mp3)$ {
    #valid_referers none blocked *.server_name server_name;
    #if ($invalid_referer) {
    #    return 403;
    #}
}

启动服务

docker-compose up -d 

等待拉取镜像完毕,启动后
使用docker-compose查看各个容器的状态

$ docker-compose ps
       Name                     Command               State                    Ports                  
------------------------------------------------------------------------------------------------------
                
nginx                nginx -g daemon off;             Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
redis                docker-entrypoint.sh redis ...   Up      6379/tcp                                
typecho              docker-entrypoint.sh             Up      9000/tcp
mysql                docker-entrypoint.sh mysqld      Up      33060/tcp                                             

访问服务https://server_name/install.php 开始安装typecho

docker的基本使用

#查看正在运行的容器
docker ps
#查看所有的容器
docker ps -a
#启动|停止|重启
docker start|stop|restart typecho
#删除
docker stop typecho && docker rm typecho
#进入容器
docker exec -it typecho bash
#查看容器详细信息
docker inspect typecho

docker-compse 基本使用

#查看正在运行的容器
docker-compse ps
#查看所有的容器
docker-compse ps -a
#启动|停止|重启
docker-compse start|stop|restart web.typecho
#删除
docker-compse stop web.typecho && docker rm web.typecho
#进入容器
docker-compse exec -it web.typecho bash

#运行容器 / 修改docker-compose.yaml 后重新运行
docker-compose up -d

升级服务

自定义/升级php版本

需修改Dockerfile,重构镜像即可快速升级
1.修改Dockerfile

#php:7.3 修改为你需要的版本即可
FROM php:7.3-fpm-alpine

2.重构镜像

docker build -t 镜像名称 .

3.修改docker-compose.yaml

#找到如下两行,把image: 修改成刚才重构镜像的名称
  web.typecho:
    image: typecho:php7.3-fpm

修改后执行
docker-compose up -d

查看容器状态,验证服务即完成

自定义/升级nginx版本

自定义:

修改docker-compose.yaml 中的nginx images即可

升级:

docker stop nginx && docker rm nignx
docker rmi nginx:alpine
docker-compose up -d 

启动完后查看容器状态,

执行命令查看nginx版本是否已更新

docker exec -it nginx sh -c "nginx -v"

ps:

因为docker-compose.yaml中使用的是默认标签latest,无法判断dockerhub中镜像是否与本地上的镜像一致

所以需要更新时候先删除后update

可改为对应版本标签如nginx:1.18.0-alpine

升级typecho

1.快速升级

官网下载最新tar包到服务器

备份主题文件,解压更新即可

2.重新封装镜像

需修改Dockerfile中的TYPECHO_VERSION

然后重构镜像,再docker-compose up -d即可

参数自定义

php 参数

在conf/docker-vars.ini

[Tweak parameter]
cgi.fix_pathinfo=0
upload_max_filesize = 1024M //限制PHP处理上传文件的最大值,此值必须小于post_max_size值
post_max_size = 1024M //限制通过POST方法可以接受的信息最大量
variables_order = "EGPCS"
memory_limit = 512M //设置脚本可以分配的最大内存量,防止失控的脚本独占服务器内存。根据服务器实际情况自定义
output_buffering =on //缓存开启,不开启安装时候会有个错误

[Zend Opcache] //开启php缓存  以下官方配置,一般不修改即可
zend_extension=opcache.so
opcache.enable=1                    //启用opcache
opcache.enable_cli=1                //针对支持CLI版本PHP启动操作码缓存 一般被用来测试和调试
opcache.memory_consumption=128      //共享内存大小, 这个根据你们的需求可调
opcache.interned_strings_buffer=8   //interned string的内存大小, 也可调
opcache.max_accelerated_files=4000  //最大缓存的文件数目
opcache.validate_timestamps=1       //启用时间戳验证,配置opcache.revalidate_freq使用。设置0禁用,则必须手动重置OPcache或重新启动才能清除过期缓存
opcache.revalidate_freq=60          //60s检查一次文件更新
opcache.fast_shutdown=1             //打开快速关闭, 打开这个在PHP Request Shutdown的时候,会收内存的速度会提高
opcache.save_comments=0             //不保存文件/函数的注释

php-fpm 参数

在Dockerfile中

  • 使用sock提高nginx与php-fpm交互速度
  • 使用两个sock解决高负载出现502情况
RUN set -e \
    && cp ${fpm_conf} ${fpm_conf1} \   
# optimize php-fpm config
    && sed -i \
        -e "s/;catch_workers_output\s*=\s*yes/catch_workers_output = yes/g" \
        -e "s/pm.max_children = 5/pm.max_children = 25/g" \
        -e "s/pm.start_servers = 2/pm.start_servers = 10/g" \
        -e "s/pm.min_spare_servers = 1/pm.min_spare_servers = 8/g" \
        -e "s/pm.max_spare_servers = 3/pm.max_spare_servers = 16/g" \
        -e "s/;pm.max_requests = 500/pm.max_requests = 1024/g" \
        -e "s/user = www-data/user = nginx/g" \
        -e "s/group = www-data/group = nginx/g" \
        -e "s/;listen.mode = 0660/listen.mode = 0666/g" \
        -e "s/;listen.owner = www-data/listen.owner = nginx/g" \
        -e "s/;listen.group = www-data/listen.group = nginx/g" \
        -e "s/listen = 127.0.0.1:9000/listen = \/var\/run\/php-fpm1.sock/g" \
        -e "s/^;clear_env = no$/clear_env = no/" \
        ${fpm_conf1} \
    && cp ${fpm_conf1} ${fpm_conf2} \
    && sed -i "s/php-fpm1.sock/php-fpm2.sock/" ${fpm_conf2}

进程数

  • 首先,我们关注一个前提设置: pm = static/dynamic,标识fpm子进程的产生模式
  • static(静态) :表示在fpm运行时直接fork出pm.max_chindren个worker进程
  • dynamic(动态):表示运行时fork出start_servers个进程,随着负载的情况,动态的调整,最多不超过max_children个进程。

推荐用static,优点是不用动态的判断负载情况,提升性能,缺点是多占用些系统内存资源。

static:worker进程pm.max_children = 300这个值原则上是越大越好
dynamic:worker进程pm.start_servers = 20
dynamic:空闲状态pm.min_spare_servers = 5最小php-fpm进程数量
dynamic:空闲状态pm.max_spare_servers = 35最大php-fpm进程数量

max_children

  • 这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。
  • 设置”max_children”也需要根据服务器的性能进行设定
  • 一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右
  • 假设“max_children”设置成100个,20M*100=2000M
  • 也就是说在峰值的时候所有PHP-CGI所耗内存在2000M以内。
  • 假设“max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。
  • 如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。

start_servers

  • pm.start_servers的默认值为2。并且php-fpm中给的计算方式也为:
    {(cpu空闲时等待连接的php的最小子进程数) + (cpu空闲时等待连接的php的最大子进程数 - cpu空闲时等待连接的php的最小子进程数)/ 2};
  • 用配置表示就是:min_spare_servers + (max_spare_servers - min_spare_servers) / 2;
  • 一般而言,设置成10-20之间的数据足够满足需求了。

max_requests

最大请求数

最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn一个新的。
这个配置的主要目的是避免php解释器或程序引用的第三方库造成的内存泄露。
pm.max_requests = 10240

  • 当一个 PHP-CGI 进程处理的请求数累积到 max_requests 个后,自动重启该进程。
  • 502,是后端 PHP-FPM 不可用造成的,间歇性的502一般认为是由于 PHP-FPM 进程重启造成的.
  • 但是为什么要重启进程呢?
  • 如果不定期重启 PHP-CGI 进程,势必造成内存使用量不断增长(比如第三方库有问题等)。因此 PHP-FPM 作为 PHP-CGI 的管理器,提供了这么一项监控功能,对请求达到指定次数的 PHP-CGI 进程进行重启,保证内存使用量不增长。
  • 正是因为这个机制,在高并发中,经常导致 502 错误
  • 目前我们解决方案是把这个值尽量设置大些,减少 PHP-CGI 重新 SPAWN 的次数,同时也能提高总体性能。PS:刚开始我们是500导致内存飙高,现在改成5120,当然可以再大一些,10240等,这个主要看测试结果,如果没有内存泄漏等问题,可以再大一些。

php-fpm优化原文链接

nginx参数

在conf/nginx.conf

    # hidden nginx version number
    server_tokens off;

    # open gzip
    gzip on; 
    gzip_disable "msie6"; 
    gzip_vary on; 
    gzip_proxied any; 
    gzip_comp_level 6; 
    gzip_min_length 1100; 
    gzip_buffers 16 8k; 
    gzip_http_version 1.1; 
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;    

    # cache access frequency of high file
    open_file_cache max=2000 inactive=20s; 
    open_file_cache_valid 60s; 
    open_file_cache_min_uses 5; 
    open_file_cache_errors off;

    # adjust the client timeout
    client_max_body_size 50M; 
    client_body_buffer_size 1m; 
    client_body_timeout 15; 
    client_header_timeout 15; 
    keepalive_timeout 2 2; 
    send_timeout 15; 
    sendfile on; 
    tcp_nopush on; 
    tcp_nodelay on;

    # adjust the output buffer
    fastcgi_buffers 256 16k; 
    fastcgi_buffer_size 128k; 
    fastcgi_connect_timeout 3s; 
    fastcgi_send_timeout 120s; 
    fastcgi_read_timeout 120s; 
    fastcgi_busy_buffers_size 256k; 
    fastcgi_temp_file_write_size 256k; 
    reset_timedout_connection on; 
    server_names_hash_bucket_size 100;
    
    # anti_spider
    #if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {  
    #    return 403;  
    #}  
    #if ($http_user_agent ~ "WinHttp|WebZIP|FetchURL|node-superagent|java/|FeedDemon|Jullo|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|Java|Feedly|Apache-HttpAsyncClient|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|BOT/0.1|YandexBot|FlightDeckReports|Linguee Bot|^$" ) { 
    #    return 403;              
    #}     
    #if ($request_method !~ ^(GET|HEAD|POST)$) { 
    #    return 403; 
    #}

开启redis缓存

Tpcache

https://github.com/wloot/TpCache

安装主题后,使用Tpcache缓存插件

cd /typecho/nginx/html/usr/plugins
git clone https://github.com/wloot/TpCache

在typecho后台插件管理设置即可

20200525174316.png

修复TpCache缓存评论者个人信息的问题

这个插件有些许bug

首先编辑/usr/themes/你的主题/component/comments.php文件

分别找到这三个语句删除即可。记得先备份comments.php:

<?php $this->remember('author'); ?> --这条有两个地方
<?php $this->remember('mail'); ?>
<?php $this->remember('url'); ?>

找到下列语句;

<div id="author_info" class="hide">

并修改为:

<div id="author_info">

然后再在底部插入以下代码:

<script>
<?php if(!$this->user->hasLogin()){ ?>
function getCookie(name){
    var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
    if(arr=document.cookie.match(reg))
        return unescape(decodeURI(arr[2]));
    else
        return null;
    }
function adduser(){   
    document.getElementById('author').value = getCookie('<?php echo md5($this->request->getUrlPrefix()); ?>__typecho_remember_author');
    document.getElementById('mail').value = getCookie('<?php echo md5($this->request->getUrlPrefix()); ?>__typecho_remember_mail');
    document.getElementById('url').value = getCookie('<?php echo md5($this->request->getUrlPrefix()); ?>__typecho_remember_url');
}
adduser();
<?php } ?>
</script>

保存即可。

redis数据基本操作

进入容器并登陆redis

数据库默认使用0

$docker exec -it redis bash
[email protected]:/data# redis-cli
127.0.0.1:6379> select 1
127.0.0.1:6379> keys *
1) "/"
2) "/article/560.html"

选择数据库默认使用0(0-16)

select 0

查看所有keys

keys *

查看key 的value

get /

刷新数据库

FLUSHDB

贡献者

Author:

Email: [email protected]

Link: https://www.leonisir.com/

Last modification:May 25th, 2020 at 10:36 pm
如果觉得我的文章对你有用,请随意赞赏