Openwrt luci+nginx+uwsgi+php超详细教程无坑配置

K3,就是当年的斐xun K3,原本计划更换个路由器,但是实际上从个人需求、设备功耗、配置、宜用、美观来看,貌似也都没有什么值得替换的必要,作为旁路的辅助路由器(上级还有其他路由器负责net),发布服务或许更合适一些,而且做固件的人也多,向我这么懒的老一代程序员,对于能懒就懒来说,越简单越好。

当前版本
Openwrt  Mster 内核基于Linux version 4.19.138  (gcc version 8.4.0 (OpenWrt GCC 8.4.0 r3066-0de1301c5)) 

nginx/1.19.6

为什么内核没用5.4及更高的版本,而是继续选择4的版本主要是图一个稳定,外加5.4usb存储有问题,以及一些莫名其妙的问题,同样功耗还高。

nginx1.19 这个版本相对比较新,而且ssl、cgi环境相对完整,对于用户来说,省了很多麻烦。

uhtptd是一个很好用的httpserver,我用这个服务发布了2年,很稳定,犹豫需求变更,所以改用nginx,本人以前玩apache的,而对于nginx的结构不是很清楚,但是当第一眼看到坑的时候,就意味着后面的路不好走。

软件源

src/gz openwrt_core https://mirrors.cloud.tencent.com/lede/snapshots/targets/bcm53xx/generic/packages
src/gz openwrt_base https://mirrors.cloud.tencent.com/lede/snapshots/packages/arm_cortex-a9/base
src/gz openwrt_freifunk https://mirrors.cloud.tencent.com/lede/snapshots/packages/arm_cortex-a9/freifunk
src/gz openwrt_helloworld https://mirrors.cloud.tencent.com/lede/snapshots/packages/arm_cortex-a9/helloworld
src/gz openwrt_luci https://mirrors.cloud.tencent.com/lede/releases/19.07.7/packages/arm_cortex-a9/luci
src/gz openwrt_packages https://mirrors.cloud.tencent.com/lede/snapshots/packages/arm_cortex-a9/packages
src/gz openwrt_routing https://mirrors.cloud.tencent.com/lede/snapshots/packages/arm_cortex-a9/routing
src/gz openwrt_telephony https://mirrors.cloud.tencent.com/lede/snapshots/packages/arm_cortex-a9/telephony

自定义

src/gz bopenwrt_core https://mirror.tuna.tsinghua.edu.cn/lede/releases/19.07.7/targets/bcm53xx/generic/packages/
src/gz bopenwrt_base https://mirror.tuna.tsinghua.edu.cn/lede/releases/19.07.7/packages/arm_cortex-a9/base/
src/gz bopenwrt_luci https://mirror.tuna.tsinghua.edu.cn/lede/releases/19.07.7/packages/arm_cortex-a9/luci
src/gz bopenwrt_packages https://mirror.tuna.tsinghua.edu.cn/lede/releases/19.07.7/packages/arm_cortex-a9/packages
src/gz bopenwrt_routing https://mirror.tuna.tsinghua.edu.cn/lede/releases/19.07.7/packages/arm_cortex-a9/routing

自定义用的源比较老,因为老的程序相对来说更加稳定,而且通常向下兼容

正文开始:

基于uhttpd的Lcui,先安装 nginx nginx-mod-luci nginx-ssl 这三个 (版本 1.19.6),以及nginx-util 和 nginx-ssl-util,原则上只要能装上,就没有依赖关系,这点就不多说了


安装nginx

opkg update

opkg install nginx nginx-mod-luci nginx-ssl nginx-util nginx-ssl-util

安装php

opkg install php7 php7-cgi php7-fpm php7-mod-ctype php7-mod-curl php7-mod-exif php7-mod-filter php7-mod-gd php7-mod-iconv php7-mod-json php7-mod-ldap php7-mod-mbstring php7-mod-pdo php7-mod-session php7-mod-xml

这里要注意,php以及所有的mod的版本都是7.4.21-1,源已经被更新。

最新版本是7.4.22-1 更新时间为2021年8月1日,由于官方稳定版和开发板都同步更新,且php7-fpm都存在bug,本人于8月3日左右提交了bug报告,目前8月8日,程序已经跟新,且已经正常,如果您在安装时已经不是本版内容,请跟新城我缓存的openwrt源。

src/gz openwrt_core https://i.qsis.cn:88/openwrt/mirrors.cloud.tencent.com/lede/snapshots/targets/bcm53xx/generic/packages
src/gz openwrt_base https://i.qsis.cn:88/openwrt/mirrors.cloud.tencent.com/lede/snapshots/packages/arm_cortex-a9/base
src/gz openwrt_freifunk https://i.qsis.cn:88/openwrt/mirrors.cloud.tencent.com/lede/snapshots/packages/arm_cortex-a9/freifunk
src/gz openwrt_helloworld https://i.qsis.cn:88/openwrt/mirrors.cloud.tencent.com/lede/snapshots/packages/arm_cortex-a9/helloworld
src/gz openwrt_luci https://i.qsis.cn:88/openwrt/mirrors.cloud.tencent.com/lede/releases/19.07.7/packages/arm_cortex-a9/luci
src/gz openwrt_packages https://i.qsis.cn:88/openwrt/mirrors.cloud.tencent.com/lede/snapshots/packages/arm_cortex-a9/packages
src/gz openwrt_routing https://i.qsis.cn:88/openwrt/mirrors.cloud.tencent.com/lede/snapshots/packages/arm_cortex-a9/routing
src/gz openwrt_telephony https://i.qsis.cn:88/openwrt/mirrors.cloud.tencent.com/lede/snapshots/packages/arm_cortex-a9/telephony


相对来说,这个版本更加稳定。

安装openwrt的web管理托管程序

uwsgi uwsgi-cgi-plugin uwsgi-luci-support uwsgi-syslog-plugin

安装好后,uhttpd会自动停止并禁用,nginx会顺利接管。很舒服。剩下的就是配置方面了,坑很多。

nginx配置文件分为一下几个。

/etc/config/nginx

/etc/nginx/*

/etc/nginx/conf.d/*

他们的关系是通过配置/etc/config/nginx文件,对/etc/nginx/uci.conf进行更新,并且uci.conf文件包含了/etc/nginx/conf.d/下面的所有文件。

下面我们一点点分析。

vi /etc/config/nginx 得到下面内容

我想,你已经发现这个配置文件有问题了,没错,root "/www" 不应该卸载globel下面,而是应该放在server下面。那么你给移动下去吧。

如果你想把你的其他服务,也放在www下,你就需要给luci单独建立一个文件夹,例如/www/luci文件夹,或者/www/luciweb文件夹,当然你愿意怎么添加都可以,然后把/www目录下的内容拷贝进去。

我就是建立了/www/luci文件夹,并将上面的内容下移到config server里面之后修改了路径

下面继续看/etc/nginx目录下的内容 (以下图片中 user www;应该改为user isher;)


内容完美,server下面看到了刚刚改的 root /www/luci。并且应该也看到了,这个文件还包含了 conf.d/下面的所有.conf文件,以及第一个server里面,还包含了.locations的内容。知道就行了,不用去看了。

由于已经提到了包含 conf.d/*.conf 下面的文件,那么现在就在/etc/nginx/conf.d下面创建其他虚拟主机的配置文件,你可以每一个虚拟主机配置一个.conf文件,然后以servername.conf为每个虚拟主机命名,也可以都写在一个文件下,例如创建一个vhost.conf就可以了,下面继续。

cd /etc/nginx/conf.d/
vi vhost.conf
编辑第一个虚拟主机前,我们先把php7的配置文件看下。

php7安装好后,大概配置没什么可讲的,按需配置、因为当你安装为mod的时候,php实际上已经默认加载了这些内容,非调试状态别忘了设置display_errors = Off

post_max_size = 300M
file_uploads = On
upload_tmp_dir = "/tmp"
upload_max_filesize = 2048M
max_file_uploads = 200

几个值的设置,根据自己需求以及内存来设置,这里就不做过多讲解了。

php-fpm 是php的fastcgi管理器,或者也可以说是php中间件服务器的控制器。随你怎么说,只要知道它是连接nginx和php的纽带,没有它,nginx和php是独立的两个个体,就行了。

php-fpm分为三个部分

/etc/config/php7-fpm  配置调用文件

/etc//php7-fpm.conf    全局配置文件

/etc/php7-fpm.d/*.conf   具体配置目录

前面两个基本默认就好,主要看/etc/php7-fpm.d/下面的内容,默认配置文件为www.conf,修改这个文件的一些内容

找到 group 和 user ,去掉前面的分号以激活选项。用于启动php7-fpm程序,这里默认关闭情况是用root启动,不建议使用默认root,其原因是需要和网站目录权限一样,用root就很不安全

user = isher
group = isher

------------------添加启动php-fpm的帐号和组------------------

这里的www-data,可以修改成任意值,但是不敢修改成什么,都要在系统上添加相应的帐号和组。而openwrt是不允许添加帐号和组的,所以需要安装帐号管理器-shadow影子。

opkg install shadow-common shadow-groupadd shadow-useradd

groupadd isher

useradd isher isher

------------------结束 php-fpm的帐号和组------------------
继续往下看www.conf文件

找到监听部分,可以使用你的ip地址:端口 和socket的方式监听socket

;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses on a
;                            specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.

listen = /var/run/php7-fpm.sock

这里可以使用 127.0.0.1:9000 ,也可以使用像我这样 listen = /var/run/php7-fpm.sock的默认写法,注意去掉前面的分号,已激活选项。同时注意 /var/run必须是一个已经存在的目录。

激活请求执行端口,这里的用户名和组需要于上面的用户名和组相同(当然你可以不相同,无非就是在创建一个用户和组)
listen.owner = isher
listen.group = isher
listen.mode = 0666

listen.allowed_clients = 127.0.0.1
这里的接受客户端请求地址,可以是任何ip地址,即表示接受来自不同服务器提交过来的php请求,当然你的路由器身后还有个集群的话,可以留空或者any,如果只是本机操作,则填写127.0.0.1

其他关于最大请求和超时内容,按需配置,可以保留默认,保存退出。即可

回到 nginx的配置上来,继续配置虚拟机 /etc/nginx/conf.d/vhosts.conf

这里的坑比较多,先看图


这里用蓝色和红色做了两个网站(虚拟服务器)的区分,但是配置方法是不同的。

蓝色区域的主机是在server下面直接写root /www/ 程序路径。

红色区域的主机,则是在 location / 下写了root,同时在 location ~ .php$ 下又写了一次root 站点路径。

那么,那种对呢?其实都对,如果写在server下,证明整个站点唯一一个root,如果写在 location下,则必须在注明cgi的路径,这么理解,就很容易懂了。

所以很多网上的教程或者备忘,给出的都是仅仅在location / 下面写一次root地址,而在location 的php下,则不再写cgi的路径,这是完全错误的,因为不写cgi路径也不代表cgi就适用于整个站点。所以从这点可以看出,nginx对于配置文件的严谨性,有了提升。

    location ~ .php$ {
        fastcgi_pass   unix:/var/run/php7-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    location ~ .php$ {
        root           /www/demo/;
        fastcgi_pass   unix:/var/run/php7-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

需要注意的就是root的路径。

都搞定了之后,就要设置权限了

设置目录权限

cd /

chown isher:isher /www/* -R 

这里的isher是nginx和php7-fpm的里面写的user和groud的的用户和组,一定不要搞错,否则会出现页面空白或者没有找到文件的错误

都搞定后,运行命令让nginx跑起来吧

service php7-fpm restart

service nginx restart

转载请注明出处 https://isher.qsis.cn/

7.4.22-1
2021-07-25
返回首页