简易的,简单又实用的动态域名管理系统

写在前面。谢谢 WordPress 主人 John 提供的空间,让我写下这个笔记。
———————
我在家的宽带上自建了台服务器。可是宽带拨号上网,IP不固定。想在网上找个免费的动态域名,注册极为麻烦,还要绑手机。放弃了。
想到自己有个域名,也有个VPS主机 (固定IP)。不如自己搞个动态域名用把。
———————-
自己的域名,比如 “testtest.info”,VPS主机的IP,”比如 1.2.3.4″。
去域名解析控制台,添加一条二级域名的NS记录,指向自己的VPS主机。
因为NS记录不能直接写IP。所以实际要添加两条记录。
比如:
dd.testtest.info.   ns   mydns.testtest.info
mydns.testtest.info.   A   1.2.3.4

这样就可以用三级域名做自己的动态域名了。
比如:www.dd.testtest.info
lala.dd.testtest.info
———————
VPS主机,我装的是CentOS7。系统安装好之后。
yum  install  bind-chroot  bind-utils   # bind老是出漏洞,装个chroot版感觉安全点。
修改配置文件 /etc/named.conf
options  {
listen-on port 53 { 127.0.0.1; any; };
listen-on-v6 port 53 { ::1; any; };
allow-query { localhost; any; };
recursion no; /* 关闭了所有的axfr,如要allow-recursion生效,必须为yes */
allow-recursion { localhost; };
allow-transfer { localhost; };
};
# 以上条目,原来有的保留。不相同的就修改。原来没有的就添加。

添加一个zone,在 /etc/named.rfc1912.zones 文件最后,添加:
zone “dd.testtest.info” IN {
type master;
file “dynamic/named.dd.testtest.info”;
allow-update { localhost; };
};
// 要求 named 对 dynamic/ 目录有写权限
// nsupdate 时会生成 named.dd.testtest.info.jnl
// named.service stop 时会改写 named.dd.testtest.info 文件

创建zone的初始解析文件, /var/named/dynamic/named.dd.testtest.info
如果 /var/named/dynamic目录不存在,就先启动一下 service  named-chroot  start
$TTL   600
@   IN  SOA   mydns.testtest.info.    email.invalid (1234  86400  3600  604800  10800)
@   NS    mydns.testtest.info.
@   A   1.2.3.4

service   named-chroot   stop;
service   named-chroot   start;
systemctl   enable   named-chroot;
#检查防火墙开放了 udp/53 的访问。
iptables   -A   INPUT   -p  udp   –dport  53   -j  ACCEPT   #一般查询用
iptables   -A   INPUT   -p  tcp   –dport  53   -j  ACCEPT    # axfr 用
———————-
下载: my-ddns-by-osn-20180824.tar.gz
解压,按照里头的 readme.php 的说明文件配置。就可以用了。
大致步骤是,
* 在MySQL中创建数据库,创建一张表,
* 修改配置文件 mysqli_new_db.php,  config.php
* 创建一条 crontab 定时任务。2分钟执行一次。
* 测试一下,就能用了。
————————————
使用方法(两种方法):
1.自动获取客户端IP,定时访问 http://testtest.info/ddns/ddns.php?key=xxxxxxxxx&domain=lala
2.强制指定IP,定时访问 http://testtest.info/ddns/ddns.php?key=xxxxxxxxx&domain=lala&ip=5.6.7.8
建议每10-15分钟访问一次更新链接。超过60分钟未更新,对应域名重置为127.0.0.1
——– osn 写于 20180824 —–
——— 完 ———–

wordpress无法上传pdf提示http error

找了很久,之前怀疑是因为文件大小限制,改到128仍然不行,找到一些文章说是因为限制了文件类型,要改源代码,当然是不科学的,直接冲进插件库搜file type,就找到了好东西

装插件:WP Extra File Types

Activate

settings>Extra File Types

勾上需要的,,保存,完工

还没完,搜了一圈发现没有pdf,还得自己动手在最下面添加自定义的:

保存,还是不行……

按照找了一圈后的发现,先手动用sftp上传到了服务器,然后用Add From Server

塞进media Library里,可以先用了


最后终于找到问题的根源了:不知道什么时候手贱装了mod_security,看了/var/log/httpd/error_log,看到ModSecurity: Access denied with code 44 (phase 2). Match of “eq 0” against “MULTIPART_UNMATCHED_BOUNDARY” required.,然后就明朗了

bitnami/php-fpm:5.6配置

感谢一位朋友(osn)帮助建立了多版本php环境(php5-fpm和php7-fpm共存),centos7+nginx+php-fpm7.1。这个环境下需要用到5.6版本的PHP。直接用yum装5.6版,会和之前装的7.1冲突。所以只好让PHP5跑在docker里了。下面是配置说明。

参考这个说明,如果系统跑php5.6,docker中跑php7,也可以。
或者用docker跑多个版本的php也行。

centos7安装后,用epel源安装nginx1.12,然后用webtatic源装php71w-fpm和php71w-cli。然后装了很多php71w-gd,php71w-pdo,…..的php支持。
php7在nginx的配置,支持PATH_INFO:
创建文件:/etc/nginx/default.d/php71w-fpm.conf
————–
location ~ \.php($|/) {
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
fastcgi_split_path_info   ^(.+?\.php)(/.*)$;   # 非贪婪匹配
if (!-e   $document_root$fastcgi_script_name) {
return   404;
}
fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
fastcgi_param  PATH_INFO   $fastcgi_path_info  if_not_empty;
include   fastcgi_params;
}
————–

docker是用自带源(extras)  yum安装的。

php的docker镜像有很多。选择了bitnami/php-fpm。因为他的images体积小,才200多MB,版本齐,5.6, 7.0, 7.1, 7.2都有。

这个镜像的说明:
https://store.docker.com/community/images/bitnami/php-fpm
拉取镜像,指定php5.6版本,执行:
docker pull bitnami/php-fpm:5.6
测试容器,先启动起来看看,9000已经被7.1占用,5.6映射到9001:
docker run -d –name phpfpm56 -v /data/web/php5:/app/web/php5 -p 127.0.0.1:9001:9000 bitnami/php-fpm:5.6
我的nginx网站的 root是 /data/web
修改nginx的配置,增加php5.6在目录/data/web/php5/的支持。
在server{  }中添加一个location{  }。这个配置是支持php的PATH_INFO的。
我把配置写在独立文件中了,然后在nginx配置中 include 进去。
我的例子:server {
listen ….
server_name ….
root …..
include /data/config/nginx/phpfpm56.conf;   <—-加了这行
…….
}
我的独立配置文件为 /data/config/nginx/phpfpm56.conf  内容如下。
————–
location /php5/ {
location ~ \.php($|/) {
fastcgi_pass   127.0.0.1:9001;
fastcgi_index  index.php;
fastcgi_split_path_info   ^(.+?\.php)(/.*)$;   # 非贪婪匹配
if (!-e   $document_root$fastcgi_script_name) {
return   404;
}
fastcgi_param  SCRIPT_FILENAME   /app/web$fastcgi_script_name;
#fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
fastcgi_param  PATH_INFO   $fastcgi_path_info  if_not_empty;
include   fastcgi_params;
fastcgi_param  DOCUMENT_ROOT   /app/web;
}
}
————–
建个文件 /data/web/php5/info.php   内容为 <?php   phpinfo(); ?>
浏览器访问 http://你的站/php5/info.php ,如果看到,说明成功了。
—————-
正式配置php-fpm5.6:
把php-fpm56 的配置文件copy到宿主机上,方便修改配置。
之前测试,启动的phpfpm56的容器,先别关。
cd /data/config/phpfpm56/    # 这个目录是宿主机上的目录,把配置文件copy出来。
docker cp phpfpm56:/opt/bitnami/php/etc/php-fpm.conf .
docker cp phpfpm56:/opt/bitnami/php/etc/environment.conf .
docker cp phpfpm56:/opt/bitnami/php/etc/common.conf .
docker cp phpfpm56:/opt/bitnami/php/etc/php.ini .

——–
如果以后需要进入容器,以apache的身份执行命令(因为容器里头没有sudo),则做,否则跳过。
docker cp phpfpm56:/etc/passwd .
#增加一行, apache:x:48:48:apache:/app:/bin/bash
docker cp passwd phpfpm56:/etc/passwd
# 就可以在container中su apache 了
——–

#host机上的配置文件,刚才从容器中copy出来的。
/data/config/phpfpm56/common.conf
/data/config/phpfpm56/environment.conf
/data/config/phpfpm56/php-fpm.conf
/data/config/phpfpm56/www.conf     #如果需要,自行创建
/opt/bitnami/php/etc/php.ini
# 以上配置文件中,对log的配置(我在php-fpm.conf中配置了log输出,具体配置不贴出来了)
/opt/bitnami/php/logs/phpfpm56-error.log
/opt/bitnami/php/logs/phpfpm56-www-slow.log
/opt/bitnami/php/logs/phpfpm56-www.log
—————
## 未使用的配置
# common.conf 中就是 user=48   group=48 两行。一般php-fpm都以apache身份运行。
-v /data/config/phpfpm56/common.conf:/opt/bitnami/php/etc/common.conf \   # 抛弃。因内容直接写入 www.conf 或 php-fpm.conf 了
# 这个www.conf 我没用到。
-v /data/config/phpfpm56/www.conf:/opt/bitnami/php/etc/www.conf:ro \
# 这个配置应该可以获取到宿主机的IP。但失败了,不知道为什么。所以没用它。直接把IP写参数里了。
$(docker network inspect –format='{{range .IPAM.Config}}{{.Gateway}}{{end}}’ bridge)
—————
docker container stop phpfpm56       # 停止container
docker rm phpfpm56                          # 删除container
# 重建container
docker run -d –name phpfpm56 \
–add-host=mainhost:172.17.0.1 \    <—-宿主机的机器名, IP.
–restart always \
-v /data/config/phpfpm56/php-fpm.conf:/opt/bitnami/php/etc/php-fpm.conf:ro \
-v /data/config/phpfpm56/php.ini:/opt/bitnami/php/etc/php.ini:ro \
-v /var/log/phpfpm56:/opt/bitnami/php/logs \
-v /data/web:/app/web \        <—-直接把网站的root映射到容器中。
-p 127.0.0.1:9001:9000   bitnami/php-fpm:5.6
# 设置容器开机自动启动。
docker update –restart always phpfpm56
# 检查 iptables 规则,允许container访问mysql, 检查mysql用户可以从 172.17.0.% 登陆和访问数据库。
# 下面这句,是用来进入容器执行命令的。
docker container exec -it phpfpm56 /bin/bash
—————
增加php5.6的工作目录, 比如 /data/web/newphp56
1. 修改 /data/config/nginx/phpfpm56.conf , 增加一个 location /newphp56/ {  } 配置, 内容copy前一个location的。
2. service nginx reload
注: php5.6-docker 中访问主机的MySQL,使用机器名, mysql-hostname:’mainhost’,
比如: $db=new mysqli(‘mainhost’,’用户名’,’密码’,’db name’);
或(不建议直接用IP): $db=new mysqli(‘172.17.0.1′,’用户名’,’密码’,’db name’);
因为如果容器迁移,宿主机的IP有可能会改变。
—————
或者把location 中的关于php5.6的配置,单独写到一个文件中。比如 /xxx/handlephp56.conf
需要增加那个目录 就写:
location /xxxx/ {
include /xxx/handlephp56.conf;
}
重启nginx,就行了。
—————