首页
关于我
Search
1
Vue3 Hooks 的使用
1,405 阅读
2
Vue3 中 ref 标记组件使用
1,221 阅读
3
搭建博客
994 阅读
4
npm i 安装依赖 node-sass 报错
891 阅读
5
Vue2 中混入的使用
726 阅读
Web前端基础
JavaScript
jQuery
css
Vue
ElementUI
博客
Ant Design Vue
友情链接
凌哥技术分享
coder的技术博客
登录
Search
子衿
累计撰写
26
篇文章
累计收到
197
条评论
首页
栏目
Web前端基础
JavaScript
jQuery
css
Vue
ElementUI
博客
Ant Design Vue
页面
关于我
搜索到
26
篇与
芸殇
的结果
2024-03-14
开启网站HTTPS
使用 acme.sh 为 Nginx 申请、部署 HTTPS 证书并自动续期本文使用虚构示例介绍宝塔与 Nginx 的 HTTPS 申请部署流程。example.com、203.0.113.10 和 DNS 地址均为文档占位符,使用时须替换为自己的配置。一、示例环境与路径项目示例值域名blog.example.com服务器 IP203.0.113.10ACME 客户端/opt/acme/acme.shHTTP 验证目录/www/acmeHTTPS 网站配置/www/server/panel/vhost/nginx/blog.example.com.confHTTP 验证配置/www/server/panel/vhost/nginx/blog-acme-http.conf部署证书目录/www/server/panel/vhost/cert/blog.example.com自动续期任务/etc/cron.d/acme-renew自动续期日志/var/log/acme-renew.log所有配置路径均为示例,应按自己的服务器调整。以下命令在服务器上以 root 执行。证书私钥、ACME 账户密钥不要放入博客或公开仓库。二、先确认域名解析在域名解析控制台添加或修改:记录类型:A 主机记录:blog 记录值:203.0.113.10仅在解析列表里添加记录还不够:域名注册商配置的 DNS 服务器必须与解析服务商分配的地址一致。DNS 地址应使用服务商实际分配的值,以下仅为占位符:ns1.dns-provider.example ns2.dns-provider.example如果控制台提示“未接入使用云解析 DNS,当前配置的解析记录不会生效”,应到域名注册管理中的 DNS 修改页面更改 DNS 服务器,而不是在解析列表中新增 NS 记录代替。其他域名应使用其控制台实际分配的地址。检查解析与网络:getent hosts blog.example.com curl -I --max-time 10 http://blog.example.com/阿里云安全组和服务器防火墙需要允许 TCP 80、443。HTTP-01 验证需要公网访问 80 端口;不要直接关闭防火墙。三、安装 acme.sh(已有安装可跳过)从官方项目下载脚本:mkdir -p /opt/acme-bootstrap cd /opt/acme-bootstrap curl -fL --connect-timeout 10 --max-time 60 \ https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh \ -o acme.sh确认下载成功并查看脚本后,从脚本所在目录执行安装:cd /opt/acme-bootstrap sh acme.sh --install --home /opt/acme --nocron sh /opt/acme/acme.sh --home /opt/acme --version本教程使用独立 cron 任务,因此安装时指定 --nocron,避免重复配置。后续命令始终显式传入 --home /opt/acme。如果服务器无法连接 GitHub,可在自己的电脑从同一官方地址下载,再通过 scp 上传。不要因为网络失败改用来历不明的脚本,也不要关闭 TLS 校验。官方项目与完整说明:https://github.com/acmesh-official/acme.sh四、配置 HTTP 验证路径已有配置时,续期不要重复创建同名 server。新部署时,先备份现有 Nginx 配置,确保这个域名在 80 端口只有一个匹配的虚拟主机。创建验证目录:mkdir -p /www/acme/.well-known/acme-challenge当前 blog-acme-http.conf 的内容为:server { listen 80; listen [::]:80; server_name blog.example.com; location ^~ /.well-known/acme-challenge/ { root /www/acme; default_type text/plain; } location / { return 301 https://$host$request_uri; } }HTTPS 网站原配置中保留 443 监听,并移除该域名重复的 80 监听。验证路径直接返回文件,其余 HTTP 请求跳转 HTTPS。不要在上述 HTTP server 中加入会对所有请求执行的 HTTPS 重写,否则验证文件也可能被重定向。检查并重载配置:/www/server/nginx/sbin/nginx -t && \ /www/server/nginx/sbin/nginx -s reload测试验证路径:printf 'acme-ready\n' > /www/acme/.well-known/acme-challenge/probe curl --max-time 10 http://blog.example.com/.well-known/acme-challenge/probe应该直接输出 acme-ready,而不是 404、登录页或跳转页面。最好同时从另一台电脑测试公网访问。五、申请 Let's Encrypt 证书申请前阅读签发机构条款;提交注册申请可能涉及接受其服务协议。为自己的域名申请,不要使用他人域名。sh /opt/acme/acme.sh --home /opt/acme \ --issue --server letsencrypt \ -d blog.example.com \ -w /www/acme \ --keylength ec-256成功后会显示 Cert success。ECC 证书及密钥保存在:/opt/acme/blog.example.com_ecc/该目录由 acme.sh 管理。部署时使用 --install-cert 复制证书到 Nginx 的固定路径,不要把 Nginx 直接指向 ACME 内部工作文件。六、部署证书并重载 Nginx修改前先备份现有证书及 Nginx 配置。备份应保存在仅 root 可访问的目录,且不要覆盖唯一一份旧备份。CERT_DIR=/www/server/panel/vhost/cert/blog.example.com BACKUP_DIR=/var/backups/https-$(date +%Y%m%d-%H%M%S) mkdir -m 700 "$BACKUP_DIR" cp -a "$CERT_DIR" "$BACKUP_DIR/" cp -a /www/server/panel/vhost/nginx/blog.example.com.conf "$BACKUP_DIR/"安装证书,并让 acme.sh 记住续期后的部署路径和重载命令:sh /opt/acme/acme.sh --home /opt/acme \ --install-cert --ecc -d blog.example.com \ --key-file /www/server/panel/vhost/cert/blog.example.com/privkey.pem \ --fullchain-file /www/server/panel/vhost/cert/blog.example.com/fullchain.pem \ --reloadcmd '/www/server/nginx/sbin/nginx -t && /www/server/nginx/sbin/nginx -s reload' chmod 600 /www/server/panel/vhost/cert/blog.example.com/privkey.pemHTTPS server 中的证书配置应对应:ssl_certificate /www/server/panel/vhost/cert/blog.example.com/fullchain.pem; ssl_certificate_key /www/server/panel/vhost/cert/blog.example.com/privkey.pem;fullchain.pem 包含站点证书及中间证书链。单独复制站点证书可能造成部分客户端无法建立信任链。七、验证部署结果查看文件中的证书信息:openssl x509 \ -in /www/server/panel/vhost/cert/blog.example.com/fullchain.pem \ -noout -dates -issuer -ext subjectAltName验证公网 HTTPS:curl -I --max-time 15 https://blog.example.com/正常应返回 HTTP 200 或预期的业务跳转,且不能出现证书验证错误。这里不要加 -k,否则会跳过证书校验。若 DNS 缓存尚未一致,可直接验证新服务器,但仍使用域名进行证书校验:curl --resolve blog.example.com:443:203.0.113.10 \ -I https://blog.example.com/浏览器应通过域名访问。证书只覆盖 blog.example.com,不覆盖服务器 IP,也不自动覆盖 www.example.com。八、配置自动续期示例任务文件为 /etc/cron.d/acme-renew,内容为:17 3 * * * root /bin/sh /opt/acme/acme.sh --cron --home /opt/acme >> /var/log/acme-renew.log 2>&1这表示每天按服务器本地时间 03:17 检查是否需要续期,并非每天都重新签发。acme.sh 根据证书状态和 CA 信息决定续期时间;成功后会使用已保存的路径部署,并重载 Nginx。检查任务和服务:cat /etc/cron.d/acme-renew systemctl is-active crond sh /opt/acme/acme.sh --cron --home /opt/acme tail -n 50 /var/log/acme-renew.log显示 Skipping 并给出下次续期时间通常是正常现象,表示现在还不需要续期。若任务尚未运行,日志文件可能还不存在。需要提前续期时先用普通命令:sh /opt/acme/acme.sh --home /opt/acme \ --renew --ecc -d blog.example.com只有确认需要立即重签时才添加 --force。不要反复强制申请,以免触发签发限制。九、常见问题DNS 查询失败或验证一直 Pending检查注册商 DNS 服务器、A 记录、是否有错误 AAAA 记录、80 端口、安全组和验证文件路径。不同递归 DNS 的缓存更新时间可能不同。不要看到某一台机器能解析,就认定所有验证节点都已更新。证书已经更新,但浏览器仍显示“不安全”先确认浏览器访问的是 https://blog.example.com/,再查看它实际收到的证书域名和有效期。用新无痕窗口复测;如仍异常,检查开发者工具 Security、Console、Network 中的证书或混合内容错误。不要简单假定所有异常都是缓存,也不要通过跳过安全警告作为长期解决方法。文件中的证书是新的,但网站仍提供旧证书检查 Nginx 实际使用的虚拟主机和证书路径,执行 nginx -t 后再重载。如果有 CDN 或负载均衡,还要检查入口节点的证书。acme.sh 安装报 cannot stat 'acme.sh'从下载脚本所在目录执行安装。示例:cd /opt/acme-bootstrap sh acme.sh --install --home /opt/acme --nocron续期失败先查看 /var/log/acme-renew.log,确认域名仍指向这台服务器、HTTP 验证目录仍可访问、cron 正常、续期后的 reload 命令仍有效。修改宝塔网站配置后,也要检查验证路径有没有被删除或覆盖。
2024年03月14日
0 阅读
0 评论
0 点赞
2024-03-12
位运算
按位与 AND( & ) 与运算就是将需要运算的两个数的二进制每一位进行对比,只有当两个数的对应位都为 1 时结果为1,其他为0第一个数第二个数结果010111100010 比如:求 1 & 7 实际就是对1和7的二进制每一位进行操作,1的二进制为 0001,7的二进制为 0111。 0001 & 0111 = 0001 最终结果为 0001,实际就是十进制的1按位或 OR( | ) 与运算就是将需要运算的两个数的二进制每一位进行对比,只要两边有1结果为1,都为0时结果为0第一个数第二个数结果011111101000 比如:求 1 | 7 实际就是对1和7的二进制每一位进行操作,1的二进制为 0001,7的二进制为 0111。 0001 | 0111 = 0111 最终结果为 0111,实际就是十进制的7按位异或 XOR( ^ ) 与运算就是将需要运算的两个数的二进制每一位进行对比,只有在两边有一个1时结果为1,两边都为1或0结果为0第一个数第二个数结果011110101000 比如:求 1 ^ 7 实际就是对1和7的二进制每一位进行操作,1的二进制为 0001,7的二进制为 0111。 0001 ^ 0111 = 0110 最终结果为 0110,实际就是十进制的6
2024年03月12日
154 阅读
0 评论
0 点赞
2024-01-26
node.js版本切换管理工具 - nvm
在我们日常开发中,会遇到多个项目同时开发,会有新项目也有老项目,而一些老项目的依赖需要低版本的 node,而新版本又需要高版本 node,这时候我们就可以使用 nvm 这个 node 版本切换管理工具来实现。下载 下载链接: https://github.com/coreybutler/nvm-windows/releases安装 点击刚刚下载的安装包,一路点击下一步即可,如果你的电脑之前安装过 node.js 那么会在你安装 nvm 时,会提示你你当前有已安装的node,询问你是否将它纳入nvm管理范围内,这个点击是即可。配置 如果你在安装时候没有更改安装路径默认C盘,那就不需要配置,如果在安装时,你更改了安装路径安装在其他盘,那么你需要配置一下环境变量。 配置环境变量:打开我的电脑 -> 右键 -> 属性 -> 高级系统设置 -> 环境变量,然后在环境变量中将 nvm 配置进去。使用 我们可以在 cmd 中来查看自己的 nvm 是否安装成功和切换node# 查看当前nvm版本 nvm -v # 查看已安装的所有node.js的版本 nvm ls # 查看可以安装的所有node.js的版本 nvm list available # 安装 node (nvm install 18.12.1) nvm install <version> # 卸载 node nvm uninstall <version> # 切换 node 版本(nvm use 18.12.1) nvm use <version>
2024年01月26日
195 阅读
0 评论
0 点赞
2023-10-27
Vue项目登录页加载优化
最近在项目中遇见了一个登录页要加载很久,在项目很复杂的时候打的 js 包很大,会导致加载时间过长从而影响到用户体验,需要对加载进行优化。使用分析工具分析js包 使用webpack的可视化资源分析工具 webpack-bundle-analyzer,它可以直观分析打包出的文件包含哪些,大小占比如何,模块包含关系,依赖项等,我们可以根据这些来对文件的分割进行操作,是我们后面分析资源包大小的基础。// 安装 webpack-bundle-analyzer npm i webpack-bundle-analyzer --save-dev // 随后在 vue.config.js 文件中进行配置 const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; module.exports = { configureWebpack: config => { config.plugins.push(new BundleAnalyzerPlugin()) } } // 随后打包项目生成分析图 npm run build 分割模块 我们可以通过 splitchunks 将一些常用的库进行分割抽离出来,这样也可以加快加载速度。这一步也需要在 vue.config.js 中进行配置。module.exports = { chainWebpack: config => { config.optimization.splitChunks({ // async异步代码分割 initial同步代码分割 all同步异步分割都开启 chunks: "all", // 形成一个新代码块最小的体积 minSize: 30000, // 模块至少使用次数 minChunks: 1, // 按需加载时候最大的并行请求数,默认为5 maxAsyncRequests: 30, // 一个入口最大的并行请求数,默认为3 maxInitialRequests: 30, cacheGroups: { antDesignVue: { // name 打包的 chunks 的名字 name: 'chunk-ant-design-vue', // 将匹配到的模块打进这个缓存组 test: /[\\/]node_modules[\\/]ant-design-vue[\\/]/, chunks: 'initial', // 打包优先级,数值越大优先级高 priority: 3, // 如果当前的 chunk 已被从 split 出来,那么将会直接复用这个 chunk 而不是重新创建一个 reuseExistingChunk: true, // 强制抽离此模块 enforce: true } } }) } }使用GZIP进行代码压缩 我们还可以使用GZIP对代码进行压缩,减少文件大小从而达到减少加载时间的目的。// 安装 CompressionPlugin npm i compression-webpack-plugin -D // 在 vue.config.js 文件中进行配置 const CompressionPlugin = require("compression-webpack-plugin") module.exports = { chainWebpack: config => { // 在生产环境中,压缩 js、css 代码 if (process.env.NODE_ENV === 'production') { config.plugin('compressionPlugin').use(new CompressionPlugin({ algorithm: 'gzip', // 所有匹配此正则的文件都会被进行压缩 test: /\.(js|css|less)$/, filename: '[path].gz[query]', minRatio: 1, // 设置压缩门槛,单位字节,只有大于这个大小的文件才会被压缩 threshold: 10240, // 是否删除原资源,建议设置为 false,这样可以让压缩资源和原始资源共存,当客户端或者服务端不支持GZIP压缩时,能够返回原始资源,保障项目正常运行 deleteOriginalAssets: false })) } } } 由上图可以看出 GZIP 对于大文件的压缩效果还是很明显的,我们还需要开启服务端的 GZIP 功能,来让效果更好。这里以 Nginx 服务器为例:# 开启gzip gzip on; gzip_static on; # 启用gzip压缩的最小文件;小于设置值的文件将不会被压缩 gzip_min_length 1k; # 压缩级别1~9,值越小压缩效果越差,值越大处理越慢 gzip_comp_level 9; # 进行压缩的文件类型 gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; # 是否在http header中添加Vary: Accept-Encoding,建议开启 gzip_vary on;按需引入UI组件 减少全局注入,也可以有效的减少加载时间,在项目中很多时候我们为了方便都是选择将组件库进行全局引入,但是在优化角度而言更好的做法其实是按需引入,这样可以减少加载时间。使用 babel-plugin-import// 安装 babel-plugin-import npm install babel-plugin-import --save-dev // 在 babel.config.js 中进行配置 'plugins': [ ['import', { 'libraryName': 'ant-design-vue', 'libraryDirectory': 'es', // `style: true` 会加载 less 文件 'style': true }] ] // 在 main.js 文件中,需要什么组件按需进行引入 import { DatePicker } from 'ant-design-vue';
2023年10月27日
175 阅读
0 评论
0 点赞
2023-08-29
uniapp AndroidApp使用高德地图
uniapp 项目使用高德地图,首先我们先登录高德地图的开放平台,点击登陆进入控制台,点击 应用管理 -> 我的应用 -> 创建新应用,在应用创建完成后,点击添加key,输入key名称(建议格式为应用名 + 应用场景),服务平台选择Android平台。获取SHA1安全码 通过 keytool 获取到 SHA1安全码,目前很多版本的JDK已不再支持MD5,这边分享一下可以获取到MD5的旧版本JDK下载链接,提取码为 tm85,下载到这个JDK后解压,然后右键我的电脑 -> 属性 -> 高级系统设置 -> 高级 -> 环境变量,找到系统变量中的 Path 双击,点击新建将你刚刚解压的jdk路径写进去。 然后进入工作目录,也就是你项目目录,就可以开始生成证书了,使用 keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore命令来生成证书。-alias:证书别名-keyalg:证书秘钥算法名称-keysize:秘钥位大小-validity:有效天数-keystore:证书名keytool-genkey:生成证书 在输入命令行后会让你填写密钥库口令和一些信息,在将信息全部输入完成后就会生成一个 keystore 文件,这个就是你的证书。 创建完成后我们就可以进入你证书的那个目录下,换出 cmd 终端,输入 keytool -list -v -keystore test.keystore 命令行,-keystore 后面的是你证书的名字,然后输入你设置的密钥库口令,就可以得到 SHA1 安全码了。 packageName,就是你 uniapp 的包名,可以通过点击发行 -> 云打包,然后会有一个 Android包名,将那个包名复制过来就好。输入完这些信息后就能获得一个key然后我们将key复制,进入 hbuilderX 中点击 manifest.json 然后点击模块配置,在里面找到 Maps 模块将高德地图勾选上,在 Android 那一栏将你复制的key 粘贴进去就好了。
2023年08月29日
312 阅读
0 评论
0 点赞
1
2
3
...
6