喜欢“数据库优先”的朋友会发现,一旦 nuget 中将 MySql.Data 与 MySql.Data.EntityFramework 升级到版本超过 8.0.19,将无法正常打开 .edmx 文件进行从数据库更新模型。这个问题从 8.0.20 开始出现,在经过等待试验后续多个更新版本后,笔者认为 Oracle 官方不会再针对 8.0.20 及以后的版本支持可视化更新实体模型。
于是面临两个选择:退回到 8.0.19 版本,或使用其它数据库连接组件(如 Pomelo)。
使用其它组件将会更改映射的属性名称,对 Include 延时加载等机制也会发生改变,对于代码量比较大的项目修改成本还是比较大的。那么用回 8.0.19 呢?
在服务器上卸载 8.0.20+ 版本的 mysql-connector-net,安装 8.0.19 版本,重启 IIS 或重启服务器。
项目中,MySql.Data 与 MySql.Data.EntityFramework 也降至 8.0.19,发布后发现,仍然提示:
未能加载文件或程序集“MySql.Data.EntityFramework, Version=8.0.19.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
几个月来,我一直认为是服务器上的高版本 mysql-connector-net 没有卸载干净,今天才发现原因是新发布的项目 bin 目录中的 MySql.Data.EntityFramework.dll 版本号仍然高于 8.0.19。手动替换成 8.0.19 后可正常访问。
既然 NuGet 已经将 MySql.Data.EntityFramework 的版本降至 8.0.19,而且 web.config 中所有的版本号也都一致,解决方案的 packages 目录下的也只有 MySql.Data.EntityFramework.8.0.19 这一个版本,甚至连项目源代码中的 bin 目录下的该文件版本也是 8.0.19,可发布后的 MySql.Data.EntityFramework.dll 版本却仍高于 8.0.19?
于是在解决方案中找到以下路径:
\obj\Release\Package\PackageTmp\bin\MySql.Data.EntityFramework.dll
重新发布时,这个文件并没有按照 NuGet 中的版本来覆盖,因此只需要在发布前删除整个 \obj\ 目录再次发布即可解决问题。
Orbi 型号命名规则:
套装:RBK
主体:RBR
分身:RBS、RBW 等
套装对比:
CPU | 高通 IPQ4019 四核 717MHz | 四核 710MHz | ||||
ROM | 128MB | - | - | - | - | - |
内存 RAM | 256MB DDR3 | 512MB | ||||
闪存 Flash | - | 256MB | 4GB | |||
包装内容 | 2 个(不分子母) | 1 个 RBR10 1 个 RBS10 | 1 个 RBR20 1 个 RBS20 | 1 个 RBR40 1 个 RBW30 插墙式 | 1 个 RBR40 1 个 RBS40 | 1 个 RBR50 1 个 RBS50 |
速度 | AC1300 双频段 1300Mbps 电力线 1000M 有线 | AC1200 双频段 2.4GHz 300Mbps+5GHz 866Mbps | 三频段 AC2200 本体 AC2200 分身 (866回程+866+400Mbps) | 三频段 AC3000 本体 AC3000 分身 (1733回程+866+400Mbps) | ||
本体端口 | 每个主机 3 个 WAN/LAN 自适应以太网端口 | 1 WAN & 1 LAN | 1 WAN & 1 LAN | 1 WAN & 3 LAN | 1 WAN & 3 LAN & 1 USB 2.0 | |
分身端口 | - | 2 LAN | - | 4 LAN | 4 LAN & 1 USB 2.0 | |
天线 | 4根 | 6根 | ||||
以太网回程 | 支持 | 支持 | ||||
Daisy Chain Topology 菊花链 | 支持 | |||||
Beamforming 波束成形 | 支持 | |||||
MU-MIMO | 支持 | |||||
802.11k/v 快速漫游 | 支持 | |||||
802.11r 快速漫游 | 不支持 | |||||
802.11ax(Wi-Fi 6) | 不支持 | |||||
AP 模式 | 不支持 | 支持 | ||||
关闭 WiFi 双频合一 | 原厂不支持,小米和 RBK50 可通过修改实现,分离后有线回程可能会失效 | |||||
IPv6 | 支持 | |||||
带机量 | 248 | |||||
覆盖范围 | - | 418 平方米 | 250 平方米 | 200 平方米 | 250 平方米 | 350 平方米 |
官网价 | 229.99 美元 | - | - | - | - | |
京东自营 | ||||||
京东旗舰店 | - | |||||
天猫旗舰店 | - | |||||
其它天猫店 | 969 苏宁易购 | - | RBK30:1288 | RBK40:1699 | - | |
优势 | 管理功能丰富。 配合米家APP 设置小米智能家居设备入网时,无需手动输入密码,入网更便捷。 网口盲插,不分子母。后续再扩展两个分身时可直接购买套装充当两个分身,相对于 Orbi 购买两个分身要节省成本。 | 三频。 性能稳定。 大内存 |
分体价格:
本体 RBR20:599
本体 RBR40:999
本体 RBR50:999 活动
分身 RBS20:699
分身 RBW30 插墙:999
分身 RBS40:1099
分身 RBS50:1449
分身 RBS50Y 室外:未知
价格采自2019年8月
主体/分身 匹配:
分身 RBS20 可作为 RBR20, RBR40 or RBR50 的卫星
分身 RBW30 可作为 RBR40 or RBR50 的卫星
分身 RBS40 可作为 RBR40 or RBR50 的卫星
分身 RBS50 可作为 RBR50 的卫星
分身 RBS50Y 可作为 RBR50 or RBR40 or SRR60 的卫星
RBK13 = 1个 RBR10 + 2个 RBS10
RBK20 = 1个 RBR20 + 1个 RBS20
RBK23 = 1个 RBR20 + 2个 RBS20
RBK30 = 1个 RBR40 + 1个 RBW30
RBK33 = 1个 RBR40 + 2个 RBW30
RBK40 = 1个 RBR40 + 1个 RBS40
RBK43 = 1个 RBR40 + 2个 RBS20
RBK44 = 1个 RBR40 + 3个 RBS20
RBK50 = 1个 RBR50 + 1个 RBS50
RBK53 = 1个 RBR50 + 2个 RBS50
扩展阅读:Mesh 路由器有线回程布线方案
百度地图 | 天地图 | |
初始化地图 | var map = new BMap.Map("allmap"); | var map = new T.Map("allmap"); |
将覆盖物添加到地图 | addOverlay(overlay: Overlay) | addOverLay(overlay:OverLay) |
从 Map 的 click 事件中获取坐标点 | map.addEventListener("click", function (e) { Point = e.point; } | map.addEventListener("click", function (e) { LngLat = e.lnglat; } |
坐标点 | new BMap.Point(lng: Number, lat: Number) | new T.LngLat(lng: Numbe, lat: Number) |
像素点 | new BMap.Pixel(x: Number, y: Number) | new T.Point(x: Number, y: Number) |
文本标注 |
|
|
设置文本标注样式 | setStyle(styles: Object) | 每个样式使用单独的 set 方法实现 |
图像标注 |
|
|
为图像标注添加文本标注 | Marker.setLabel(label: Label) | 无。 可借用 title(鼠标掠过显示)属性来实现,并通过 Marker.options.title 来获取值 |
从图像标注获取坐标点 | Point = Marker.getPosition(); | LngLat = Marker.getLngLat(); |
绘制折线 |
|
|
绘制多边形 |
|
|
设置多边形的点数组 | Polygon.setPath(points: Array<Point>) | Polyline.setLngLats(lnglats: Array<LngLat>) |
设置地图视野 | Map.setViewport(view: Array<Point> | Viewport, viewportOptions: ViewportOptions) | Map.setViewport(view: Array<LngLat>) |
这是一篇可能解决困扰了 .NET 程序猿多年的文章!
首先,使用 Visual Studio 2019 创建一个 ASP.NET WEB 应用程序,直接选用了 MVC 模板。
直接发布项目,默认的设置如下图:
对于小型项目,按默认设置发布基本可满足正常运行,首次运行打开第一个页面基本在 5~6 秒(视服务器配置),其它页面的首次打开也基本在 1~2 秒完成,非首次瞬间打开。
一旦项目功能变得复杂,文件增多,会导致发布后首次运行打开第一个页面 30 秒以上,其它页面的首次打开 10 秒左右,非首次瞬间打开。
这是因为项目在发布时没有进行预编译,而是在用户访问网页时动态编译,一旦应用程序池回收,或项目文件改动,都会重新编译,再次经历缓慢的“第一次”,这是不能忍的。
于是咱们来研究一下“预编译”。
在发布页面勾选“在发布期间预编译”,这时发布会在“输出”窗口显示正在执行编译命令(编译时间会比较长):
该选项对发布后的文件结构和内容影响不大,因此对首次执行效率的提升也不大,重要的在后面。
在“高级预编译设置”窗口中:
我们针对预编译选项和合并选项分别做测试。
不勾选“允许更新预编译站点”,会致 bin 目录中生成许多 .compiled 文件,而所有 .cshtml 文件的内容都是:
这是预编译工具生成的标记文件,不应删除!
如果是 Web From 网站,.aspx/.ashx 等文件内容同上。
尝试打开网站页面,你会发现,除了项目启动后的第一个页面仍然需要 1~2 秒(无 EF),其余每个页面的首次都是瞬间打开的(EF 的首次慢不在本文讨论范围)。这让我对预编译有一种相见恨晚的感觉!
这里偷偷地告诉你,把 Views 目录删掉也不影响网页正常打开哦~为什么不让删,咱也不敢问,咱也不敢删。
目的达到了,有一些后遗症需要解决,比如 bin 目录内杂乱无章。
选“不合并。为每个页面和控件创建单独的程序集”,结果是 bin 多出许多 App_Web_*.dll 文件。
选“将所有输出合并到单个程序集”,填写程序集名称。这时会发现“输出”窗口执行了命令:
如果程序集名称跟已有名称冲突,会发生错误:
合并程序集时出错: ILMerge.Merge: The target assembly '******' lists itself as an external reference.
查看 bin 目录,.compiled 文件还在,但 App_Web_*.dll 合并成了一个程序集。FTP 的“不合并”也是把所有 App_Web_*.dll 上传一遍,所以不存在相对于“合并”的增量发布优势。
是不是勾了“视为库组件删除(AppCode.compiled 文件)”.compiled 文件就会不见?意外之外,情理之中,bin 没有什么变化。
继续选择“将各个文件夹输出合并到其自己的程序集”,呃,bin 中文件数不降反增。
最后选择“将所有页和控件输出合并到单个程序集”,同样程序集名称不能冲突。结局令人失望,bin 中仍然一大堆 .compiled 和 App_Web_*.dll。
整理成表格:
1 | 允许更新预编译站点 aspnet_compiler.exe -v / -p \Source -u \TempBuildDir 重复发布后 bin 目录文件数:不会增多(页面不进行预编译) |
2 | 不允许更新预编译站点,不合并 aspnet_compiler.exe -v / -p \Source \TempBuildDir 重复发布后 bin 目录文件数:.compiled 不会增多,App_Web_*.dll 增多 |
3 | 不允许更新预编译站点,不合并。为每个页面和控件创建单独的程序集 aspnet_compiler.exe -v / -p \Source -c -fixednames \TempBuildDir 重复发布后 bin 目录文件数:不会增多(编译后的文件名固定,FTP 方式的部分 App_Web_*.dll 文件可能实现增量上传) |
4 | 不允许更新预编译站点,将所有输出合并到单个程序集,不勾选“视为库组件” aspnet_compiler.exe -v / -p \Source -c \TempBuildDir aspnet_merge.exe \TempBuildDir -o 程序集名称 -copyattrs AssemblyInfo.dll -a 重复发布后 bin 目录文件数:不会增多(.compiled 固定名称,App_Web_*.dll 合并为一个) |
5 | 不允许更新预编译站点,将所有输出合并到单个程序集,勾选“视为库组件” aspnet_compiler.exe -v / -p \Source \TempBuildDir aspnet_merge.exe \TempBuildDir -o 程序集名称 -copyattrs AssemblyInfo.dll -a -r 重复发布后 bin 目录文件数:不会增多(.compiled 固定名称,App_Web_*.dll 合并为一个) |
6 | 不允许更新预编译站点,将每个文件夹输出合并到其自己的程序集,前缀 aspnet_compiler.exe -v / -p \Source -c \TempBuildDir aspnet_merge.exe \TempBuildDir -prefix 前缀 -copyattrs AssemblyInfo.dll -a 重复发布后 bin 目录文件数:.compiled 不会增多,App_Web_*.dll 增多 |
7 | 不允许更新预编译站点,将所有页和控件输出合并到单个程序集 aspnet_compiler.exe -v / -p \Source -c \TempBuildDir aspnet_merge.exe \TempBuildDir -w 程序集名称 -copyattrs AssemblyInfo.dll -a 重复发布后 bin 目录文件数:.compiled 不会增多,App_Web_*.dll 增多 |
bin 目录下,页面的程序集文件(App_Web_*.dll)增多的原因是编译后的文件名不固定,发布到会导致残留许多无用的程序集文件。
相比较,如果第 3 种能实现 FTP 稳定的增量上传的话是比较完美的(还有一个缺点是:如果页面有删除,目标 bin 内对应该页面的 .compiled 和 .dll 不会删除,这跟“允许更新预编译站点”是一个情况),那么第 4 种 或第 5 种也是不错的选择(同样有缺点:执行合并比较慢)。
测试一个有 300 个页面的项目,compiler 用时约 2 分钟,merge 用时约 5 分钟,发布用时约 4 分钟。
这里有个槽点,执行预编译和合并是佛系的,CPU 和磁盘使用率永远保持在最低水平。
所以如果是要经常修改的项目,那么建议选择“不合并”的第 3 种发布方式:
“视为库组件(删除 AppCode.compiled 文件)”:移除主代码程序集(App_Code 文件夹中的代码)的 .compiled 文件。 如果应用程序包含对主代码程序集的显式类型引用,则不要使用此选项。
补充:
不允许更新预编译站点发布后,因为前端页面没有内容,因此无法单独修改发布(单独发布一个页面后,在访问时不会生效!),只能全站发布,耗时较长;bin 目录有变动将导致使用 InProc 方式存储的 Session 丢失。
预编译的另一个优点是可以检查 .aspx / .cshtml 页面 C# 部分的错误(特别是命名空间和路径引用)。
改为预编译发布后,可以将服务器上残留的 .master / .ascx / .asax 删除,但不能删除 .aspx / .ashx /.config 等。
VS 发布到 FTP 经常会遗漏一些页面文件,不合并时会遗漏独立文件,合并后也会遗漏合并后的 .dll 的文件,合并的好处就是方便检查是否完全上传发布。
慎选“在发布前删除所有现有文件”!一旦勾选发布,世界就清静了,所有网友上传的图片附件以及网站运行产生的其它文件,消失得无影无踪。不管发布到文件系统还是发布到 FTP 都一样。当然,如果是先发布到文件系统,再通过 FileZilla 等 FTP 软件上传到服务器的,建议勾选此项。
.NET Core 应用程序部署:https://docs.microsoft.com/zh-cn/dotnet/core/deploying/index
由于上传文件时 bin 目录文件较多,理论上 bin 目录内的文件有任何改动都会重启应用池,而且 VS 是单线程上传的,导致期间网站访问缓慢,服务器 CPU 升高,我的做法是:发布到文件系统,再使用专用 FTP 工具上传,上传用时约半分钟(如果大小不同或源文件较新则覆盖文件)。还嫌慢?那就打包上传,解压覆盖。
关于本文研究对象的官方解释:高级预编译设置对话框
出现“未能加载文件或程序集“***”或它的某一个依赖项。试图加载格式不正确的程序。”的问题时,先用改用 Debug 方式发布会报详细错误,一般是 .aspx 等客户端页面有 C# 语法问题,注意提示报错的是 /obj/ 目录下的克隆文件,应更改原文件。排除错误后关闭所有页面,再使用 Release 方式发布。
当我们用 ASP.NET Web API 作服务端接口时,如果客户端以 GET 方式请求的 URL 中,由于拼接错误导致“?”和“&”并列出现,会发生 400 Bad Request,那么需要在 IIS 中使用 URL 重写模块来纠正。
请求 URL 如:
http://www.abc.com/api/obj?&foo=bar
需要重写为:
http://www.abc.com/api/obj?foo=bar
打开 IIS 管理器中对应网站的 URL 重写,
添加空白规则。
匹配的 URL 不包含域名,如上述 URL 则匹配的范围是:
api/obj
不包含我们要查找的字符串 ?&,所以此处模式只能匹配所有:
.*
又因为重定向路径中需要包含这部分,所以用括号包裹,即:
(.*)
继续添加条件匹配:
条件输入:{QUERY_STRING},表示匹配查询字符串,
匹配的部分是“?”后面的字符串:
&foo=bar
那么可以填写模式:
^\&.*
因为 & 后面的部分仍然需要使用,所以用括号包裹:
^\&(.*)
“操作”中选择类型“重定向”,URL 填写:
{R:1}?{C:1}
其中 {R:1} 指代 api/obj,{C:1} 指代 foo=bar
取消“附加查询字符串”前面的勾
重定向类型在测试时可以选择 302 或 307,没问题后选择 301。
完成。
最终我们可以在网站的配置文件 web.config 中看到:
<rewrite>
<rules>
<rule name="uni-app-h5-replace-q" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{QUERY_STRING}" pattern="^\&(.*)" />
</conditions>
<action type="Redirect" url="{R:1}?{C:1}" appendQueryString="false" redirectType="Temporary" />
</rule>
</rules>
</rewrite>
我们要把这段代码复制到开发环境源代码的 web.config 中,以免发布网站时将我们设置好的配置覆盖掉。
接入点模式(Access Point):将有线网络转换为无线网络。(同网段)
中继模式(Repeater):将已有的无线信号中继放大,扩大信号覆盖范围。(SSID 相同)
桥接模式(Bridge with AP):通过无线桥接到前端路由器的信号,自身发射新的无线信号。(SSID 可相同,可漫游)
客户端模式(Client):将无线网络转换为有线网络。(同网段)
〓 系统
功能 | 命令 | --help | 示例 |
---|---|---|---|
关机 | halt | halt | |
重启 | reboot | reboot | |
系统监视器 | top | 系统时间, 运行天数, 当前登录用户数, 系统负载 总进程数, 运行中的, 睡眠的, 停止的, 未响应的 Cpu(s):us 用户, sy 系统, ni XX, id 空闲, wa 等待, hi XX, si XX Mem, 已使用, 空余, 缓冲 Swap, 已使用, 空余, 缓冲 快捷键: M 按占内存排序 P 按占Cpu排序 1 显示每个 Cpu k 杀死进程 q 退出 | top |
查看进程 | ps | aux -ef | 列出包含 java 的进程 ps aux |grep java ps -ef |grep java |
查看内存及 Swap 用量 | free | -b,-k,-m,-g 按单位显示 | free -m |
查看系统时间 | date | 显示 CST 时间 -R 显示时区 -u 显示 UTC 时间 | date |
查看硬件时间 | clock | clock | |
设置系统日期 | date -s 月/日/年 | ||
设置系统时间 | date -s 时:分:秒 | ||
将系统时间写入到硬件时间 | clock -w | ||
查看系统版本 | cat /etc/*release | ||
升级系统软件 | yum update -y |
〓 文件
功能 | 命令 | --help | 示例 |
---|---|---|---|
进入目录 | cd | cd .. # 上一层目录 cd /root # 根目录 | |
列出目录 | ls | 白色:表示普通文件 蓝色:表示目录 绿色:表示可执行文件 红色:表示压缩文件 浅蓝色:链接文件 红色闪烁:表示链接的文件有问题 黄色:表示设备文件 灰色:表示其他文件 | ls |
创建目录 | mkdir | mkdir XXX | |
删除目录 | rm | rm -rf XXX | |
删除文件 | rm | rm XXX | |
复制文件 | cp | cp XXX YYY | |
复制目录 | cp | -r 复制目录及目录内的所有项目 -v 详细显示进行的步骤 | cp -rv XXX YYY |
重命名文件 | mv | -i: 若指定目录已有同名文件,则先询问是否覆盖旧文件; -f: 在mv操作要覆盖某已有的目标文件时不给任何指示; | mv 源文件 目标文件 |
移动文件 | mv | mv 一个或多个文件 目标目录 | |
下载文件 | wget | 下载到当前目录 | wget http://XXX.tar.gz |
计算文件/目录的磁盘用量 | du | -a 不仅显示目录,同时显示文件 -h 容易阅读方式显示 --max-depth=N 可指定计算深度 | du -ah --max-depth=1 | sort -n |
查找文件 | find | find /home -name *.apk |
〓 tar
功能 | 命令 | --help | 示例 |
---|---|---|---|
tar | tar | -z 是否压缩 -c 打包 -x 解包 -v 详细地列出处理的文件 -f | 打包:tar -cvf abc.tar abc 解包:tar -xvf abc.tar 压缩打包:tar -zcvf abc.tar.gz abc 解压解包:tar -zxvf abc.tar.gz |
〓 磁盘
功能 | 命令 | --help | 示例 |
---|---|---|---|
查看所有磁盘及分区 | fdisk -l | fdisk -l | |
查看当前挂载 | df | -h 按可阅读的方式打印数值和单位 -T 显示文件系统类型 | df -hT |
管理磁盘分区 | fdisk /dev/*** | 进入后的操作说明: m 显示命令菜单 d 删除一个分区 n 创建一个分区(e 扩展分区;p 主分区) t 改变分区ID q 不保存退出 w 保存退出 | fdisk /dev/vdb |
格式化分区 | mkfs.*** /dev/***N | mkfs.xfs /dev/vdb1 | |
挂载分区 | mount /dev/***N /*** | mount /dev/vdb1 /www | |
卸载分区 | umount /dev/***N | umount /dev/vdb1 | |
开机自动挂载 | vi /etc/fstab | 配置文档格式:设备 挂载点 文件系统类型 defaults 0 0 | 打开:vi /etc/fstab 配置:/dev/vdb1 /www xfs defaults 0 0 |
〓 网络
功能 | 命令 | --help | 示例 |
---|---|---|---|
查看 IP 配置 | ifconfig | ifconfig | |
配置网卡 IP | 配置文件目录:/etc/sysconfig/network-scripts/ 配置文件格式: DEVICE=eth0 / eth0:0 / ... # 在配置多线时若使用 cp 命令复制配置文件,必须修改此项以防止冲突 HWADDR=XX:XX:XX:XX:XX:XX # 网卡地址 TYPE=Ethernet # 以太网 UUID=******** ONBOOT=yes # 开机启动 NM_CONTROLLED=yes BOOTPROTO=static # 使用静态 IP IPADDR=192.168.1.2 # IP 地址 NETMASK=255.255.255.XXX # 子网掩码 GATEWAY=192.168.1.1 # 网关 DNS1=114.114.114.114 DNS2=8.8.8.8 | vi ifcfg-XXXN(:N) | |
重启网卡 | 使配置生效 | service network restart |
〓 防火墙
功能 | 命令 | --help | 示例 |
---|---|---|---|
配置 iptables | 添加需要允许的端口的方法同 22 端口 | vi /etc/sysconfig/iptables | |
重启使配置生效 | service iptables restart |
〓 用户/权限
功能 | 命令 | --help | 示例 |
---|---|---|---|
添加用户 | useradd | -g 组名 # 加入到该组 -s /bin/false #不允用户直接登录系统 | useradd –g 组名 用户名 -s /bin/false |
修改密码 | passwd | passwd 用户 | |
查看所有用户 | cut -d : -f 1 /etc/passwd | ||
查看可以登录系统的用户 | cat /etc/passwd | grep -v /sbin/nologin | cut -d : -f 1 | ||
删除用户 | -r, --remove remove home directory and mail spool | userdel 用户 | |
添加用户组 | groupadd | groupadd 组名 | |
为组添加用户(用户必须已存在) | gpasswd | gpasswd -a 用户 组 | |
将用户移出组 | gpasswd | gpasswd -d 用户 组 | |
查看用户所属组 | groups | groups 用户 | |
查看组中有哪些用户 | groupmems | groupmems -g 组 -l | |
更改文件/目录所有者 | chown | -R 递归处理所有的文件及子目录 | chown -R 用户:组 *** |
更改文件/目录权限 | chmod | -R 以递归方式更改所有的文件及子目录 | chmod -R 777 *** |
〓 vi 编辑器
功能 | 命令 | --help | 示例 |
---|---|---|---|
打开文件 | vi | vi XXX | |
进入编辑模式 | 按 a/i/o/Insert 等 | ||
进入末行模式/命令模式 | 按 Esc后: :w 保存不退出 :q 退出(提示是否保存) :wq 保存并退出 :w XXX 另存到文件 XXX :q! 不保存退出 |
〓 计划任务
功能 | 命令 | --help | 示例 |
---|---|---|---|
设置计划任务 | crontab | 详细步骤见本页底部 | crontab -l # 查看计划任务 crontab -e # 编辑计划任务 |
〓 网站
功能 | 命令 | --help | 示例 |
---|---|---|---|
简单审查日志 | cat | grep | cat 日志文件 | grep 关键词1 | grep 关键词2 | more | |
日志分析 | goaccess | 见下文 |
〓 goaccess
功能 | 命令 | --help | 示例 |
---|---|---|---|
安装 | yum install goaccess | ||
日志格式 | NCSA Commbined Log Format | date_format %d/%b/%Y log_format %h %^[%d:%^] "%r" %s %b "%R" "%u" | |
参数 | -f | 需要解析的日志文件 | |
参数 | -e | 指定 IP 地址统计 | |
参数 | -p | 指定配置文件 | 可以将上面的日志格式内容保存到文件 ~/.goacessrc |
参数 | -H | 显示 HTTP 协议信息 | |
参数 | -M | 显示 HTTP 方法信息 | |
生成文件 | goaccess -f 日志文件 -p ~/.goaccessrc > 目标文件.htm |
〓 lnmp
功能 | 命令 | --help | 示例 |
---|---|---|---|
重启 LNMP | /root/lnmp restart | ||
重启 MySQL | /etc/init.d/mysql restart | ||
重启 PureFTPd | /root/pureftpd restart | ||
安装 LNMP | http://lnmp.org/install.html | ||
常见问题 | http://lnmp.org/faq.html | ||
状态管理命令 | http://lnmp.org/faq/lnmp-status-manager.html | ||
相关软件目录及文件位置 | http://lnmp.org/faq/lnmp-software-list.html | ||
防跨站、跨目录安全设置(仅支持 PHP 5.3.3 以上版本) | http://www.vpser.net/security/lnmp-cross-site-corss-dir-security.html | ||
查看 Nginx 版本 | nginx -V | ||
查看 MySQL 版本 | mysql -V | ||
查看 PNP 版本 | php -v | ||
查看 Apache 版本 | httpd -v | ||
查内存 | cat /proc/meminfo | ||
php.ini | vim /usr/local/php/etc/php.ini | ||
MySQL 配置文件 | vim /etc/my.cnf | ||
添加网站 | /root/vhost.sh | ||
添加 ProFTPd 用户 | /root/proftpd_vhost.sh |
〓 nginx
功能 | 命令 | --help | 示例 |
---|---|---|---|
启动/停止/重启 | service nginx 或 /etc/rc.d/init.d/nginx | service nginx start service nginx stop service nginx restart | |
伪静态 | 在 .conf 文件中配置 | rewrite ^(.*)/read-htm-(.*)\.html(.*)$ $1/read.php?$2.html? last; rewrite ^(.*)/thread-htm-(.*)\.html(.*)$ $1/thread.php?$2.html? last; rewrite ^(.*)-htm-(.*)$ $1.php?$2 last; rewrite ^(.*)/simple/([a-z0-9\_]+\.html)$ $1/simple/index.php?$2 last; rewrite ^(.*)/data/(.*)\.(htm|php)$ 404.html last; rewrite ^(.*)/attachment/(.*)\.(htm|php)$ 404.html last; rewrite ^(.*)/html/(.*)\.(htm|php)$ 404.html last; | |
防盗链 | 在 .conf 文件中配置 | HttpRefererModule | location ~* \.(gif|jpg|png|swf|flv)$ { valid_referers none blocked *.0574bbs.com *.eyuyao.com 0574bbs.com eyuyao.com; if ($invalid_referer) { rewrite ^/ http://web1.eyuyao.com/yyad/src/3122.jpg; # return 404; } } |
浏览器缓存 | 在 .conf 文件中配置 | location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } |
〓 vsftpd
功能 | 命令 | --help | 示例 |
---|---|---|---|
安装 | yum install vsftpd | ||
查看是否已安装 | rpm -q vsftpd | ||
启动/停止/重启 | service vsftpd | service vsftpd start service vsftpd stop service vsftpd restart | |
配置文件 | vi /etc/vsftpd/vsftpd.conf |
〓 MySQL
功能 | 命令 | --help | 示例 |
---|---|---|---|
登录 | mysql | mysql -u username -p | |
登出 | exit | ||
查看信息 | status; | ||
查询当前正在执行的 SQL 语句 | show processlist; | ||
删除指定时间之前的日志 | PURGE | PURGE MASTER LOGS BEFORE '2015-1-1 0:00:00'; |
〓 scp 远程文件/目录传输命令 (yum install openssh-clients) 用法
scp 会把文件权限(读取/写入/执行)带过来,但所有者为当前执行 scp 命令的用户。
scp 低版本有许多漏洞,用完最好 yum remove openssh-clients
scp 采用直接覆盖的机制,如需判断文件无差异则跳过,应改用 rsync 命令。查看 rsync 详细使用方式及与 scp 对比
功能 | 命令 | --help | 示例 |
---|---|---|---|
若远程服务器 SSH 端口非默认 | scp | -P 端口号 | |
下载远程服务器上的文件到本地 | scp | scp 远程用户@远程服务器:远程文件 本地文件 | |
下载远程服务器上的目录到本地 | scp | -P 端口 -v 显示进度 -r 递归 | scp -r 远程用户@远程服务器:远程目录 本地目录 实例:scp -r root@x.x.x.x:/a/b/ /c/d/ 结果:/c/d/b/,即将整个 b 复制到 d 下(注意与 rsync 命令的区别) |
将本地文件上传到远程服务器 | scp | scp 本地文件 远程用户@远程服务器:远程文件 | |
将本地目录上传到远程服务器 | scp | 最终目录结构参:远程->本地 | scp -r 本地目录 远程用户@远程服务器:远程目录 |
〓 rsync 远程文件/目录传输命令 (yum install rsync) 用法查看 rsync 详细使用方式及与 scp 对比
rsync 会把文件权限(读取/写入/执行)带过来,所有者也会带过来。
相比于 scp 最大的优势就是可以增量同步
功能 | 命令 | --help | 示例 |
---|---|---|---|
下载远程服务器上的目录到本地 | rsync | -a 递归 -v 详细 -p, -- perms 保持权限 -g, -- group 保持属组 -o, --owner 保持属主 -r 递归 --progress 打印 --delete 删除已不存在的文件 -u 表示仅更新较新的文件 -z 表示在传输过程中进行压缩 -e 'ssh -p 2222' 指定其它端口 | rsync 远程用户@远程服务器:远程目录 本地目录 实例:rsync -avu --progress root@x.x.x.x:/a/b/ /c/d/ 结果:/c/d/,即将 b 内的文件(夹)复制到 d 下(注意与 scp 命令的区别) |
将本地文件上传到远程服务器 | rsync | rsync 本地文件 远程用户@远程服务器:远程文件 | |
将本地目录上传到远程服务器 | rsync | 最终目录结构参:远程->本地 | rsync 本地目录 远程用户@远程服务器:远程目录 |
〓 ftp 客户端 (yum install ftp)
功能 | 命令 | --help | 示例 |
---|---|---|---|
登录 | ftp | ftp 目标服务器 | |
列出远程当前路径目录/文件 | ls | ls | |
创建远程目录 | mkdir | mkdir 目录名 | |
删除远程目录(空) | rmrmdir | mkdir 目录名 | |
进入远程目录 | cd | cd 目录名 | |
显示远程当前路径 | pwd | pwd | |
重命名远程文件 | rename | rename 原文件名 新文件名 | |
上传文件 | put | put 本地文件名 | |
下载文件 | get | get 远程文件名 | |
批量下载文件 | mget | 需要单个确认 | |
批量下载文件【lftp】 | mirror | 参数有很多 | mirror |
返回 shell(不退出) | ! | ! | |
返回 ftp(接上步) | exit ftp | exit ftp | |
结束 | bye quit | bye quit |
〓 iftop
流量监控工具 教程
〓 GoAccess
实时网站日志分析工具 官网
〓 Cacti
常见问题笔记
加硬盘
插入新硬盘
若有 RAID,则先设置,使操作系统能认到硬盘
使用 fdisk 命令对新设备进行分区
使用 mkfs 命令对新分区进行格式化
使用 mount 命令进行挂载
设置开机自动挂载(vi /etc/fstab)
更改 MySQL 数据库目录位置
停止 MySQL 服务
将原数据目录转移或复制到新位置(若是复制,则修改所有者使原来一致)
找到 my.cnf 配置文件(一般在 /etc/),修改 datadir 值为新路径
启动 MySQL 服务
502 Bad Gateway 问题排查
查看 PHP 日志,路径:/usr/local/php/var/log
一般为“server reached pm.max_children setting (10), consider raising it”连接数问题,在“/usr/local/php/etc”下的所有配置文件中查找并修改相关设置即可(如改成 1000)。
计划任务(实例:定时备份数据库并通过 FTP 同步至其它服务器)
创建可执行文件:vi dotask.sh
dotask.sh 的内容示例:
DATE_TIME=`date +%Y_%m_%d_%H%M%S`;
FILE_NAME=数据库名_backup_$DATE_TIME.sql;
cd /home/mysqlbackup/;
mysqldump -u数据库用户名 -p数据库密码 数据库名>$FILE_NAME;
tar -zcf $FILE_NAME.tar.gz $FILE_NAME;
rm $FILE_NAME;
ftp -v -n FTP地址 << END
user FTP用户名 FTP密码
bin
put 本地目录文件 目标路径文件
bye
END
文件名乱码问题可以在行末加“;”来解决赋予执行权限:chmod 777 dotask.sh (ls 命令时呈绿色)
编辑计划任务:crontab -e
crontab 书写规则:
# 分 时 日 月 周 文件路径
0 3 * * * /home/dotask.sh
30 4 * * * /home/dotask2.sh重启 crond:/etc/init.d/crond restart
netstat
netstat -an | grep xxx.xxx.xxx.xxx 可查看此 IP 的 TCP 请求及端口
最近,空心图标和实心图标的讨论变得激烈起来,有言论指出空心图标在视觉上比实心图标看起来更复杂,更容易让用户差生疲劳感和倦怠感。对此,设计师们都各抒己见,一部分人表示赞同这种说法,而另一部分人则表示这样的言论将问题过分了放大化了,并且在证据方面有所欠缺。
图标也可以理解为是网站中的一种指引,是每个新用户都会涉及到的元素,所以无论空心或实心,一个能够令人一目了然,并且记忆深刻的图标才是用户真正喜欢的图标。
以下是小编搜寻的一些空心或实心的图标案例,看看你更倾心于哪一款呢?
1.模糊背景上覆盖着由简单线条、字体和单一的颜色组成的空心图标,这会让整个界面看起来很优雅。不仅如此,这种简易的设计手法也让设计师轻松不少,在效果和操作上都令大家很满意。
2.纯色的背景似乎搭配任何元素都能达到令人意想不到的效果,下面这个案例也不例外。正红色与白色之间的经典配搭,加以可爱的造型,成就了一个俏皮的实心图标设计。界面底部的实心按钮与幽灵按钮也与图标区域前后呼应。
3.APP底部的图标随着用户的任意切换,在空心和实心之间自由转变。实心的图标相比较空心的而言,给人一种更突出和明显的视觉效果,让用户更容易的抓到重点。而主内容左边的卡通小图案同时采用了空心的设置,尽显极简主义。
4.Line的界面似乎代表了大多数APP的图标设计方式。头部和底部的图标选用两种颜色的实心设计,下拉菜单部分使用空心图标。这样的设计虽然比较大众化,但不可否认的是,这样的做法的确让整个界面看起来格外整洁。
5.幽灵按钮虽然简洁大方,但是过多的使用会另界面很单调无味,但如果使用全部实心的图标设计又会觉得很突兀。下面这个案例就想出了一个好方法。既然空心实心都不合适,那不如尝试一下让两者结合在一起吧。
6.两种色差明显的颜色搭配在一起会体现出一种自然而然的时尚感,黑色背景和亮黄色的图标元素就是很典型的例子。强烈的对比色会让空心图标看起来也像实心图标一样,具有突出重点的效果。
7.Metro风格的界面设计也能运用在APP的图标模块中,案例中将各种第三方分享平台的实心图标都用方块元素连接在一起,让原本单调的图标瞬间活跃了起来,给用户一种焕然一新的感觉。
8.传统的导航图标大多会集中在一个区域内,而SevenEleven的APP在此做了很大的突破,将4个部分分别分布在界面的上下左右,简单的界面突然有了运动场的氛围,让APP充满了生命力。
9.天气类应用的看点中总会有气候图标的一席之地,正如这个案例中所表现的,这又是一个空心与实心相结合的图标设计。
10.这也是一个纯色块与实心图标搭配的案例,这个APP的界面设计其实很普通,但正因为图标的设计让网站变得可爱起来。
图标在网页设计中算是一个小单元,但它的重要性大家都有目共睹。空心图标和实心图标在不同的环境中发挥着不同的作用,美化着网页中的小细节。