[连载][初步完结] 在安卓Termux中安装虎绿林网站程序
『回复列表(152|显示机器人聊天)』
为了防止附件过期,现贴出步骤12中nginx.conf
文件的全部内容:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 8080;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /data/data/com.termux/files/usr/share/nginx/html;
index index.html index.htm 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 /data/data/com.termux/files/usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ [^/]\.php(/|$) {
root /data/data/com.termux/files/usr/share/nginx/html;
fastcgi_pass unix:/data/data/com.termux/files/usr/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
# parse and set $_SERVER['PATH_INFO']
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
步骤13:创建配置文件
请点查看全部,否则可能会错过操作。
看看网站现在的状态:
curl -v http://localhost:8080/
嗯,说配置文件不存在。
那么我们执行初始化脚本创建一下:
php ~/hu60wap6/src/script/init.php
然后再看看网站现在的状态:
curl -v http://localhost:8080/
嗯,一堆报错。
实际访问一下:
http://localhost:8080/?r=12345
加?r=数字
是为了防止浏览器缓存。
步骤14:确认装好了PHP。
为什么有一堆报错?还记得我说的步骤1吗?虎绿林程序目前用PHP8.1打开就是会有这么多报错。
为了确认你确实装好了PHP,你可以执行以下命令:
echo '<?php phpinfo();' > ~/hu60wap6/src/phpinfo.php
然后访问这个地址:
http://localhost:8080/phpinfo.php/path-info/test
嗯,确实装好了。
但是要想打开虎绿林程序,就只能等我的步骤1完成了。
注意:请先执行步骤13。如果你没有执行过php ~/hu60wap6/src/script/init.php
,说明你错过了步骤13。如果你先执行了步骤15,请在执行步骤13后再次执行步骤15。
步骤15:修改配置文件中的无效路径。
同样是php8.1,dev.hu60.cn可以打开,只是有一堆警告:
https://dev.hu60.cn/q.php/
那为什么Termux上的打不开?看起来问题不是因为不兼容。
报错发生在cc.php
,是文件打开失败。
哦,是配置的问题!cc.php
默认写入位置在/dev/shm/
和/tmp/
,安卓写不了。
执行以下命令替换写入路径为~/hu60wap6/src/temp/
:
sed -i "s#'/dev/shm/#ROOT_DIR.'/temp/#g" ~/hu60wap6/src/config/security.php
sed -i "s#'/tmp/#ROOT_DIR.'/temp/#g" ~/hu60wap6/src/config/security.php
mkdir ~/hu60wap6/src/temp/
然后再访问看看:
哈,变成打不开数据库错误了。看起来修复配置中的无效路径完成了。
设置好后台运行之后,把nginx、mysql和php-fpm都启动一下,就可以执行后续步骤了。命令:
# 启动mysql
~/../usr/etc/init.d/mysql start
# 启动nginx
nginx
# 启动php-fpm
php-fpm
请忽略所有报错,报错肯定是因为程序已经在运行。
执行完成后,用pstree
检查是否所有组件都在运行。
pstree
这是正确的结果。请忽略上面显示的数字,数字可能是任何值。只要mysql
、nginx
和php-fpm
都出现就可以:
注意:请先执行步骤13。如果你没有执行过php ~/hu60wap6/src/script/init.php
,说明你错过了步骤13。如果你先执行了步骤16,请在执行步骤13后再次执行步骤16。
步骤16:修复数据库打不开问题
打不开数据库的原因是No such file or directory
,为什么PHP连接数据库,不说端口无法访问,却报错说文件不存在?
原来连接本地数据库(localhost
)并不会走网络,走的是文件(本地unix套接字),文件在这里:
ls一下就会发现文件真的不存在:
ls /data/data/com.termux/files/usr/tmp/mysqld.sock
而且就算修改配置让mysql把这个文件创建出来,最后也不能正常使用。看起来是mysql的unix套接字和安卓有兼容性问题(php-fpm却没有,奇怪)。
所以只能退而求其次,让PHP去连接3306端口。执行以下命令:
sed -i "s/'localhost'/'127.0.0.1'/g" ~/hu60wap6/src/config/db.php
此外我们还需要修改连接数据库的用户名和密码,默认是root
和root
,但我们创建的是hu60
和hu60
。执行以下命令:
sed -i "s/'root'/'hu60'/g" ~/hu60wap6/src/config/db.php
步骤17:给 uid 1 版主权限,解决待审核问题。
执行mysql
命令:
mysql
再执行以下SQL语句:
-- 切换到数据库hu60
use hu60;
-- 默认不需要审核
alter table hu60_user change permission permission int unsigned not null default 0;
-- 给 uid 1 审核权限
update hu60_user set permission=177 where uid=1;
-- 退出MySQL命令
exit;
执行完之后你就可以审核自己的帖子了。由于报错,只有上面的审核按钮能用,下面的不能用,并且点击后不会自动返回,得自己返回刷新。
报错明天修复。
因为修改了权限,后续发帖不再需要审核。
创建一个启动脚本:
cat > ~/run.sh <<EOF
# 启动mysql
~/../usr/etc/init.d/mysql start
# 启动nginx
nginx
# 启动php-fpm
php-fpm
# 检查是否启动成功
pstree
EOF
给执行权限:
chmod +x ~/run.sh
启动网站:
~/run.sh
以后每次要启动网站,执行~/run.sh
即可。
创建一个停止脚本:
cat > ~/stop.sh <<EOF
# 结束网站进程
killall php-fpm nginx mariadbd
# 等待进程结束
sleep 1
# 检查
pstree
EOF
给执行权限:
chmod +x ~/stop.sh
停止网站:
~/stop.sh
以后每次要停止网站,运行~/stop.sh
即可。
问题:为什么是mariadbd?
回答1:这是我们从pstree里面看到的进程名称。
回答2:结尾的d表示这是一个守护进程(daemon),很多服务进程都会这么命名,比如httpd、crond。
问题:为什么不用~/../usr/etc/init.d/mysql stop
?
回答:亲测无效,报错说找不到pid。所以还是用killall吧。
问题:killall会不会导致数据损坏?
不会,因为它并不是强行停止进程,而是给进程发信号要它主动停止运行。所以进程是有机会正常退出的。如果进程真的卡住了,那就算执行了killall也不会退出,你就会知道它卡住了。
如果进程真的卡住了,可以用killall -9 进程名
来结束进程,注意这可以导致数据损坏,因为进程没有任何机会正常退出,就算进程没有卡住也没机会。
创建好~/run.sh
之后,再执行以下命令即可加入自启动:
echo ~/run.sh > ~/.profile
如何测试?
成功自启。
取消自启:
rm ~/.profile
~
是什么?~
是主目录的简写。在Termux中,主目录是/data/data/com.termux/files/home
,太长了。还好我们可以用~
代替。你每写一个~
,就相当于写下了/data/data/com.termux/files/home
。
注意,~
不能用在引号中,否则会失去代表主目录的效果,就变成了~
字符本身。单引号双引号都不可以。
用$HOME
代替。注意只能用在双引号里。单引号里不支持任何代替方式,只能写完整路径。
/data/data/com.termux/files/home
?图中的三种方法可以确定:
cd
是什么?change directory(改变目录)
你可以cd
到其他目录看看:
..
表示上级目录,可以级联,比如../..
上两级目录。
start.sh
执行脚本,必须用~/start.sh
?这是一个安全措施。假设你解压了一个压缩包,想执行ls
看看里面有什么,结果别有用心的人往里面放了一个可执行文件ls
,一执行是一个勒索病毒,那不就糟了。
所以当你不指定路径时,只会执行在PATH
环境变量中列出的那些文件夹里面的可执行文件和脚本。主目录不在PATH
环境变量中,所以必须指定路径才能执行。
指定路径有两种方法,一种是绝对路径,无论你cd到了哪里都能执行成功:
~/start.sh
还有一种是相对路径:
./start.sh
你必须先cd到主目录才能执行成功,否则就找不到文件,因为它表示当前目录内的start.sh
echo $PATH
默认就一个文件夹,但是也可以设置为冒号分隔的多个文件夹。具体就不讲了,你可以自己搜索资料。
location ~* \.php$ {
……
}
改成(路径自己替换。如果想让别人帮忙替换,应该发文字而不是截图):
location ~ [^/]\.php(/|$) {
root /data/data/com.termux/files/usr/share/nginx/html;
fastcgi_pass unix:/data/data/com.termux/files/usr/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
# parse and set $_SERVER['PATH_INFO']
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
}