🎯 学习目标
完成本课程后,学习者将能够:
- 你将得到Hybrid技术得到小程序设计的初衷
- 小程序的注册、审核、发版上线流程
- 小程序运行条件(openssl生成本地证书)
- 基于目录的访问限制,正确使用
open_basedir
一、从Hybrid 技术开始
在早期的移动互联网兴起的时候,Css + Html5 + Javascript
是不能调用操作系统的底层能力、比如想调用手机的通讯录、摄像头、无法直接操作本地文件系统 这种功能是没办法实现的,无法深度利用设备传感器(如高精度陀螺仪、气压计),或实现后台 GPS 定位 等原生级功能,浏览器的安全沙箱机制,严格限制了 Web 页面直接访问手机的底层系统能力。
第二个就是用户体验与性能的短板纯 H5 页面的渲染性能、动画流畅度 ,以及复杂交互的响应速度,和原生应用(Native App)存在明显差距,原生App开发成本比较高,Hybrid的架构方案就应运而生了,所以说,智慧都属于劳动人民啊!
Hybrid的架构层
- Native(原生层):比如我们要开发的是微信小程序,那么微信原生App就属于原生层,直接调用手机底层 API(如摄像头、通讯录、GPS、蓝牙、本地文件系统等),并通过 "桥接机制(JSBridge)" 将这些能力开放给 H5 调用(解决纯 H5 无法触达底层的问题)。
- WebView:"连接桥梁" 和 "运行容器":本质是嵌入在原生应用中的 "轻量级浏览器内核"(如 iOS 的 WKWebView、Android 的 WebView),是 H5 页面的 "运行载体"。
- H5(Web 层):"业务载体" 和 "灵活迭代者":负责大部分业务场景的页面渲染(如商品详情、新闻列表、表单提交等)和交互逻辑(如按钮点击、数据校验等),直接面向用户展示内容。
二、小程序的注册、审核、发版上线流程
开发小程序,需要审核一个小程序,个人和企业都可以申请,申请的方式和流程也相对简单,个人申请能开发的品类较少,企业品类较多,如果自己在本地开发进行学习,申请个人的就可以。
在管理->开发管理,可以看见小程序AppID
,小程序代码上传需要设置白名单、服务器域名和业务域名,加入开发者,下载小程序开发者工具就可以编写代码了,享受编程的快乐了,还有一点需要注意的是之前的都是用js
方式编程,现在官方生成的都是ts
格式的,在用法上有一点不同,但大同小异。
小程序的目录如下:
-
package.json 项目依赖配置文件,用于管理 Node.js 依赖包(如开发工具、第三方库),定义脚本命令(如构建、运行脚本),以及项目基本信息(名称、版本等)。类似前端项目的依赖管理核心文件。
-
project.config.json小程序项目全局配置文件,用于保存项目的公共配置(团队共享)例如:项目名称、appid、编译配置、页面路径配置等
-
project.private.config.json 项目私有配置文件,用于保存个人开发相关的配置(不共享),可覆盖
project.config.json
中的配置。 -
tsconfig.json:TypeScript 编译配置文件,指定 TypeScript 的编译规则
-
typings/ :TypeScript 类型声明目录,用于存放项目所需的类型定义文件(
.d.ts
),解决 TS 对 "非 TS 模块"(如微信小程序 API、第三方 JS 库)的类型识别问题,避免类型报错。 -
miniprogram/ 目录(小程序核心目录):小程序的主运行目录,包含所有与小程序功能直接相关的代码(页面、全局配置、样式等)。
- app.json : 小程序全局配置文件,定义小程序的页面结构、窗口表现、导航栏配置等核心信息
- app.ts:小程序入口逻辑文件,定义小程序的生命周期函数,处理全局初始化逻辑
- app.wxss :小程序全局样式文件,定义的样式会作用于所有页面(类似网页的
global.css
)。支持微信小程序扩展的样式语法(如rpx
自适应单位),页面样式可覆盖全局样式。 - pages/ :小程序页面目录,每个子目录对应一个页面。
- utils/ :工具函数目录,存放项目中可复用的工具方法(如日期格式化、数据处理、网络请求封装等)。
bash
├── miniprogram
│ ├── app.json
│ ├── app.ts
│ ├── app.wxss
│ ├── pages
│ │ ├── index
│ │ └── logs
│ └── utils
│ └── util.ts
├── package.json
├── project.config.json
├── project.private.config.json
├── tsconfig.json
└── typings
├── index.d.ts
└── types
├── index.d.ts
└── wx
三、本地SSL证书
小程序必须要运行在Https协议上进行安全传输,需要在本地生成ssl证书,比如我的域名是shop.work.com
,存放路径是/root/ssl/shop.work.com/
,使用Openssl
可以成功生成ssl证书,在配置到Nginx上即可。
bash
# 生成私钥
sudo openssl genrsa -out shop.work.com.key 2048
# 生成证书签名请求 (CSR)
sudo openssl req -new -key shop.work.com.key -out shop.work.com.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=Company/OU=IT/CN=shop.work.com"
# 生成自签名证书 (有效期为365天)
sudo openssl x509 -req -days 365 \
-in shop.work.com.csr \
-signkey shop.work.com.key \
-out shop.work.com.crt
Nginx ssl证书配,配置上就能在本地正常访问了。
bash
server {
listen 80;
listen 443 ssl;
server_name shop.work.com;
# SSL 证书路径(对应第一步生成的文件)
ssl_certificate /root/ssl/shop.work.com/shop.work.com.crt;
ssl_certificate_key /root/ssl/shop.work.com/shop.work.com.key;
# SSL 安全配置(推荐参数)
ssl_protocols TLSv1.2 TLSv1.3; # 支持的 TLS 版本
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM- SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on; # 优先使用服务器加密套件
ssl_session_cache shared:SSL:10m; # 会话缓存
ssl_session_timeout 10m; # 会话超时时间
}
四、基于目录的访问限制
在Nginx与PHP进行fastCgi
的进行通信的时候,页面产生了错误信息No input file specified.
,翻了好多资料,把它整理出来也是记录也是分享,只要是Lnmp
架构的小伙伴们对他一定不陌生,系统的对这个知识点做一个记录,以防止在出现同样的坑。
简单来说,open_basedir
是一个PHP配置指令,用于将PHP程序可以访问的文件限制在指定的目录树中,包括文件本身。脚本只能在这个监狱范围内读取、写入、执行文件。一旦试图"越狱",访问监狱外的文件,PHP就会报错并拒绝访问。
它主要的作用就是针对Web目录安全的考量,只能对设置的特定目录有对应的操作权限。
当你遇到 open_basedir
相关错误时,通常会在错误日志中看到类似这样的信息:
bash
Warning: file_exists(): open_basedir restriction in effect.
File(XXXXXXXX) is not within the allowed path(s)...
#或者
No input file specified.
在Nginx、php-fpm、php.ini,
中都可以设置对open_basedir
进行设置,但它们的生效范围和优先级是不同的。优先级从高到低是: Nginx > PHP-FPM > php.ini
。
1、php.ini
(全局配置,优先级最低)优先级最低,如果其他地方没有设置,则使用这里的值,但不建议在这里设置,因为这个配置属于php全局配置,如果有A、B、C 三个项目同时在运行,设置那个目录都会影响到其他的Web站点运行。
bash
open_basedir = /var/www/html:/tmp
2、PHP-FPM 进程池配置 (Pool Configuration,优先级中等)
bash
ps aux | grep php-fpm
... php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
[www]
php_admin_value[open_basedir] = /home/wwwroot/shop/crmeb:/tmp
3、Nginx
bash
location ~ .php(.*)$ {
fastcgi_param PHP_ADMIN_VALUE "open_basedir=/home/wwwroot/shop/crmeb:/tmp";
}
推荐方案 :为每个项目创建独立的 PHP-FPM 进程池,这是最安全、最推荐的做法,可以实现真正的项目隔离。
在实际开发中有这样的情况,我有三个项目分别是Shop、Crm、Web三个项目,可以使用不同的Unix文件或Tcp端口来进行通信,对参数进行一下简单的说明:
listen.owner
控制的是 PHP-FPM 监听的 Unix Socket 文件的所有者listen.group
控制的是 PHP-FPM 监听的 Unix Socket 文件的所有组[shop]
shop 线程池所属模块的配置
ini
[shop]
listen = /tmp/php-shop-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
; 安全设置 - 核心!
php_admin_value[open_basedir] = /home/wwwroot/shop/crmeb:/tmp
[crm]
listen = /tmp/php-crm-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
; 安全设置 - 核心!
php_admin_value[open_basedir] = /home/wwwroot/shop/crmeb:/tmp
配置完要重启服务,查看进程,Shop
和Crm
的线程池就都有了。
bash
$ ps aux | grep php-fpm
root php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
www php-fpm: pool shop
www php-fpm: pool shop
www php-fpm: pool crm
www php-fpm: pool crm
五、HBuilderX + Uni-App
Uni-App是一款非常优秀的国产跨平台的前端框架,跨平台移动应用开发(核心优势) ,如果您想开发手机 App,但又不想学习 Java/Kotlin (Android) 或 Swift/Objective-C (iOS) :它是您的绝佳选择。
如果您需要同时开发 App 和多个平台的小程序。
同时体验了微信小程序IDE,也体验了HBuilderX,感觉HBuilderX开发效率会高一些,整体来说还是一款不错的工具。