Rootop 服务器运维与web架构

2019-12-10
发表者 Venus
php网站访问提示No input file specified已关闭评论

php网站访问提示No input file specified

访问网站首页index.php提示错误:
No input file specified.

wordpress提示的错误,其实这个错误不仅仅在wp框架下出来,任何php程序都会出现,
我这里出现这个问题是由于开启防跨目录功能导致,此功能一般是防止恶意代码写入到其他网站目录文件,导致挂马之类的攻击。
这个功能由open_basedir参数控制。在php.ini里可配置,在每个网站根目录下的.user.ini也可以配置。
参考:https://www.php.net/manual/zh/configuration.file.per-user.php

查看下此站的 .user.ini 文件:

root@rootop:/home/web/test.rootop.org# cat .user.ini 
open_basedir=/www/wwwroot/test.rootop.org:/tmp

查看php.ini配置:

root@rootop:/etc/php/7.2/fpm# cat php.ini | grep user.ini
; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini"
;user_ini.filename = ".user.ini"
;user_ini.filename =
;user_ini.cache_ttl = 300

在nginx中日志会体现为:

2019/12/10 17:55:28 [error] 25190#0: *1062213 FastCGI sent in stderr: "PHP message: PHP Warning:  Unknown: open_basedir restriction in effect. File(/home/web/test.rootop.org/index.php) is not within the allowed path(s): (/www/wwwroot/test.rootop.org:/tmp) in Unknown on line 0
PHP message: PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on line 0
Unable to open primary script: /home/web/test.rootop.org/index.php (Operation not permitted)" while reading response header from upstream, client: 223.104.210.230, server: test.rootop.org, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.2-fpm.sock:", host: "test.rootop.org"

解决方法:
要么直接删除.user.ini,要么修改为正确的防跨目录路径(正确的网站目录路径)。

另外出现此错误,也有可能是其他原因导致,需要从日志里排查。

2019-12-10
发表者 Venus
centos修改密码提示 authentication token manipulation error已关闭评论

centos修改密码提示 authentication token manipulation error

在centos单用户模式下修改root密码提示错误:
authentication token manipulation error

分析是修改密码时要去修改/etc/shadow文件,但是此文件可能出现问题,不能被修改,查看特殊权限(lsattr)里面被添加了一个a位
a位代表append only,只能追加数据,不能修改数据,所以修改密码时报错。

测试a位作用:

root@rootop:~# touch a
root@rootop:~# chattr +a a
root@rootop:~# lsattr a
-----a--------e--- a
root@rootop:~# echo a > a
-bash: a: Operation not permitted
# 提示操作不允许
root@rootop:~# echo a >> a
root@rootop:~# cat a
a
# 追加数据可以

上面a文件的e位在man文档中解释:
extent format (e)
The ‘e’ attribute indicates that the file is using extents for mapping the blocks on disk. It may not be removed using chattr(1).
“e”属性位表示文件正在使用区段映射磁盘上的块。不能使用chattr删除此位。

所以上面的问题,通过chattr去掉a位权限即可。
为什么会多出来个a位权限?
排查是服务器被黑了。

2019-12-10
发表者 Venus
关于php中的opcache缓存已关闭评论

关于php中的opcache缓存

opcache 参数配置及解释:
参考 https://www.cnblogs.com/lamp01/p/8985068.html
opcache 原理及缓存哪些代码:
参考 https://www.awaimai.com/2684.html

opcache在php7.0之前需要单独安装,之后自带。

php.ini几个主要配置:

# 开启缓存,默认此行已经注释掉,默认为开启状态,0为关闭。
opcache.enable=1
# 检查文件是否更新,0为不检查,表示为一直不过期,即使更新代码也不变,除非重启服务或手动刷新。
opcache.validate_timestamps=1
# 缓存过期时间,单位秒
opcache.revalidate_freq=60

即:validate_timestamps=1时,则会在revalidate_freq=60秒后再去检查脚本是否变化,如有变化则更新缓存。
更多的配置参数查看上面链接。

ps:
opcache的相关配置参数状态可以通过phpinfo()函数获取。

测试效果,创建个1.php:
这里直接返回一个字符串。

<?php
echo 'aaa';

然后用浏览器访问后返回aaa,再去修改php文件

<?php
echo 'aaabbb';

浏览器刷新,依旧是显示aaa,表明opcache生效,60秒后访问才变为aaabbb。

之所以测试这个opcache功能是因为有群友问苹果cms后台添加内容后,前端页面不显示添加的内容。
需要过一段时间后才出现。查资料说是opcache导致的。
怀疑是此cms自己生成了前端缓存页面,比如xxx.php做为前端的缓存,不用每次生成,后台更新后,xxx.php虽然更新了,但是opcache缓存还没刷新导致。

2019-12-09
发表者 Venus
关于hls访问m3u8(HTTP Live Streaming)变成下载的问题整理已关闭评论

关于hls访问m3u8(HTTP Live Streaming)变成下载的问题整理

hls是基于http协议的流媒体,在移动端中可以直接播放,测试包括QQ,安卓下的chrome、安卓下的搜狗浏览器都可以直接播放m3u8视频。


但是接到反馈,另一台机器上的m3u8在移动端访问变成下载,而不是直接播放。

通过查看返回的响应头中content-type 为 application/octet-stream


这是mime中默认的,在找不到相对应的content-type时,nginx会返回默认的content-type类型。
正常来说需要返回application/vnd.apple.mpegurl才是正确的。这样才能支持移动端直接播放。

这里加了个location,再添加个文件类型

location /hls
{
	add_header 'Access-Control-Allow-Origin' '*';
	add_header 'Access-Control-Allow-Credentials' 'true';
	add_header 'Access-Control-Allow-Methods' 'GET';
	add_header 'Cache-Control' 'no-cache';
	
	types
	{
		application/vnd.apple.mpegurl m3u8;
		video/mp2t ts;
	}
}

mime介绍:
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。
服务器(nginx)会根据客户端请求的资源文件扩展名,然后去对照mime.types文件找对应的content-type,在响应头中返回给客户端。
自己添加一条mime测试一下。

root@rootop:/home/software/openresty/nginx/conf# vi mime.types
types {
	· 略过已有配置
	application/user_define_type		     rootop;
}

在网站根目录下创建一个1.rootop文件,浏览器访问,查看响应头。

2019-12-02
发表者 Venus
apache 与 php-fpm 几种处理方式已关闭评论

apache 与 php-fpm 几种处理方式

查了下apache和php-fpm结合的几种方式,记录一下。

csdn资料:https://blog.csdn.net/qq_21956483/article/details/82847744
apache官网文档:https://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html

# 1、SetHandler 方式
# php-fpm监听socket文件

<FilesMatch \.php$>
	SetHandler "proxy:unix:/tmp/php-fpm.sock|fcgi://localhost"
</FilesMatch>

# php-fpm监听端口

<FilesMatch \.php$>
	SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

# 2、ProxyPassMatch方式 需要在每个 “VirtualHost” 里面加入

<VirtualHost *:80>
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/path/to/your/documentroot/$1
DirectoryIndex /index.php
</VirtualHost>

# 3、ProxyPass方式 跟ProxyPassMatch 类似 ,需要在每个 VirtualHost 中分别设置

<LocationMatch ^(.*\.php)$>
ProxyPass fcgi://127.0.0.1:9000/path/to/webroot/
ProxyErrorOverride on
</LocationMatch>