├── .gitignore
├── Other
├── Git常用命令清单.md
├── HTTP-Status-codes.md
├── img_http
│ └── Fetching_a_page.png
└── 通过代理工具提高Github Clone速度.md
├── README.md
├── back-end
├── Redis
│ ├── README.md
│ ├── Redis.conf
│ └── Redis3.0.7.conf
└── centOS
│ ├── CentOS.md
│ ├── CentOS7安装KVM虚拟机详解.md
│ ├── CentOS7安装维护Gitlab.md
│ ├── CentOS7安装配置vsftp搭建FTP.md
│ ├── CentOS7更换yum软件镜像源.md
│ ├── CentOS7网络配置.md
│ ├── Centos7安装编译Node.md
│ ├── Elasticsearch安装维护.md
│ ├── Golang安装.md
│ ├── Linux添加、删除用户和用户组.md
│ ├── Mac下制作CentOS7启动盘.md
│ ├── Mac使用NFS连接CentOS上的共享文件夹.md
│ ├── Python2升级到Python3.md
│ ├── Rocket.Chat.md
│ ├── Ruby安装.md
│ ├── chmod.md
│ ├── img
│ ├── img01.jpg
│ ├── kvmbanner-logo3.png
│ └── screenshot.png
│ ├── nginx.md
│ ├── samba.md
│ ├── 使用免费SSL证书让网站支持HTTPS访问.md
│ ├── 修改ssh端口号的方法.md
│ ├── 在5分钟内搭建企业内部私有npm仓库.md
│ ├── 安装Java.md
│ ├── 安装openstack.md
│ ├── 安装pip工具.md
│ ├── 安装使用svn.md
│ ├── 尝试在CentOS7.2上编译安装Swift.md
│ ├── 常用基础命令.md
│ ├── 搭建Shadowsocks服务器.md
│ ├── 管理远程会话screen工具.md
│ └── 部署Seafile搭建自己的网盘.md
└── front-end
└── Javascript
├── JS基础-基本概念.png
├── JS基础-基本语句.png
├── JS基础-字符串基本及常用方法汇总.png
├── JS基础-常基本用方法.png
├── JS基础-操作符.png
├── JS基础-数组基本及常用方法.png
├── RN
├── React-native Android环境搭建.md
└── img
│ ├── Genymotion01.jpg
│ ├── Genymotion02.jpg
│ ├── Genymotion03.jpg
│ ├── Genymotion04.jpg
│ └── React-native-run.gif
├── 函数基础.gif
├── 变量.gif
├── 基本dom操作.gif
├── 字符串函数.gif
├── 数组.gif
├── 正则表达式.gif
├── 正则表达式.md
├── 流程语句.gif
├── 轻量高效的开源JavaScript插件和库.md
└── 运算符.gif
/.gitignore:
--------------------------------------------------------------------------------
1 | md/
2 | node_modules/
3 | .DS_Store
4 |
--------------------------------------------------------------------------------
/Other/HTTP-Status-codes.md:
--------------------------------------------------------------------------------
1 |
2 | 常见HTTP/FTP/WebSocket错误代码大全
3 | ---
4 |
5 | 
6 |
7 | 目录
8 | ===
9 |
10 |
11 | - [HTTP](#http)
12 | - [1xx消息](#1xx消息)
13 | - [2xx成功](#2xx成功)
14 | - [3xx重定向](#3xx重定向)
15 | - [4xx客户端错误](#4xx客户端错误)
16 | - [5xx服务器错误](#5xx服务器错误)
17 | - [FTP](#ftp)
18 | - [1xx初步](#1xx初步)
19 | - [2xx完成](#2xx完成)
20 | - [3xx中间](#3xx中间)
21 | - [4xx瞬态否定](#4xx瞬态否定)
22 | - [5xx永久性否定](#5xx永久性否定)
23 | - [6xx受保护](#6xx受保护)
24 | - [WebSockets状态码](#websockets状态码)
25 | - [参考资料](#参考资料)
26 |
27 |
28 |
29 | ## HTTP
30 |
31 | ### 1xx消息
32 |
33 | _这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送1xx响应。 这些状态码代表的响应都是信息性的,标示客户应该采取的其他行动。_
34 |
35 | - 100 - 客户端应当继续发送请求
36 | - 101 - 切换协议
37 | - 102 - 处理将被继续执行
38 |
39 | ### 2xx成功
40 |
41 | _这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。_
42 |
43 | - 200 - (成功)请求已成功,请求所希望的响应头或数据体将随此响应返回。
44 | - 201 - (已创建)请求成功且服务器已创建了新的资源。。
45 | - 202 - (已接受)服务器已接受了请求,但尚未对其进行处理。
46 | - 203 - (非授权信息)服务器已成功处理了请求,但返回了可能来自另一来源的信息。
47 | - 204 - (无内容)服务器成功处理了请求,但未返回任何内容。
48 | - 205 - (重置内容)服务器成功处理了请求,但未返回任何内容。
49 | - 206 - (部分内容)服务器成功处理了部分 GET 请求。
50 |
51 | ### 3xx重定向
52 |
53 | _这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明。按照HTTP/1.0版规范的建议,浏览器不应自动访问超过5次的重定向。对重定向一般是由浏览器来控制重定向的次数,重定向会导致客户端不必要的资源消耗_
54 |
55 | - 300 - 多重选择,被请求的资源有一系列可供选择的回馈信息。
56 | - 301 - 永久移除,被请求的资源已永久移动到新位置。
57 | - 302 - 临时移动,请求的资源现在临时从不同的URI响应请求。
58 | - 303 - 查看其他位置,对应当前请求的响应可以在另一个URI上被找到,而且客户端应当采用GET的方式访问那个资源。
59 | - 304 - 未修改。自从上次请求后,请求的网页未被修改过。服务器返回此响应时,不会返回网页内容。
60 | - 305 - 使用代理,被请求的资源必须通过指定的代理才能被访问。
61 | - 306 - 临时重定向,在最新版的规范中,306状态码已经不再被使用。
62 | - 307 - 临时重定向。
63 |
64 | ### 4xx客户端错误
65 |
66 | _这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。_
67 |
68 | - 400 - 错误的请求。
69 | - 401 - 访问被拒绝。
70 | - 402 - 付款要求。
71 | - 403 - 禁止访问
72 | - 403.1 - 执行访问被禁止。
73 | - 403.2 - 读访问被禁止。
74 | - 403.3 - 写访问被禁止。
75 | - 403.4 - 要求 SSL。
76 | - 403.5 - 要求 SSL 128。
77 | - 403.6 - IP 地址被拒绝。
78 | - 403.7 - 要求客户端证书。
79 | - 403.8 - 站点访问被拒绝。
80 | - 403.9 - 用户数过多。
81 | - 403.10 - 配置无效。
82 | - 403.11 - 密码更改。
83 | - 403.12 - 拒绝访问映射表。
84 | - 403.13 - 客户端证书被吊销。
85 | - 403.14 - 拒绝目录列表。
86 | - 403.15 - 超出客户端访问许可。
87 | - 403.16 - 客户端证书不受信任或无效。
88 | - 403.17 - 客户端证书已过期或尚未生效。
89 | - 403.18 - 在当前的应用程序池中不能执行所请求的 URL。
90 | - 403.19 - 不能为这个应用程序池中的客户端执行 CGI。
91 | - 403.20 - Passport 登录失败。
92 | - 404 - 未找到。
93 | - 404.0 -(无) – 没有找到文件或目录。
94 | - 404.1 - 无法在所请求的端口上访问 Web 站点。
95 | - 404.2 - Web 服务扩展锁定策略阻止本请求。
96 | - 404.3 - MIME 映射策略阻止本请求。
97 | - 405 - 用来访问本页面的 HTTP 谓词不被允许(方法不被允许)
98 | - 406 - 客户端浏览器不接受所请求页面的 MIME 类型。
99 | - 407 - 要求进行代理身份验证。
100 | - 408 - 请求超时。
101 | - 409 - 由于和被请求的资源的当前状态之间存在冲突,请求无法完成。
102 | - 410 - 被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。
103 | - 411 - 服务器拒绝在没有定义Content-Length头的情况下接受请求。
104 | - 412 - 前提条件失败。
105 | - 413 – 请求实体太大。
106 | - 414 - 请求 URI 太长。
107 | - 415 – 不支持的媒体类型。
108 | - 416 – 所请求的范围无法满足。
109 | - 417 – 执行失败。
110 | - 418 – 本操作码是在1998年作为IETF的传统[愚人节笑话](http://www.baike.com/wiki/%E6%81%B6%E6%90%9ERFC)。
111 | - 421 – 从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围。
112 | - 422 – 请求格式正确,但是由于含有语义错误,无法响应。
113 | - 423 – 当前资源被锁定。
114 | - 424 – 由于之前的某个请求发生的错误,导致当前请求失败。
115 | - 425 – 无序的集合。
116 | - 426 – 客户端应当切换到TLS/1.0。
117 | - 451 – (由IETF在2015核准后新增加)该访问因法律的要求而被拒绝。
118 |
119 | ### 5xx服务器错误
120 |
121 | _这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。_
122 |
123 | - 500 - 内部服务器错误。
124 | - 501 - 尚未实施,页眉值指定了未实现的配置。
125 | - 502 - 错误网关,Web 服务器用作网关或代理服务器时收到了无效响应。
126 | - 503 - 服务不可用,这个错误代码为 IIS 6.0 所专用。
127 | - 504 - 网关超时,服务器作为网关或代理,未及时从上游服务器接收请求。
128 | - 505 - HTTP 版本不受支持,服务器不支持请求中所使用的 HTTP 协议版本。
129 | - 506 - 服务器没有正确配置。
130 | - 507 - 存储空间不足。服务器无法存储完成请求所必须的内容。这个状况被认为是临时的。
131 | - 509 - 带宽超过限制。这不是一个官方的状态码,但是仍被广泛使用。
132 | - 510 - 没有扩展,获取资源所需要的策略并没有被满足。
133 |
134 | ## FTP
135 |
136 | ### 1xx初步
137 |
138 | _肯定的初步答复,这些状态代码指示一项操作已经成功开始,但客户端希望在继续操作新命令前得到另一个答复。_
139 |
140 | - 110 重新启动标记答复。
141 | - 120 服务已就绪,在 nnn 分钟后开始。
142 | - 125 数据连接已打开,正在开始传输。
143 | - 150 文件状态正常,准备打开数据连接。
144 |
145 | ### 2xx完成
146 |
147 | _肯定的完成答复,一项操作已经成功完成。客户端可以执行新命令。_
148 |
149 | - 200 命令确定。
150 | - 202 未执行命令,站点上的命令过多。
151 | - 211 系统状态,或系统帮助答复。
152 | - 212 目录状态。
153 | - 213 文件状态。
154 | - 214 帮助消息。
155 | - 215 NAME 系统类型,其中,NAME 是 Assigned Numbers 文档中所列的正式系统名称。
156 | - 220 服务就绪,可以执行新用户的请求。
157 | - 221 服务关闭控制连接。如果适当,请注销。
158 | - 225 数据连接打开,没有进行中的传输。
159 | - 226 关闭数据连接。请求的文件操作已成功(例如,传输文件或放弃文件)。
160 | - 227 进入被动模式 (h1,h2,h3,h4,p1,p2)。
161 | - 230 用户已登录,继续进行。
162 | - 250 请求的文件操作正确,已完成。
163 | - 257 已创建“PATHNAME”。
164 |
165 | ### 3xx中间
166 |
167 | _肯定的中间答复,该命令已成功,但服务器需要更多来自客户端的信息以完成对请求的处理。_
168 |
169 | - 331 用户名正确,需要密码。
170 | - 332 需要登录帐户。
171 | - 350 请求的文件操作正在等待进一步的信息。
172 |
173 | ### 4xx瞬态否定
174 |
175 | _瞬态否定的完成答复,该命令不成功,但错误是暂时的。如果客户端重试命令,可能会执行成功。_
176 |
177 | - 421 服务不可用,正在关闭控制连接。如果服务确定它必须关闭,将向任何命令发送这一应答。
178 | - 425 无法打开数据连接。
179 | - 426 Connection closed; transfer aborted.
180 | - 450 未执行请求的文件操作。文件不可用(例如,文件繁忙)。
181 | - 451 请求的操作异常终止:正在处理本地错误。
182 | - 452 未执行请求的操作。系统存储空间不够。
183 |
184 | ## 5xx永久性否定
185 |
186 | _永久性否定的完成答复,该命令不成功,错误是永久性的。如果客户端重试命令,将再次出现同样的错误。_
187 |
188 | - 500 语法错误,命令无法识别。这可能包括诸如命令行太长之类的错误。
189 | - 501 在参数中有语法错误。
190 | - 502 未执行命令。
191 | - 503 错误的命令序列。
192 | - 504 未执行该参数的命令。
193 | - 530 未登录。
194 | - 532 存储文件需要帐户。
195 | - 550 未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限)。
196 | - 551 请求的操作异常终止:未知的页面类型。
197 | - 552 请求的文件操作异常终止:超出存储分配(对于当前目录或数据集)。
198 | - 553 未执行请求的操作。不允许的文件名。
199 |
200 | ## 6xx受保护
201 |
202 | - 600 Series,Replies regarding confidentiality and integrity
203 | - 631 Integrity protected reply.
204 | - 632 Confidentiality and integrity protected reply.
205 | - 633 Confidentiality protected reply.
206 |
207 | ## WebSockets状态码
208 |
209 | _WebSockets 的CloseEvent 会在连接关闭时发送给使用 WebSockets 的客户端。它在 WebSocket 对象的 onclose 事件监听器中使用。服务端发送的关闭码,以下为已分配的状态码。_
210 |
211 | |状态码 | 名称 | 描述 |
212 | | --- | --- | --- |
213 | |0–999 | - | 保留段, 未使用。 |
214 | |1000 | CLOSE_NORMAL | 正常关闭; 无论为何目的而创建, 该链接都已成功完成任务。 |
215 | |1001 | CLOSE_GOING_AWAY | 终端离开, 可能因为服务端错误, 也可能因为浏览器正从打开连接的页面跳转离开。 |
216 | |1002 | CLOSE_PROTOCOL_ERROR | 由于协议错误而中断连接。 |
217 | |1003 | CLOSE_UNSUPPORTED | 由于接收到不允许的数据类型而断开连接 (如仅接收文本数据的终端接收到了二进制数据)。 |
218 | |1004 | - | 保留。 其意义可能会在未来定义。 |
219 | |1005 | CLOSE_NO_STATUS | 保留。 表示没有收到预期的状态码。 |
220 | |1006 | CLOSE_ABNORMAL | 保留。 用于期望收到状态码时连接非正常关闭 (也就是说, 没有发送关闭帧)。 |
221 | |1007 | Unsupported Data | 由于收到了格式不符的数据而断开连接 (如文本消息中包含了非 UTF-8 数据)。 |
222 | |1008 | Policy Violation | 由于收到不符合约定的数据而断开连接。 这是一个通用状态码, 用于不适合使用 1003 和 1009 状态码的场景。 |
223 | |1009 | CLOSE_TOO_LARGE | 由于收到过大的数据帧而断开连接。 |
224 | |1010 | Missing Extension | 客户端期望服务器商定一个或多个拓展, 但服务器没有处理, 因此客户端断开连接。 |
225 | |1011 | Internal Error | 客户端由于遇到没有预料的情况阻止其完成请求, 因此服务端断开连接。 |
226 | |1012 | Service Restart | 服务器由于重启而断开连接。 [Ref] |
227 | |1013 | Try Again Later | 服务器由于临时原因断开连接, 如服务器过载因此断开一部分客户端连接。 [Ref] |
228 | |1014 | - |由 WebSocket 标准保留以便未来使用。 |
229 | |1015 | TLS Handshake | 保留。 表示连接由于无法完成 TLS 握手而关闭 (例如无法验证服务器证书)。 |
230 | |1016–1999 | - | 由 WebSocket 标准保留以便未来使用。 |
231 | |2000–2999 | - | 由 WebSocket 拓展保留使用。 |
232 | |3000–3999 | - | 可以由库或框架使用。 不应由应用使用。 可以在 IANA 注册, 先到先得。 |
233 | |4000–4999 | - | 可以由应用使用。 |
234 |
235 | ## 参考资料
236 |
237 | - [HTTP状态码列表](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes)
238 | - [FTP状态码列表](https://en.wikipedia.org/wiki/List_of_FTP_server_return_codes)
239 | - [MDN CloseEvent](https://developer.mozilla.org/zh-CN/docs/Web/API/CloseEvent)
240 | - [HTTP 404](https://en.wikipedia.org/wiki/HTTP_404#Custom_error_pages)
241 | - [List of FTP server return codes](https://en.wikipedia.org/wiki/List_of_FTP_server_return_codes)
242 | - [HTTP概述](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Overview)
243 | - [Help for HTTP error 403: “Forbidden”](http://www.getnetgoing.com/HTTP-403.html)
--------------------------------------------------------------------------------
/Other/img_http/Fetching_a_page.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/Other/img_http/Fetching_a_page.png
--------------------------------------------------------------------------------
/Other/通过代理工具提高Github Clone速度.md:
--------------------------------------------------------------------------------
1 | 今天克隆速度极为慢,搜了一下原来不止我一个人慢,下面三种方法提速,我折腾了一下,之前一直clone 不下来,现在我居然clone下来了,蛋蛋好疼。
2 |
3 | ## 中转克隆
4 |
5 | 借助[coding.net](https://coding.net)的 git 导入功能,通过git服务器clone你要下载的项目,再从 coding.net 上面下载下来。这是最方便,速度最快的方法。
6 |
7 | ## 使用翻墙代理
8 |
9 | 首先你要有代理工具,前提是已经打开了SS代理,获取 socks5 的代理地址,通过git的内置工具设置代理地址,`127.0.0.1:9742` 这个是我的工具给我分配的端口号码。
10 |
11 | ```
12 | git config --global http.proxy socks5://127.0.0.1:9742
13 | git config --global https.proxy socks5://127.0.0.1:9742
14 | ```
15 |
16 | 也可以直接修改配置文件 `sudo vi ~/.gitconfig` ,摁`i`进入编辑模式,在最下面添加一段配置代码,按`Esc`退出编辑模式,输入:wq保存并退出。
17 |
18 | ```
19 | [http]
20 | proxy = socks5://127.0.0.1:9742
21 | [https]
22 | proxy = socks5://127.0.0.1:9742
23 | ```
24 |
25 | ## 修改host
26 |
27 | 其实git clone或者git push特别慢,并不是因为`http://github.com`的这个域名被限制了。而是"`http://github.global.ssl.fastly.Net`这个域名被限制了。那么首先查到这个域名的ip。然后再hosts文件中进行`ip->域名`映射就可以了。这个办法会让clone或者push速度飞起。在命令行中输入 `sudo vi /etc/hosts` 编辑 hosts 文件,摁`i`进入编辑模式,将下面代码复制下面,按`Esc`退出编辑模式,输入:wq保存并退出。
28 |
29 | ```
30 | 151.101.72.249 global-ssl.fastly.Net
31 | 192.30.253.112 github.com
32 | ```
33 |
34 | 通过 `dig github.com` 查看IP地址
35 |
36 | ```bash
37 | dig github.com
38 |
39 | # 输出下面内容
40 | # -----------------------
41 | # ; <<>> DiG 9.8.3-P1 <<>> github.com
42 | # ;; global options: +cmd
43 | # ;; Got answer:
44 | # ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57278
45 | # ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
46 | #
47 | # ;; QUESTION SECTION:
48 | # ;github.com. IN A
49 | #
50 | # ;; ANSWER SECTION:
51 | # github.com. 60 IN A 192.30.253.112
52 | # github.com. 60 IN A 192.30.253.113
53 | #
54 | # ;; Query time: 16 msec
55 | # ;; SERVER: 192.168.188.1#53(192.168.188.1)
56 | # ;; WHEN: Wed Mar 22 21:35:21 2017
57 | # ;; MSG SIZE rcvd: 60
58 | ```
59 |
60 |
61 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 学习手册
2 | ---
3 |
4 | > 学习过程中看到的好文收集整理,记录一下,减少搜索查找的时间
5 |
6 |
--------------------------------------------------------------------------------
/back-end/Redis/Redis.conf:
--------------------------------------------------------------------------------
1 | # redis 主配置文件
2 | # 基于redis 2.6.10
3 | # 请使用 redis-server 配置文件路径 来启动redis
4 |
5 | # 请注意一下配置文件的数据单位,大小写不敏感
6 | # 1k => 1000 bytes
7 | # 1kb => 1024 bytes
8 | # 1m => 1000000 bytes
9 | # 1mb => 1024*1024 bytes
10 | # 1g => 1000000000 bytes
11 | # 1gb => 1024*1024*1024 bytes
12 |
13 | ################################################################################
14 | # redis 的基础配置 #
15 | ################################################################################
16 |
17 | # 是否作为守护进程运行,生产环境用yes
18 | daemonize yes
19 |
20 | # 如果作为守护进程运行的话,redis会把pid打印到这个文件
21 | # 主要多实例的时候需要写成不同的文件
22 | pidfile /var/run/redis.pid
23 |
24 | # redis监听的端口,注意多实例的情况
25 | port 6379
26 |
27 | # 允许访问redis的ip
28 | # 测试环境注释该选项,生产环境把所有允许访问的ip都打一次
29 | # bind xxx.xxx.xxx.xxx
30 |
31 | # 关闭无消息的客户端的间隔,0为关闭该功能
32 | timeout 0
33 |
34 | # 对客户端发送ACK信息,linux中单位为秒
35 | tcp-keepalive 0
36 |
37 | # 数据库的数量,我们的游戏建议为1,然后多开实例
38 | databases 1
39 |
40 | ################################################################################
41 | # redis 的持久化配置 #
42 | ################################################################################
43 |
44 | # save 间隔 最小更新操作
45 | # 900秒(15分钟)之后,且至少1次变更
46 | # 300秒(5分钟)之后,且至少10次变更
47 | # 60秒之后,且至少10000次变更
48 | # 如果完全作为缓存开启把save全删了
49 |
50 | # save 900 1
51 | # save 300 10
52 | # save 60 2000
53 |
54 | # 持久化失败以后,redis是否停止
55 | stop-writes-on-bgsave-error no
56 |
57 | # 持久化的时候是否运行对字符串对象进行压缩,算法为LZF
58 | rdbcompression yes
59 |
60 | # 文件末尾是否包含一个CRC64的校验和
61 | rdbchecksum yes
62 |
63 | # redis存储数据的文件,注意多实例的时候该不同名字或者用不同的工作目录
64 | dbfilename dump.rdb
65 |
66 | # redis的工作目录,注意多实例的时候该不同名字或者用不同的工作目录
67 | # 建议用不同的工作目录
68 | dir /temp/
69 |
70 | #设置该数据库为其他数据库的从数据库
71 | # slaveof
72 |
73 | ################################################################################
74 | # redis 的限制 #
75 | ################################################################################
76 |
77 | # requirepass设置客户端连接后进行任何其他指定前需要使用的密码。
78 | # 警告:redis速度相当快,一个外部的用户可以在一秒钟进行150K次的密码尝试,
79 | # 你需要指定非常非常强大的密码来防止暴力破解。
80 | # requirepass foobared
81 |
82 |
83 | # 指定与主数据库连接时需要的密码验证
84 | # masterauth
85 |
86 | # 设置最多同时连接客户端数量。
87 | # 默认没有限制,这个关系到Redis进程能够打开的文件描述符数量。
88 | # 特殊值"0"表示没有限制。
89 | # 一旦达到这个限制,Redis会关闭所有新连接并发送错误"达到最大用户数上限(max number of
90 | # clients reached)"
91 | #
92 | # maxclients 128
93 |
94 | # 不要用比设置的上限更多的内存。一旦内存使用达到上限,Redis会根据选定的回收策略
95 | #(参见:maxmemmory-policy)删除key。
96 |
97 | # 当内存达到设置上限时,内存的淘汰策略
98 | # maxmemmory-policy [volatile-lru or volatile-tt or volatile-randowm or allkeys-lru or allkeys-random]
99 |
100 | #
101 | # 如果因为删除策略问题Redis无法删除key,或者策略设置为 "noeviction",Redis会回复需要更多内存
102 | # 的错误信息给命令。
103 | # 例如,SET,LPUSH等等。但是会继续合理响应只读命令,比如:GET。
104 | #
105 | # 在使用Redis作为LRU缓存,或者为实例设置了硬性内存限制的时候(使用 "noeviction" 策略)的时候,
106 | # 这个选项还是满有用的。
107 | #
108 | # 警告:当一堆slave连上达到内存上限的实例的时候,响应slave需要的输出缓存所需内存不计算在使用内存
109 | # 当中。
110 | # 这样当请求一个删除掉的key的时候就不会触发网络问题/重新同步的事件,然后slave就会收到一堆删除指
111 | # 令,直到数据库空了为止。
112 | #
113 | # 简而言之,如果你有slave连上一个master的话,那建议你把master内存限制设小点儿,确保有足够的系统
114 | # 内存用作输出缓存。
115 | # (如果策略设置为"noeviction"的话就不无所谓了)
116 | #
117 | maxmemory 2gb
118 |
119 | # 内存策略:如果达到内存限制了,Redis如何删除key。你可以在下面五个策略里面选:
120 | #
121 | # volatile-lru -> 根据LRU算法生成的过期时间来删除。
122 | # allkeys-lru -> 根据LRU算法删除任何key。
123 | # volatile-random -> 根据过期设置来随机删除key。
124 | # allkeys->random -> 无差别随机删。
125 | # volatile-ttl -> 根据最近过期时间来删除(辅以TTL)
126 | # noeviction -> 谁也不删,直接在写操作时返回错误。
127 | #
128 | # 注意:对所有策略来说,如果Redis找不到合适的可以删除的key都会在写操作时返回一个错误。
129 | #
130 | # 这里涉及的命令:set setnx setex append
131 | # incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
132 | # sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
133 | # zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
134 | # getset mset msetnx exec sort
135 | #
136 | # 默认值如下:
137 | #
138 | # maxmemory-policy volatile-lru
139 |
140 | maxmemory-policy allkeys-lru
141 |
142 | # LRU和最小TTL算法的实现都不是很精确,但是很接近(为了省内存),所以你可以用样例做测试。
143 | # 例如:默认Redis会检查三个key然后取最旧的那个,你可以通过下面的配置项来设置样本的个数。
144 | #
145 | # maxmemory-samples 3
146 |
147 |
148 | # 是否开启虚拟内存支持。
149 | # 因为 redis 是一个内存数据库,而且当内存满的时候,无法接收新的写请求,所以在redis2.0中,提供了虚拟内存的支持。
150 | # 但是需要注意的是,redis中,所有的key都会放在内存中,在内存不够时,只会把value 值放入交换区。
151 | # 这样保证了虽然使用虚拟内存,但性能基本不受影响,
152 | # 同时,你需要注意的是你要把vm-max-memory设置到足够来放下你的所有的key
153 | vm-enabled no
154 | # vm-enabled yes
155 |
156 |
157 | # 设置虚拟内存的交换文件路径
158 | vm-swap-file /tmp/redis.swap
159 |
160 | # 这里设置开启虚拟内存之后,redis将使用的最大物理内存的大小。
161 | # 默认为0,redis将把他所有的能放到交换文件的都放到交换文件中,以尽量少的使用物理内存。
162 | # 在生产环境下,需要根据实际情况设置该值,最好不要使用默认的 0
163 | vm-max-memory 0
164 |
165 | # 设置虚拟内存的页大小,如果你的 value 值比较大,比如说你要在 value 中放置博客、新闻之类的所有文章内容,就设大一点,如果要放置的都是很小的内容,那就设小一点
166 | vm-page-size 32
167 |
168 | # 设置交换文件的总的 page 数量,需要注意的是,page table信息会放在物理内存中,每8个page 就会占据RAM中的 1 个 byte。
169 | # 总的虚拟内存大小 = vm-page-size * vm-pages
170 | vm-pages 134217728
171 |
172 | # 设置 VM IO 同时使用的线程数量。
173 | vm-max-threads 4
174 |
175 | ################################################################################
176 | # redis 的累加模式 #
177 | ################################################################################
178 |
179 | # 默认情况下,Redis是异步的把数据导出到磁盘上。这种情况下,当Redis挂掉的时候,最新的数据就丢了。
180 | # 如果不希望丢掉任何一条数据的话就该用纯累加模式:一旦开启这个模式,Redis会把每次写入的数据在接收
181 | # 后都写入 appendonly.aof 文件。
182 | # 每次启动时Redis都会把这个文件的数据读入内存里。
183 | #
184 | # 注意,异步导出的数据库文件和纯累加文件可以并存(你得把上面所有"save"设置都注释掉,关掉导出机制)。
185 | # 如果纯累加模式开启了,那么Redis会在启动时载入日志文件而忽略导出的 dump.rdb 文件。
186 | #
187 | # 重要:查看 BGREWRITEAOF 来了解当累加日志文件太大了之后,怎么在后台重新处理这个日志文件。
188 | appendonly no
189 |
190 | # 纯累加文件名字(默认:"appendonly.aof")
191 | # appendfilename appendonly.aof
192 |
193 | # 纯累加文件的flush频率
194 | # always -> 每次写入都flush,最安全,资源开销最大
195 | # everysec -> 每秒 (推荐)
196 | # no -> 由系统确定
197 |
198 | # appendfsync always
199 | appendfsync everysec
200 | # appendfsync no
201 |
202 | # 当纯累加文件进行rewrite时,是否需要fsync
203 | # 当且仅当appendfsync = always || everysec 时该参数生效
204 | no-appendfsync-on-rewrite no
205 |
206 | # 纯累加文件下次rewrite的比例,与纯累加文件文件的最小size
207 | # 下面的参数意味着纯累加文件会在512mb的时候进行一次rewrite
208 | # 若rewrite后的文件大小为x mb,则下次纯累加文件将会在2x mb时rewrite
209 | auto-aof-rewrite-percentage 100
210 | auto-aof-rewrite-min-size 512mb
211 |
212 | ################################################################################
213 | # redis 的高级配置 #
214 | ################################################################################
215 |
216 | # redis 2.0 中引入了 hash 数据结构。
217 | # 如果hash中的数量超出hash-max-ziplist-entries,或者value的长度超出
218 | # hash-max-ziplist-value,将改成保存dict,否则以ziphash的方式存储以节省空间。以下同理。
219 | # hash 中包含超过指定元素个数并且最大的元素当没有超过临界时,hash 将以zipmap(又称为 small hash大大减少内存使用)来存储,这里可以设置这两个临界值
220 | hash-max-ziplist-entries 64
221 | hash-max-ziplist-value 128
222 |
223 | list-max-ziplist-entries 64
224 | list-max-ziplist-value 128
225 |
226 | set-max-intset-entries 64
227 |
228 | zset-max-ziplist-entries 64
229 | zset-max-ziplist-value 128
230 |
231 | # 是否resize hash? 如果你设置成no需要在源码做一定的修改以防止有人进行hash攻击
232 | # 开启之后,redis 将在每 100 毫秒时使用 1 毫秒的 CPU 时间来对 redis 的 hash 表进行重新 hash,可以降低内存的使用。
233 | # 当你的使用场景中,有非常严格的实时性需要,不能够接受 Redis 时不时的对请求有 2 毫秒的延迟的话,把这项配置为 no。
234 | # 如果没有这么严格的实时性要求,可以设置为 yes,以便能够尽可能快的释放内存
235 | activerehashing yes
236 |
237 | ################################################################################
238 | # redis 的其他配置文件 #
239 | ################################################################################
240 |
241 | # 日志配置
242 | include /etc/redis/log.conf
243 |
244 | # 主从配置
245 | # include /etc/redis/slave.conf
246 |
247 | # 安全配置
248 | # include /etc/redis/security.conf
249 |
250 | # LUA配置
251 | # include /etc/redis/lua.conf
--------------------------------------------------------------------------------
/back-end/Redis/Redis3.0.7.conf:
--------------------------------------------------------------------------------
1 | #redis.conf
2 | # Redis configuration file example.
3 | # ./redis-server /path/to/redis.conf
4 |
5 | ################################## INCLUDES ###################################
6 | #这在你有标准配置模板但是每个redis服务器又需要个性设置的时候很有用。
7 | # include /path/to/local.conf
8 | # include /path/to/other.conf
9 |
10 | ################################ GENERAL #####################################
11 |
12 | # 是否在后台执行,yes:后台运行;no:不是后台运行(老版本默认)
13 | daemonize yes
14 |
15 | # 3.2里的参数,是否开启保护模式,默认开启。要是配置里没有指定bind和密码。
16 | # 开启该参数后,redis只会本地进行访问,拒绝外部访问。
17 | # 要是开启了密码 和bind,可以开启。否 则最好关闭,设置为no。
18 |
19 | protected-mode yes
20 | # redis的进程文件
21 | pidfile /var/run/redis/redis-server.pid
22 |
23 | # redis监听的端口号。
24 | port 6379
25 |
26 | # 此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度,
27 | # 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,
28 | # 而Linux的默认参数值是128。当系统并发量大并且客户端速度缓慢的时候,
29 | # 可以将这二个参数一起参考设定。该内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。
30 | # 一般会将它修改为2048或者更大。在/etc/sysctl.conf中添加:net.core.somaxconn = 2048,然后在终端中执行sysctl -p。
31 | tcp-backlog 511
32 |
33 | #指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求
34 | bind 127.0.0.1
35 |
36 | # 配置unix socket来让redis支持监听本地连接。
37 | # unixsocket /var/run/redis/redis.sock
38 | # 配置unix socket使用文件的权限
39 | # unixsocketperm 700
40 |
41 | # 此参数为设置客户端空闲超过timeout,服务端会断开连接,为0则服务端不会主动断开连接,不能小于0。
42 | timeout 0
43 |
44 | # tcp keepalive参数。如果设置不为0,就使用配置tcp的SO_KEEPALIVE值,
45 | # 使用keepalive有两个好处:检测挂掉的对端。降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。
46 | # 在Linux内核中,设置了keepalive,redis会定时给对端发送ack。检测到对端关闭需要两倍的设置值。
47 | tcp-keepalive 0
48 |
49 | # 指定了服务端日志的级别。级别包括:debug(很多信息,方便开发、测试),
50 | # verbose(许多有用的信息,但是没有debug级别信息多),notice(适当的日志级别,适合生产环境),warn(只有非常重要的信息)
51 | loglevel notice
52 |
53 | #指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null。
54 | logfile /var/log/redis/redis-server.log
55 |
56 | # 是否打开记录syslog功能
57 | # syslog-enabled no
58 |
59 | # syslog的标识符。
60 | # syslog-ident redis
61 |
62 | # 日志的来源、设备
63 | # syslog-facility local0
64 |
65 | # 数据库的数量,默认使用的数据库是DB 0。可以通过”SELECT “命令选择一个db
66 | databases 16
67 |
68 | ################################ SNAPSHOTTING ################################
69 | # 快照配置
70 | # 注释掉“save”这一行配置项就可以让保存数据库功能失效
71 | # 设置sedis进行数据库镜像的频率。
72 | # 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)
73 | # 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化)
74 | # 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)
75 | save 900 1
76 | save 300 10
77 | save 60 10000
78 |
79 | # 当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作,
80 | # 可以通过info中的rdb_last_bgsave_status了解RDB持久化是否有错误
81 | stop-writes-on-bgsave-error yes
82 |
83 | # 使用压缩rdb文件,rdb文件压缩使用LZF压缩算法,yes:压缩,但是需要一些cpu的消耗。no:不压缩,需要更多的磁盘空间
84 | rdbcompression yes
85 |
86 | # 是否校验rdb文件。从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。
87 | # 这跟有利于文件的容错性,但是在保存rdb文件的时候,会有大概10%的性能损耗,所以如果你追求高性能,可以关闭该配置。
88 | rdbchecksum yes
89 |
90 | # rdb文件的名称
91 | dbfilename dump.rdb
92 |
93 | # 数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录
94 | dir /var/lib/redis
95 |
96 | ################################# REPLICATION #################################
97 | # 复制选项,slave复制对应的master。
98 | # slaveof
99 |
100 | #如果master设置了requirepass,那么slave要连上master,需要有master的密码才行。
101 | #masterauth就是用来配置master的密码,这样可以在连上master后进行认证。
102 | # masterauth
103 |
104 | #当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:
105 | #1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续响应客户端的请求。
106 | #2) 如果slave-serve-stale-data设置为no,除去INFO和SLAVOF命令之外的任何请求都会返回一个错误”SYNC with master in progress”。
107 | slave-serve-stale-data yes
108 |
109 | #作为从服务器,默认情况下是只读的(yes),可以修改成NO,用于写(不建议)。
110 | slave-read-only yes
111 |
112 | #是否使用socket方式复制数据。目前redis复制提供两种方式,disk和socket。
113 | #如果新的slave连上来或者重连的slave无法部分同步,就会执行全量同步,master会生成rdb文件。
114 | #有2种方式:disk方式是master创建一个新的进程把rdb文件保存到磁盘,再把磁盘上的rdb文件传递给slave。
115 | #socket是master创建一个新的进程,直接把rdb文件以socket的方式发给slave。
116 | #disk方式的时候,当一个rdb保存的过程中,多个slave都能共享这个rdb文件。
117 | #socket的方式就的一个个slave顺序复制。在磁盘速度缓慢,网速快的情况下推荐用socket方式。
118 | repl-diskless-sync no
119 |
120 | #diskless复制的延迟时间,防止设置为0。一旦复制开始,节点不会再接收新slave的复制请求直到下一个rdb传输。
121 | #所以最好等待一段时间,等更多的slave连上来。
122 | repl-diskless-sync-delay 5
123 |
124 | #slave根据指定的时间间隔向服务器发送ping请求。时间间隔可以通过 repl_ping_slave_period 来设置,默认10秒。
125 | # repl-ping-slave-period 10
126 |
127 | #复制连接超时时间。master和slave都有超时时间的设置。
128 | #master检测到slave上次发送的时间超过repl-timeout,即认为slave离线,清除该slave信息。
129 | #slave检测到上次和master交互的时间超过repl-timeout,则认为master离线。
130 | #需要注意的是repl-timeout需要设置一个比repl-ping-slave-period更大的值,不然会经常检测到超时。
131 | # repl-timeout 60
132 |
133 | #是否禁止复制tcp链接的tcp nodelay参数,可传递yes或者no。默认是no,即使用tcp nodelay。如果master设置了yes来禁止tcp nodelay设置,在把数据复制给slave的时候,会减少包的数量和更小的网络带宽。但是这也可能带来数据的延迟。默认我们推荐更小的延迟,但是在数据量传输很大的场景下,建议选择yes。
134 | repl-disable-tcp-nodelay no
135 |
136 | #复制缓冲区大小,这是一个环形复制缓冲区,用来保存最新复制的命令。
137 | #这样在slave离线的时候,不需要完全复制master的数据,如果可以执行部分同步,只需要把缓冲区的部分数据复制给slave,就能恢复正常复制状态。
138 | #缓冲区的大小越大,slave离线的时间可以更长,复制缓冲区只有在有slave连接的时候才分配内存。没有slave的一段时间,内存会被释放出来,默认1m。
139 | # repl-backlog-size 5mb
140 |
141 | #master没有slave一段时间会释放复制缓冲区的内存,repl-backlog-ttl用来设置该时间长度。单位为秒。
142 | # repl-backlog-ttl 3600
143 |
144 | #当master不可用,Sentinel会根据slave的优先级选举一个master。
145 | #最低的优先级的slave,当选master。而配置成0,永远不会被选举。
146 | slave-priority 100
147 |
148 | #redis提供了可以让master停止写入的方式,如果配置了min-slaves-to-write,健康的slave的个数小于N,mater就禁止写入。
149 | #master最少得有多少个健康的slave存活才能执行写命令。
150 | #这个配置虽然不能保证N个slave都一定能接收到master的写操作,
151 | #但是能避免没有足够健康的slave的时候,master不能写入来避免数据丢失。设置为0是关闭该功能。
152 | # min-slaves-to-write 3
153 |
154 | #延迟小于min-slaves-max-lag秒的slave才认为是健康的slave。
155 | # min-slaves-max-lag 10
156 |
157 | # 设置1或另一个设置为0禁用这个特性。
158 | # Setting one or the other to 0 disables the feature.
159 | # By default min-slaves-to-write is set to 0 (feature disabled) and
160 | # min-slaves-max-lag is set to 10.
161 |
162 | ################################## SECURITY ###################################
163 | #requirepass配置可以让用户使用AUTH命令来认证密码,才能使用其他命令。这让redis可以使用在不受信任的网络中。
164 | #为了保持向后的兼容性,可以注释该命令,因为大部分用户也不需要认证。
165 | #使用requirepass的时候需要注意,因为redis太快了,每秒可以认证15w次密码,简单的密码很容易被攻破,所以最好使用一个更复杂的密码。
166 | # requirepass foobared
167 |
168 | #把危险的命令给修改成其他名称。比如CONFIG命令可以重命名为一个很难被猜到的命令,这样用户不能使用,而内部工具还能接着使用。
169 | # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
170 |
171 | #设置成一个空的值,可以禁止一个命令
172 | # rename-command CONFIG ""
173 | ################################### LIMITS ####################################
174 |
175 | # 设置能连上redis的最大客户端连接数量。默认是10000个客户端连接。
176 | # 由于redis不区分连接是客户端连接还是内部打开文件或者和slave连接等,所以maxclients最小建议设置到32。
177 | # 如果超过了maxclients,redis会给新的连接发送’max number of clients reached’,并关闭连接。
178 | # maxclients 10000
179 |
180 | # redis配置的最大内存容量。当内存满了,需要配合maxmemory-policy策略进行处理。
181 | # 注意slave的输出缓冲区是不计算在maxmemory内的。所以为了防止主机内存使用完,建议设置的maxmemory需要更小一些。
182 | # maxmemory
183 |
184 | # 内存容量超过maxmemory后的处理策略。
185 | # volatile-lru:利用LRU算法移除设置过过期时间的key。
186 | # volatile-random:随机移除设置过过期时间的key。
187 | # volatile-ttl:移除即将过期的key,根据最近过期时间来删除(辅以TTL)
188 | # allkeys-lru:利用LRU算法移除任何key。
189 | # allkeys-random:随机移除任何key。
190 | # noeviction:不移除任何key,只是返回一个写错误。
191 | # 上面的这些驱逐策略,如果redis没有合适的key驱逐,对于写命令,还是会返回错误。
192 | # redis将不再接收写请求,只接收get请求。
193 | # 写命令包括:set setnx setex append incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby getset mset msetnx exec sort。
194 | # maxmemory-policy noeviction
195 |
196 | #lru检测的样本数。使用lru或者ttl淘汰算法,从需要淘汰的列表中随机选择sample个key,选出闲置时间最长的key移除。
197 | # maxmemory-samples 5
198 |
199 | ############################## APPEND ONLY MODE ###############################
200 | #默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。
201 | #但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,
202 | #Append Only File是另一种持久化方式,可以提供更好的持久化特性。
203 | #Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,
204 | #每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。
205 | appendonly no
206 |
207 | #aof文件名
208 | appendfilename "appendonly.aof"
209 |
210 | # aof持久化策略的配置
211 | # no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快。
212 | # always表示每次写入都执行fsync,以保证数据同步到磁盘。
213 | # everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。
214 | appendfsync everysec
215 |
216 | # 在aof重写或者写入rdb文件的时候,会执行大量IO,
217 | # 此时对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间,
218 | # no-appendfsync-on-rewrite字段设置为默认设置为no。
219 | # 如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,
220 | # 这样对持久化特性来说这是更安全的选择。设置为yes表示rewrite期间对新写操作不fsync,
221 | # 暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。Linux的默认fsync策略是30秒。可能丢失30秒数据。
222 | no-appendfsync-on-rewrite no
223 |
224 | # aof自动重写配置。当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,
225 | # 即当aof文件增长到一定大小的时候Redis能够调用bgrewriteaof对日志文件进行重写。
226 | # 当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。
227 | auto-aof-rewrite-percentage 100
228 | #设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写
229 | auto-aof-rewrite-min-size 64mb
230 |
231 | # aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。
232 | # 重启可能发生在redis所在的主机操作系统宕机后,
233 | # 尤其在ext4文件系统没有加上data=ordered选项(redis宕机或者异常终止不会造成尾部不完整现象。)
234 | # 出现这种现象,可以选择让redis退出,或者导入尽可能多的数据。如果选择的是yes,
235 | # 当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。
236 | # 如果是no,用户必须手动redis-check-aof修复AOF文件才可以。
237 | aof-load-truncated yes
238 |
239 | ################################ LUA SCRIPTING ###############################
240 | # 如果达到最大时间限制(毫秒),redis会记个log,然后返回error。
241 | # 当一个脚本超过了最大时限。
242 | # 只有SCRIPT KILL和SHUTDOWN NOSAVE可以用。
243 | # 第一个可以杀没有调write命令的东西。要是已经调用了write,只能用第二个命令杀。
244 | lua-time-limit 5000
245 |
246 | ################################ REDIS CLUSTER ###############################
247 | # 集群开关,默认是不开启集群模式。
248 | # cluster-enabled yes
249 |
250 | # 集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。
251 | # 这个文件并不需要手动配置,这个配置文件有Redis生成并更新,每个Redis集群节点需要一个单独的配置文件,
252 | # 请确保与实例运行的系统中配置文件名称不冲突
253 | # cluster-config-file nodes-6379.conf
254 |
255 | # 节点互连超时的阀值。集群节点超时毫秒数
256 | # cluster-node-timeout 15000
257 |
258 | # 在进行故障转移的时候,全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了,
259 | # 导致数据过于陈旧,这样的slave不应该被提升为master。
260 | # 该参数就是用来判断slave节点与master断线的时间是否过长。判断方法是:
261 | # 比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period
262 | # 如果节点超时时间为三十秒, 并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,
263 | # 即如果超过310秒slave将不会尝试进行故障转移
264 | # cluster-slave-validity-factor 10
265 |
266 | # master的slave数量大于该值,slave才能迁移到其他孤立master上,
267 | # 如这个参数若被设为2,那么只有当一个主节点拥有2 个可工作的从节点时,它的一个从节点会尝试迁移。
268 | # cluster-migration-barrier 1
269 |
270 | # 默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。
271 | # 设置为no,可以在slot没有全部分配的时候提供服务。
272 | # 不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致。
273 | # cluster-require-full-coverage yes
274 |
275 | ################################## SLOW LOG ###################################
276 | ###slog log是用来记录redis运行中执行比较慢的命令耗时。
277 | #当命令的执行超过了指定时间,就记录在slow log中,slog log保存在内存中,所以没有IO操作。
278 | #执行时间比slowlog-log-slower-than大的请求记录到slowlog里面,单位是微秒,所以1000000就是1秒。
279 | #注意,负数时间会禁用慢查询日志,而0则会强制记录所有命令。
280 | slowlog-log-slower-than 10000
281 |
282 | #慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉。
283 | #这个长度没有限制。只要有足够的内存就行。你可以通过 SLOWLOG RESET 来释放内存。
284 | slowlog-max-len 128
285 |
286 | ################################ LATENCY MONITOR ##############################
287 | #延迟监控功能是用来监控redis中执行比较缓慢的一些操作,用LATENCY打印redis实例在跑命令时的耗时图表。
288 | #只记录大于等于下边设置的值的操作。0的话,就是关闭监视。
289 | #默认延迟监控功能是关闭的,如果你需要打开,也可以通过CONFIG SET命令动态设置。
290 | latency-monitor-threshold 0
291 |
292 | ############################# EVENT NOTIFICATION ##############################
293 | #键空间通知使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了 Redis 数据集的事件。
294 | #因为开启键空间通知功能需要消耗一些 CPU ,所以在默认配置下,该功能处于关闭状态。
295 | #notify-keyspace-events 的参数可以是以下字符的任意组合,它指定了服务器该发送哪些类型的通知:
296 | ##K 键空间通知,所有通知以 __keyspace@__ 为前缀
297 | ##E 键事件通知,所有通知以 __keyevent@__ 为前缀
298 | ##g DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知
299 | ##$ 字符串命令的通知
300 | ##l 列表命令的通知
301 | ##s 集合命令的通知
302 | ##h 哈希命令的通知
303 | ##z 有序集合命令的通知
304 | ##x 过期事件:每当有过期键被删除时发送
305 | ##e 驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送
306 | ##A 参数 g$lshzxe 的别名
307 | #输入的参数中至少要有一个 K 或者 E,否则的话,不管其余的参数是什么,都不会有任何 通知被分发。
308 | #详细使用可以参考http://redis.io/topics/notifications
309 |
310 | notify-keyspace-events "KEA"
311 |
312 | ############################### ADVANCED CONFIG ###############################
313 | # 数据量小于等于hash-max-ziplist-entries的用ziplist,大于hash-max-ziplist-entries用hash
314 | hash-max-ziplist-entries 512
315 | # value大小小于等于hash-max-ziplist-value的用ziplist,大于hash-max-ziplist-value用hash。
316 | hash-max-ziplist-value 64
317 |
318 | # 数据量小于等于list-max-ziplist-entries用ziplist,大于list-max-ziplist-entries用list。
319 | list-max-ziplist-entries 512
320 | # value大小小于等于list-max-ziplist-value的用ziplist,大于list-max-ziplist-value用list。
321 | list-max-ziplist-value 64
322 |
323 | # 数据量小于等于set-max-intset-entries用iniset,大于set-max-intset-entries用set。
324 | set-max-intset-entries 512
325 |
326 | # 数据量小于等于zset-max-ziplist-entries用ziplist,大于zset-max-ziplist-entries用zset。
327 | zset-max-ziplist-entries 128
328 | # value大小小于等于zset-max-ziplist-value用ziplist,大于zset-max-ziplist-value用zset。
329 | zset-max-ziplist-value 64
330 |
331 | # value大小小于等于hll-sparse-max-bytes使用稀疏数据结构(sparse),
332 | # 大于hll-sparse-max-bytes使用稠密的数据结构(dense)。
333 | # 一个比16000大的value是几乎没用的,建议的value大概为3000。
334 | # 如果对CPU要求不高,对空间要求较高的,建议设置到10000左右。
335 | hll-sparse-max-bytes 3000
336 |
337 | # Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。
338 | # 当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。
339 | # 如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存。
340 | activerehashing yes
341 |
342 | # 对客户端输出缓冲进行限制可以强迫那些不从服务器读取数据的客户端断开连接,用来强制关闭传输缓慢的客户端。
343 | # 对于normal client,第一个0表示取消hard limit,第二个0和第三个0表示取消soft limit,normal client默认取消限制,因为如果没有寻问,他们是不会接收数据的。
344 | client-output-buffer-limit normal 0 0 0
345 | # 对于slave client和MONITER client,如果client-output-buffer一旦超过256mb,又或者超过64mb持续60秒,那么服务器就会立即断开客户端连接。
346 | client-output-buffer-limit slave 256mb 64mb 60
347 | # 对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,那么服务器就会立即断开客户端连接。
348 | client-output-buffer-limit pubsub 32mb 8mb 60
349 |
350 | # redis执行任务的频率为1s除以hz。
351 | hz 10
352 |
353 | # 在aof重写的时候,如果打开了aof-rewrite-incremental-fsync开关,系统会每32MB执行一次fsync。
354 | # 这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值。
355 | aof-rewrite-incremental-fsync yes
--------------------------------------------------------------------------------
/back-end/centOS/CentOS.md:
--------------------------------------------------------------------------------
1 |
2 | Centos常用命令
3 | ---
4 |
5 | 目录
6 | ====
7 |
8 |
9 |
10 | - [登录](#登录)
11 | - [系统配置情况命令](#系统配置情况命令)
12 | - [系统](#系统)
13 | - [资源](#资源)
14 | - [磁盘和分区](#磁盘和分区)
15 | - [网络](#网络)
16 | - [进程查看](#进程查看)
17 | - [系统时间](#系统时间)
18 | - [用户](#用户)
19 | - [常用命令](#常用命令)
20 | - [系统的关机、重启以及登出](#系统的关机重启以及登出)
21 | - [查看网络配置的命令](#查看网络配置的命令)
22 | - [查看linux进程](#查看linux进程)
23 | - [杀进程](#杀进程)
24 | - [查看用户的命令](#查看用户的命令)
25 | - [log日志查看](#log日志查看)
26 | - [查看系统服务的命令](#查看系统服务的命令)
27 | - [安装程序的命令](#安装程序的命令)
28 | - [获取帮助的命令](#获取帮助的命令)
29 | - [安装软件方法](#安装软件方法)
30 | - [yum错误](#yum错误)
31 | - [安装源](#安装源)
32 | - [下载](#下载)
33 |
34 |
35 |
36 | # 登录
37 |
38 | username:root
39 | password:安装时设置的密码
40 |
41 | 其它终端登录 `$ ssh root@192.168.0.23`
42 |
43 | # 系统配置情况命令
44 |
45 | ## 系统
46 |
47 | ```shell
48 | cat /etc/redhat-release # CentOS 查看系统信息
49 | uname -a # 查看内核/操作系统/CPU信息
50 | head -n 1 /etc/issue # 查看操作系统版本
51 | cat /proc/cpuinfo # 查看CPU信息
52 | hostname # 查看计算机名
53 | lspci -tv # 列出所有PCI设备
54 | lsusb -tv # 列出所有USB设备
55 | lsmod # 列出加载的内核模块
56 | env # 查看环境变量
57 | dmidecode | grep "Product Nmae" #查看服务器型号
58 | ```
59 |
60 | ## 资源
61 |
62 | ```shell
63 | free -m # 查看内存使用量和交换区使用量
64 | df -h # 查看各分区使用情况
65 | du -sh <目录名> # 查看指定目录的大小
66 | grep MemTotal /proc/meminfo # 查看内存总量
67 | grep MemFree /proc/meminfo # 查看空闲内存量
68 | uptime # 查看系统运行时间、用户数、负载
69 | cat /proc/loadavg # 查看系统负载
70 | # 查看内存的插槽数,已经使用多少插槽。每条内存多大,已使用内存多大
71 | dmidecode|grep -P -A5 "Memory\s+Device"|grep Size|grep -v Range
72 | # 查看内存支持的最大内存容量
73 | dmidecode|grep -P 'Maximum\s+Capacity'
74 | # 查看内存的频率
75 | dmidecode|grep -A16 "Memory Device"
76 | dmidecode|grep -A16 "Memory Device"|grep 'Speed'
77 | ```
78 |
79 | ## 磁盘和分区
80 |
81 | ```shell
82 | mount | column -t # 查看挂接的分区状态
83 | fdisk -l # 查看所有分区
84 | swapon -s # 查看所有交换分区
85 | hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
86 | dmesg | grep IDE # 查看启动时IDE设备检测状况
87 | ```
88 |
89 | ## 网络
90 |
91 | ```shell
92 | ifconfig # 查看所有网络接口的属性
93 | iptables -L # 查看防火墙设置
94 | route -n # 查看路由表
95 | netstat -lntp # 查看所有监听端口
96 | netstat -antp # 查看所有已经建立的连接
97 | netstat -s # 查看网络统计信息
98 | ```
99 |
100 | ## 进程查看
101 |
102 | ```shell
103 | ps -ef # 查看所有进程
104 | top # 实时显示进程状态
105 | ```
106 |
107 | ## 系统时间
108 |
109 | **UTC**: 整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。
110 | **GMT**: 格林威治标准时间 (Greenwich Mean Time)指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。(UTC与GMT时间基本相同)
111 | **CST**: 中国标准时间 (China Standard Time)。`GMT + 8 = UTC + 8 = CST`
112 | **DST**: 夏令时(Daylight Saving Time) 指在夏天太阳升起的比较早时,将时钟拨快一小时,以提早日光的使用。(中国不使用)
113 | **硬件时钟**: RTC(Real-Time Clock)或CMOS时钟,一般在主板上靠电池供电,服务器断电后也会继续运行。仅保存日期时间数值,无法保存时区和夏令时设置。
114 | **系统时钟**: 一般在服务器启动时复制RTC时间,之后独立运行,保存了时间、时区和夏令时设置。
115 |
116 | ```bash
117 | timedatectl # 等同于 timedatectl status
118 | timedatectl set-time "YYYY-MM-DD HH:MM:SS" # 设置时间
119 | timedatectl list-timezones # 列出所有时区
120 | timedatectl set-timezone Asia/Shanghai # 设置时区
121 | timedatectl set-ntp yes # 是否NTP服务器同步, yes或者no
122 |
123 | # 将硬件时钟调整为与本地时钟一致
124 | timedatectl set-local-rtc 1
125 | hwclock --systohc --localtime # 与上面命令效果一致
126 |
127 | # 硬件时间设置成 UTC
128 | timedatectl set-local-rtc 1
129 | hwclock --systohc --utc //与上面命令效果一致
130 | ```
131 |
132 | ## 用户
133 |
134 | ```shell
135 | w # 查看活动用户
136 | id <用户名> # 查看指定用户信息
137 | last # 查看用户登录日志
138 | cut -d: -f1 /etc/passwd # 查看系统所有用户
139 | cut -d: -f1 /etc/group # 查看系统所有组
140 | crontab -l # 查看当前用户的计划任务
141 | ```
142 |
143 | # 常用命令
144 |
145 | ```shell
146 |
147 | # 查看网络接口统计数据的,两种发放
148 | ip link # 或者下面方法
149 | ip -s link
150 |
151 | yum install net-tools # net-tools包提供了ifconfig命令
152 | ifconfig -a # 查看IP地址
153 | ip addr # 查看IP地址
154 | route -n # 使用最快的速度查找主机的路由
155 |
156 | cat /proc/version # 查看系统信息
157 | uname -a # 方法二
158 | uname -r #方法三
159 | getconf LONG_BIT # 查看系统是64位还是32位
160 |
161 |
162 | uname -a # 查看内核/操作系统/CPU信息
163 | head -n 1 /etc/issue #查看操作系统版本
164 | cat /proc/cpuinfo #查看CPU信息
165 | hostname #查看计算机名
166 | lspci -tv #列出所有PCI设备
167 | lsusb -tv #列出所有USB设备
168 | lsmod #列出加载的内核模块
169 | env #查看环境变量
170 | arch # 显示机器的处理器架构(1)
171 | uname -m # 显示机器的处理器架构(2)
172 | uname -r # 显示正在使用的内核版本
173 | dmidecode -q # 显示硬件系统部件
174 | hdparm -i /dev/hda # 罗列一个磁盘的架构特性
175 | hdparm -tT /dev/sda # 在磁盘上执行测试性读取操作
176 | cat /proc/interrupts # 显示中断
177 | cat /proc/meminfo # 校验内存使用
178 | cat /proc/swaps # 显示哪些swap被使用
179 | cat /proc/version # 显示内核的版本
180 | cat /proc/net/dev # 显示网络适配器及统计
181 | cat /proc/mounts # 显示已加载的文件系统
182 | lspci -tv # 罗列 PCI 设备
183 | lsusb -tv # 显示 USB 设备
184 | date # 显示系统日期
185 | date 041217002007.00 # 设置日期和时间 – 月日时分年.秒
186 | cal 2007 # 显示2007年的日历表
187 | clock -w # 将时间修改保存到 BIOS
188 | ```
189 |
190 | ## 系统的关机、重启以及登出
191 |
192 | ```bash
193 | shutdown -h now # 关闭系统(1)
194 | init 0 # 关闭系统(2)
195 | telinit 0 # 关闭系统(3)
196 | shutdown -h hours:minutes & #按预定时间关闭系统
197 | shutdown -c #取消按预定时间关闭系统
198 | shutdown -r now # 重启 (1)
199 | reboot #重启 (2)
200 | logout # 注销
201 | ```
202 |
203 | ## 查看网络配置的命令
204 |
205 | ```bash
206 | ifconfig # 查看所有网络接口的属性
207 | iptables -L # 查看防火墙设置
208 | route -n # 查看路由表
209 | netstat -lntp # 查看所有监听端口
210 | netstat -antp # 查看所有已经建立的连接
211 | netstat -s # 查看网络统计信息
212 | ```
213 |
214 | ## 查看linux进程
215 |
216 | ```bash
217 | ps -aux | grep node # 查看`node`进程
218 | ps -ef # 查看所有进程
219 | top # 实时显示进程状态
220 | ```
221 |
222 | ## 杀进程
223 |
224 | ```bash
225 | killall -9 websocket # 干掉`websocket`服务进程
226 | ps aux | grep mysql # 查看mysql进程
227 | kill -9 35562 # 根据进程号杀
228 | ```
229 |
230 | ## 查看用户的命令
231 |
232 | ```bash
233 | w # 查看活动用户
234 | id <用户名> # 查看指定用户信息
235 | last # 查看用户登录日志
236 | cut -d: -f1 /etc/passwd # 查看系统所有用户
237 | cut -d: -f1 /etc/group # 查看系统所有组
238 | crontab -l # 查看当前用户的计划任务
239 | ```
240 |
241 | ## log日志查看
242 |
243 | ```bash
244 | cat /var/log/messages # 查询日志的全部内容
245 | head -5 /var/log/messages # 查询日志的前5行
246 | tail -5 /var/log/messages # 查询日志的最新5行
247 | sed -n '5,10p' /var/log/messages # 查询日志的5到10行
248 | ```
249 |
250 | ## 查看系统服务的命令
251 |
252 | ```bash
253 | chkconfig –list # 列出所有系统服务
254 | chkconfig –list | grep on # 列出所有启动的系统服务
255 | ```
256 |
257 | ## 安装程序的命令
258 |
259 | `rpm -qa` 查看所有安装的软件包
260 |
261 | ## 获取帮助的命令
262 |
263 | `man <命令>` 获得命令帮助
264 |
265 |
266 | # 安装软件方法
267 |
268 | ```bash
269 | # 安装下载工具wget
270 | $ yum install wget
271 |
272 | # 解压
273 | $ wget https://nodejs.org/dist/v4.4.4/node-v4.4.4-linux-x64.tar.xz
274 | https://nodejs.org/dist/v4.4.5/node-v4.4.5-linux-x64.tar.xz
275 |
276 | # 测试安装
277 | # 没有用到`gzip`压缩去掉`z`参数
278 | $ sudo tar --strip-components 1 -xzvf node-v* -C /usr/local
279 | ```
280 |
281 | # yum错误
282 |
283 | yum错误:Cannot retrieve repository metadata (repomd.xml) for repository解决方法
284 |
285 | ```bash
286 | cd /etc/yum.repos.d/
287 | ls
288 | ```
289 |
290 | 找到`yum.repos.d`这个目录,里面有个文件,以`.repo` 结尾的,例如`zl.repo`删除
291 | 然后`#yum clean all`
292 |
293 | # 安装源
294 |
295 | http://dl.fedoraproject.org/pub/
296 | http://rpms.remirepo.net/enterprise/
297 |
298 | # 下载
299 |
300 | [www.centos.org](https://www.centos.org/)
301 |
302 |
303 | http://mirror.neu.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
304 | http://centos.ustc.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
305 | http://mirrors.163.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
306 | http://mirrors.hust.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
307 | http://mirrors.zju.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
308 | http://mirrors.cqu.edu.cn/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
309 | http://mirrors.cug.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
310 | http://mirrors.neusoft.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
311 | http://mirrors.skyshe.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
312 | http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
313 | http://mirrors.nwsuaf.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
314 | http://mirror.bit.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
315 | http://mirror.lzu.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
316 | http://ftp.sjtu.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
317 | http://mirrors.yun-idc.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
318 | http://mirrors.pubyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
319 |
--------------------------------------------------------------------------------
/back-end/centOS/CentOS7安装维护Gitlab.md:
--------------------------------------------------------------------------------
1 | CentOS7安装维护Gitlab
2 | ---
3 |
4 | 目录
5 | ===
6 |
7 |
8 |
9 | - [官方安装](#官方安装)
10 | - [第三方镜像安装](#第三方镜像安装)
11 | - [编辑源](#编辑源)
12 | - [更新本地YUM缓存](#更新本地yum缓存)
13 | - [安装社区版](#安装社区版)
14 | - [更改配置](#更改配置)
15 | - [配置并启动GitLab](#配置并启动gitlab)
16 | - [登录GitLab](#登录gitlab)
17 | - [卸载](#卸载)
18 | - [运维](#运维)
19 | - [服务管理](#服务管理)
20 | - [日志查看](#日志查看)
21 | - [重置管理员密码](#重置管理员密码)
22 | - [备份恢复](#备份恢复)
23 | - [修改备份文件默认目录](#修改备份文件默认目录)
24 | - [创建备份](#创建备份)
25 | - [开始备份](#开始备份)
26 | - [自动备份](#自动备份)
27 | - [备份保留七天](#备份保留七天)
28 | - [开始恢复](#开始恢复)
29 | - [一些常规目录](#一些常规目录)
30 | - [使用HTTPS](#使用https)
31 | - [暴力升级](#暴力升级)
32 | - [错误处理](#错误处理)
33 | - [解决80端口被占用](#解决80端口被占用)
34 | - [头像无法正常显示](#头像无法正常显示)
35 | - [internal API unreachable](#internal-api-unreachable)
36 | - [proxy_temp 目录没有权限](#proxy_temp-目录没有权限)
37 | - [其它错误](#其它错误)
38 | - [参考资料](#参考资料)
39 |
40 |
41 |
42 | ## 官方安装
43 |
44 | 下面是官网复制过来的官方安装方法,最简单的安装,在我大天朝,只能望天兴叹,你可翻墙安装或者略过这里,看下面的。
45 |
46 | 1. 安装并配置必要的依赖项
47 |
48 | If you install Postfix to send email please select 'Internet Site' during setup. Instead of using Postfix you can also use Sendmail or configure a custom SMTP server and configure it as an SMTP server.
49 |
50 | On Centos 6 and 7, the commands below will also open HTTP and SSH access in the system firewall.
51 |
52 | ```
53 | sudo yum install curl openssh-server openssh-clients postfix cronie
54 | sudo service postfix start
55 | sudo chkconfig postfix on
56 | sudo lokkit -s http -s ssh
57 | ```
58 |
59 | 2. 添加gitlab服务器包和安装包
60 |
61 | ```
62 | curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
63 | sudo yum install gitlab-ce
64 | ```
65 |
66 | If you are not comfortable installing the repository through a piped script, you can find the entire script here and select and download the package manually and install using
67 | [gitlab/gitlab-ce](https://packages.gitlab.com/gitlab/gitlab-ce)
68 |
69 | ```bash
70 | curl -LJO https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/6/gitlab-ce-XXX.rpm/download
71 | curl -LJO https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-10.2.2-ce.0.el7.x86_64.rpm/download
72 | rpm -i gitlab-ce-XXX.rpm
73 | ```
74 |
75 | 3. 配置并启动GitLab
76 |
77 | ```
78 | sudo gitlab-ctl reconfigure
79 | ```
80 |
81 | 4. 浏览器打开并登录
82 |
83 | On your first visit, you'll be redirected to a password reset screen to provide the password for the initial administrator account. Enter your desired password and you'll be redirected back to the login screen.
84 |
85 | The default account's username is root. Provide the password you created earlier and login. After login you can change the username if you wish.
86 |
87 |
88 |
89 | ## 第三方镜像安装
90 |
91 | - [Gitlab Community Edition 镜像使用帮助](https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/)
92 | - [在阿里云上通过Omnibus一键安装包安装Gitlab](https://github.com/hehongwei44/my-blog/issues/19)
93 |
94 | ### 编辑源
95 |
96 | 新建 /etc/yum.repos.d/gitlab-ce.repo,内容为
97 |
98 | [使用清华大学 TUNA 镜像源](https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/) 打开网址将内容复制到`gitlab-ce.repo`文件中,编辑路径`vim /etc/yum.repos.d/gitlab-ce.repo`
99 |
100 | ```bash
101 | [gitlab-ce]
102 | name=gitlab-ce
103 | baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6
104 | repo_gpgcheck=0
105 | gpgcheck=0
106 | enabled=1
107 | gpgkey=https://packages.gitlab.com/gpg.key
108 | ```
109 |
110 | ### 更新本地YUM缓存
111 |
112 | ```bash
113 | sudo yum makecache
114 | ```
115 |
116 | ### 安装社区版
117 |
118 | ```bash
119 | sudo yum install gitlab-ce #(自动安装最新版)
120 | sudo yum install gitlab-ce-8.15.2-ce.0.el6 #(安装指定版本)
121 | ```
122 |
123 | ### 更改配置
124 |
125 | ```bash
126 | vim /etc/gitlab/gitlab.rb
127 | # 找到 external_url 'http://000.00.00.00:8081'
128 | # 修改成你的地址
129 | ```
130 |
131 | ### 配置并启动GitLab
132 |
133 | ```bash
134 | # 打开`/etc/gitlab/gitlab.rb`,
135 | # 将`external_url = 'http://git.example.com'`修改为自己的IP地址:`http://xxx.xx.xxx.xx`,
136 | # 然后执行下面的命令,对GitLab进行编译。
137 | sudo gitlab-ctl reconfigure
138 | # 清除缓存
139 | sudo gitlab-rake cache:clear RAILS_ENV=production
140 | ```
141 |
142 | ### 登录GitLab
143 |
144 | ```
145 | Username: root
146 | Password: 5iveL!fe
147 | ```
148 |
149 | ## 卸载
150 |
151 | ```bash
152 | sudo gitlab-ctl uninstall
153 | ```
154 |
155 | ## 运维
156 |
157 | ```bash
158 | # 修改默认的配置文件
159 | sudo vim /etc/gitlab/gitlab.rb
160 |
161 | # 查看版本
162 | sudo cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
163 | # echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
164 | # sysctl -p
165 | # echo never > /sys/kernel/mm/transparent_hugepage/enabled
166 |
167 | # 检查gitlab
168 | gitlab-rake gitlab:check SANITIZE=true --trace
169 | gitlab-rake gitlab:check
170 | gitlab-rake gitlab:check SANITIZE=true
171 | # 查看日志
172 | gitlab-ctl tail
173 | # 数据库关系升级
174 | gitlab-rake db:migrate
175 | # 清理缓存
176 | gitlab-rake cache:clear
177 |
178 | # 更新gitlab包
179 | yum update gitlab-ce
180 |
181 | # 升级gitlab
182 | yum install gitlab-ce
183 |
184 | # 升级数据命令
185 | gitlab-ctl pg-upgrade
186 | ```
187 |
188 | ### 服务管理
189 |
190 | ```bash
191 | gitlab-ctl start # 启动所有 gitlab 组件:
192 | gitlab-ctl stop # 停止所有 gitlab 组件:
193 | gitlab-ctl stop postgresql # 停止所有 gitlab postgresql 组件:
194 | # 停止相关数据连接服务
195 | gitlab-ctl stop unicorn
196 | gitlab-ctl stop sidekiq
197 | gitlab-ctl restart # 重启所有 gitlab 组件:
198 | gitlab-ctl restart gitlab-workhorse # 重启所有 gitlab gitlab-workhorse 组件:
199 | gitlab-ctl status # 查看服务状态
200 | gitlab-ctl reconfigure # 生成配置启动服务
201 | ```
202 |
203 | ### 日志查看
204 |
205 | ```bash
206 | sudo gitlab-ctl tail # 查看日志
207 | sudo gitlab-ctl tail redis # 检查redis的日志
208 | sudo gitlab-ctl tail postgresql # 检查postgresql的日志
209 | sudo gitlab-ctl tail gitlab-workhorse # 检查gitlab-workhorse的日志
210 | sudo gitlab-ctl tail logrotate # 检查logrotate的日志
211 | sudo gitlab-ctl tail nginx # 检查nginx的日志
212 | sudo gitlab-ctl tail sidekiq # 检查sidekiq的日志
213 | sudo gitlab-ctl tail unicorn # 检查unicorn的日志
214 | ```
215 |
216 | ### 重置管理员密码
217 |
218 | Gitlab管理员密码忘记,怎么重置密码,Gitlab 修改root用户密码,[How to reset your root password](http://docs.gitlab.com/ce/security/reset_root_password.html)。
219 |
220 | 使用rails工具打开终端
221 |
222 | ```bash
223 | sudo gitlab-rails console production
224 | ```
225 |
226 | 查询用户的email,用户名,密码等信息,id:1 表示root账号
227 |
228 | ```bash
229 | user = User.where(id: 1).first
230 | ```
231 |
232 | 重新设置密码
233 |
234 | ```bash
235 | user.password = '新密码'
236 | user.password_confirmation = '新密码'
237 | ```
238 |
239 | 保存密码
240 |
241 | ```bash
242 | user.save!
243 | ```
244 |
245 | 完整的操作ruby脚本
246 |
247 | ```bash
248 | user = User.where(id: 1).first
249 | user.password = '新密码'
250 | user.password_confirmation = '新密码'
251 | user.save!
252 | ```
253 |
254 | ## 备份恢复
255 |
256 | 使用Gitlab一键安装包安装Gitlab非常简单, 同样的备份恢复与迁移也非常简单,用一条命令即可创建完整的Gitlab备份:
257 |
258 | ### 修改备份文件默认目录
259 |
260 | 修改`/etc/gitlab/gitlab.rb`来修改默认存放备份文件的目录:
261 |
262 | ```bash
263 | gitlab_rails['backup_path'] = '/mnt/backups'
264 | ```
265 |
266 | ### 创建备份
267 |
268 | ```bash
269 | gitlab-rake gitlab:backup:create
270 | ```
271 |
272 | 以上命令将在/var/opt/gitlab/backups目录下创建一个名称类似为xxxxxxxx_gitlab_backup.tar的压缩包, 这个压缩包就是Gitlab整个的完整部分, 其中开头的xxxxxx是备份创建的时间戳。
273 |
274 | 修改后使用gitlab-ctl reconfigure命令重载配置文件。
275 |
276 | ### 开始备份
277 |
278 | 这里放你的备份文件文件夹,和仓库源文件。
279 |
280 | ```bash
281 | /var/opt/gitlab/backups # 备份文件文件夹
282 | /var/opt/gitlab/git-data/repositories # git仓库源文件
283 | ```
284 |
285 | ### 自动备份
286 |
287 | 通过crontab使用备份命令实现自动备份
288 |
289 | ```bash
290 | crontab -e
291 | # 每天2点备份gitlab数据
292 | 0 2 * * * /usr/bin/gitlab-rake gitlab:backup:create
293 | 0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create
294 | ```
295 |
296 | 上面两行保存之后,重新载入配置
297 |
298 | ```bash
299 | service crond reload
300 | # or
301 | systemctl reload crond.service
302 | ```
303 |
304 | ### 备份保留七天
305 |
306 | 设置只保存最近7天的备份,编辑 /etc/gitlab/gitlab.rb 配置文件,找到如下代码,删除注释 `#` 保存
307 |
308 | ```bash
309 | # /etc/gitlab/gitlab.rb 配置文件 修改下面这一行
310 | gitlab_rails['backup_keep_time'] = 604800
311 | ```
312 |
313 | 重新加载gitlab配置文件
314 |
315 | ```bash
316 | sudo gitlab-ctl reconfigure
317 | ```
318 |
319 |
320 | ### 开始恢复
321 |
322 | 迁移如同备份与恢复的步骤一样, 只需要将老服务器/var/opt/gitlab/backups目录下的备份文件拷贝到新服务器上的/var/opt/gitlab/backups即可(如果你没修改过默认备份目录的话)。 然后执行恢复命令。
323 | 如果修改了,首先进入备份 gitlab 的目录,这个目录是配置文件中的 `gitlab_rails['backup_path']` ,默认为 `/var/opt/gitlab/backups` 。
324 |
325 | 然后停止 unicorn 和 sidekiq ,保证数据库没有新的连接,不会有写数据情况。
326 |
327 | ```bash
328 | # 停止相关数据连接服务
329 | gitlab-ctl stop unicorn
330 | # ok: down: unicorn: 0s, normally up
331 | gitlab-ctl stop sidekiq
332 | # ok: down: sidekiq: 0s, normally up
333 |
334 | # 从xxxxx编号备份中恢复
335 | # 然后恢复数据,1406691018为备份文件的时间戳
336 | gitlab-rake gitlab:backup:restore BACKUP=1406691018
337 |
338 | # 新版本 1483533591_2017_01_04_gitlab_backup.tar
339 | gitlab-rake gitlab:backup:restore BACKUP=1483533591_2017_01_04_gitlab_backup.tar
340 |
341 | # 启动Gitlab
342 | sudo gitlab-ctl start
343 | ```
344 |
345 | 判断是执行实际操作的gitlab相关用户:git,没有得到足够的权限。依次执行命令:
346 |
347 | ```bash
348 | # 恢复过程中没有权限
349 | mkdir /var/opt/gitlab/backups
350 | chown git /var/opt/gitlab/backups
351 | chmod 700 /var/opt/gitlab/backups
352 |
353 | # 恢复成功页面报没有权限的错误
354 | sudo chown -R git:git /var/opt/gitlab/git-data/repositories
355 | sudo chmod -R ug+rwX,o-rwx /var/opt/gitlab/git-data/repositories
356 | sudo chmod -R ug-s /var/opt/gitlab/git-data/repositories
357 | sudo find /var/opt/gitlab/git-data/repositories -type d -print0 | sudo xargs -0 chmod g+s
358 | ```
359 |
360 | 如果备份文件报没有权限,通过`ls -al`查看权限是不是`git`,而不是`root`,通过下面方式给`git`用户权限
361 |
362 | ```bash
363 | sudo chown -R git:git 1483533591_2017_01_04_gitlab_backup.tar
364 | ```
365 |
366 | ## 一些常规目录
367 |
368 | ```bash
369 | # 配置目录
370 | /etc/gitlab/gitlab.rb
371 | # 生成好的nginx配置
372 | /var/opt/gitlab/nginx/conf/gitlab-http.conf
373 | # 备份目录
374 | /var/opt/gitlab/backups
375 | ```
376 |
377 | ## 使用HTTPS
378 |
379 | 直接将nginx配置复制到你自己的nginx配置中,停掉gitlab的nginx
380 |
381 | ```bash
382 | cp /var/opt/gitlab/nginx/conf/gitlab-http.conf /usr/local/nginx/conf/vhost/
383 | ```
384 |
385 | 将你的SSL证书配置复制进去
386 |
387 | ```nginx
388 | server {
389 | listen 443 ssl;
390 | server_name g.doman.cn;
391 | ssl_certificate /etc/letsencrypt/live/*****/certificate.crt;
392 | ssl_certificate_key /etc/letsencrypt/live/*****/private.key;
393 | # .....
394 | }
395 | ```
396 |
397 | 编辑`vi /usr/local/nginx/conf/nginx.conf`你的nginx配置,引用你复制过来的配置。
398 |
399 | ```nginx
400 | http {
401 | # .....
402 | include vhost/gitlab-http.conf;
403 | }
404 | ```
405 |
406 | 同时要把`/var/opt/gitlab/nginx/conf/nginx.conf`中的一些变量复制到自己的nginx配置中`nginx.conf`
407 |
408 | ```nginx
409 | http {
410 | # .....
411 | log_format gitlab_access '$remote_addr - $remote_user [$time_local] "$request_method $filtered_request_uri $server_protocol" $status $body_bytes_sent "$filtered_http_referer" "$http_user_agent"';
412 | log_format gitlab_mattermost_access '$remote_addr - $remote_user [$time_local] "$request_method $filtered_request_uri $server_protocol" $status $body_bytes_sent "$filtered_http_referer" "$http_user_agent"';
413 |
414 | proxy_cache_path proxy_cache keys_zone=gitlab:10m max_size=1g levels=1:2;
415 | proxy_cache gitlab;
416 | map $http_upgrade $connection_upgrade {
417 | default upgrade;
418 | '' close;
419 | }
420 |
421 | # Remove private_token from the request URI
422 | # In: /foo?private_token=unfiltered&authenticity_token=unfiltered&rss_token=unfiltered&...
423 | # Out: /foo?private_token=[FILTERED]&authenticity_token=unfiltered&rss_token=unfiltered&...
424 | map $request_uri $temp_request_uri_1 {
425 | default $request_uri;
426 | ~(?i)^(?.*)(?[\?&]private[\-_]token)=[^&]*(?.*)$ "$start$temp=[FILTERED]$rest";
427 | }
428 | # Remove authenticity_token from the request URI
429 | # In: /foo?private_token=[FILTERED]&authenticity_token=unfiltered&rss_token=unfiltered&...
430 | # Out: /foo?private_token=[FILTERED]&authenticity_token=[FILTERED]&rss_token=unfiltered&...
431 | map $temp_request_uri_1 $temp_request_uri_2 {
432 | default $temp_request_uri_1;
433 | ~(?i)^(?.*)(?[\?&]authenticity[\-_]token)=[^&]*(?.*)$ "$start$temp=[FILTERED]$rest";
434 | }
435 | # Remove rss_token from the request URI
436 | # In: /foo?private_token=[FILTERED]&authenticity_token=[FILTERED]&rss_token=unfiltered&...
437 | # Out: /foo?private_token=[FILTERED]&authenticity_token=[FILTERED]&rss_token=[FILTERED]&...
438 | map $temp_request_uri_2 $filtered_request_uri {
439 | default $temp_request_uri_2;
440 | ~(?i)^(?.*)(?[\?&]rss[\-_]token)=[^&]*(?.*)$ "$start$temp=[FILTERED]$rest";
441 | }
442 | # A version of the referer without the query string
443 | map $http_referer $filtered_http_referer {
444 | default $http_referer;
445 | ~^(?.*)\? $temp;
446 | }
447 | }
448 | ```
449 |
450 |
451 | ## 暴力升级
452 |
453 | 直接编辑源 /etc/yum.repos.d/gitlab-ce.repo,安装 GitLab 社区版
454 |
455 | ```bash
456 | sudo yum install gitlab-ce #(自动安装最新版)
457 | sudo yum install gitlab-ce-8.15.2-ce.0.el6 #(安装指定版本)
458 | ```
459 |
460 | 安装过程会报错
461 |
462 | ```
463 | gitlab preinstall: Automatically backing up only the GitLab SQL database (excluding everything else!)
464 | Dumping database ...
465 | Dumping PostgreSQL database gitlabhq_production ... pg_dump: [archiver (db)] connection to database "gitlabhq_production" failed: could not connect to server: 没有那个文件或目录
466 | Is the server running locally and accepting
467 | connections on Unix domain socket "/var/opt/gitlab/postgresql/.s.PGSQL.5432"?
468 | Backup failed
469 | [FAILED]
470 | gitlab preinstall:
471 | gitlab preinstall: Backup failed! If you want to skip this backup, run the following command and
472 | gitlab preinstall: try again:
473 | gitlab preinstall:
474 | gitlab preinstall: sudo touch /etc/gitlab/skip-auto-migrations
475 | gitlab preinstall:
476 | error: %pre(gitlab-ce-8.15.2-ce.0.el6.x86_64) scriptlet failed, exit status 1
477 | Error in PREIN scriptlet in rpm package gitlab-ce-8.15.2-ce.0.el6.x86_64
478 | error: install: %pre scriptlet failed (2), skipping gitlab-ce-8.15.2-ce.0.el6
479 | gitlab-ce-8.11.5-ce.0.el6.x86_64 was supposed to be removed but is not!
480 | Verifying : gitlab-ce-8.11.5-ce.0.el6.x86_64 1/2
481 | Verifying : gitlab-ce-8.15.2-ce.0.el6.x86_64 2/2
482 |
483 | Failed:
484 | gitlab-ce.x86_64 0:8.11.5-ce.0.el6
485 | ```
486 |
487 | 看上面一堆错误,瞬间就懵逼了,看到一条救星命令让我尝试运行 `sudo touch /etc/gitlab/skip-auto-migrations` 于是我二逼的重新`yum install gitlab-ce`运行了,结果真的安装成功了,😄。
488 |
489 | ```
490 | ...
491 | gitlab: Thank you for installing GitLab!
492 | gitlab: To configure and start GitLab, RUN THE FOLLOWING COMMAND:
493 |
494 | sudo gitlab-ctl reconfigure
495 |
496 | gitlab: GitLab should be reachable at http://114.55.148.71:8081
497 | gitlab: Otherwise configure GitLab for your system by editing /etc/gitlab/gitlab.rb file
498 | gitlab: And running reconfigure again.
499 | gitlab:
500 | gitlab: For a comprehensive list of configuration options please see the Omnibus GitLab readme
501 | gitlab: https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md
502 | gitlab:
503 |
504 | gitlab: GitLab now ships with a newer version of PostgreSQL (9.6.1), and will be used
505 | gitlab: as the default in the next major relase. To upgrade, RUN THE FOLLOWING COMMANDS:
506 |
507 | sudo gitlab-ctl pg-upgrade
508 |
509 | gitlab: For more details, please see:
510 | gitlab: https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server
511 | gitlab:
512 | 清理 : gitlab-ce-8.11.5-ce.0.el6.x86_64 2/2
513 | Found /etc/gitlab/skip-auto-migrations, exiting...
514 | Verifying : gitlab-ce-8.15.2-ce.0.el6.x86_64 1/2
515 | Verifying : gitlab-ce-8.11.5-ce.0.el6.x86_64 2/2
516 |
517 | 更新完毕:
518 | gitlab-ce.x86_64 0:8.15.2-ce.0.el6
519 |
520 | 完毕!
521 | ```
522 |
523 | 重启配置,可以解决大部分`502`错误。
524 |
525 | ```bash
526 | gitlab-ctl reconfigure
527 | ```
528 |
529 | ## 错误处理
530 |
531 | ### 解决80端口被占用
532 |
533 | nginx配置解决 `80` 端口被占用
534 |
535 | ```nginx
536 | upstream gitlab {
537 | server 114.55.111.111:8081 ;
538 | }
539 | server {
540 | # 侦听的80端口
541 | listen 80;
542 | server_name git.diggg.cn;
543 | location / {
544 | proxy_pass http://gitlab; #在这里设置一个代理,和upstream的名字一样
545 | #以下是一些反向代理的配置可删除
546 | proxy_redirect off;
547 | #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
548 | proxy_set_header Host $host;
549 | proxy_set_header X-Real-IP $remote_addr;
550 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
551 | client_max_body_size 10m; #允许客户端请求的最大单文件字节数
552 | client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
553 | proxy_connect_timeout 300; #nginx跟后端服务器连接超时时间(代理连接超时)
554 | proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时)
555 | proxy_read_timeout 300; #连接成功后,后端服务器响应时间(代理接收超时)
556 | proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
557 | proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
558 | proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
559 | proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
560 | }
561 | }
562 | ```
563 |
564 | nginx配置检查和立即生效
565 |
566 | ```bash
567 | # 检查配置
568 | /usr/local/nginx/sbin/nginx -tc conf/nginx.conf
569 | # nginx 重新加载配置
570 | /usr/local/nginx/sbin/nginx -s reload
571 | ```
572 | ### 头像无法正常显示
573 |
574 | 原因:gravatar被墙
575 | 解决办法:
576 | 编辑 /etc/gitlab/gitlab.rb,将
577 |
578 | ```bash
579 | # gitlab_rails['gravatar_plain_url'] = 'http://gravatar.duoshuo.com/avatar/%{hash}?s=%{size}&d=identicon'
580 | ```
581 |
582 | 修改为:
583 |
584 | ```
585 | gitlab_rails['gravatar_plain_url'] = 'http://gravatar.duoshuo.com/avatar/%{hash}?s=%{size}&d=identicon'
586 | ```
587 |
588 | 然后在命令行执行:
589 |
590 | ```bash
591 | sudo gitlab-ctl reconfigure
592 | sudo gitlab-rake cache:clear RAILS_ENV=production
593 | ```
594 |
595 | ### internal API unreachable
596 |
597 | 这个错误是一个自己制造的坑,我克隆和提交都没有办法搞,但是网站能正常运行,尝试了非常多的方法,最终我的问题是`22`端口没有隐射出去,好尴尬。
598 |
599 | ```bash
600 | GitLab: Failed to authorize your Git request: internal API unreachable
601 | ```
602 |
603 | 解决办法:https://gitlab.com/gitlab-org/gitlab-ce/issues/33702
604 | 通过防火墙规则 127.0.0.1
605 |
606 | ### proxy_temp 目录没有权限
607 |
608 | ```bash
609 | [crit] 14788#0: *215 open() "/usr/local/nginx/proxy_temp/5/01/0000000015" failed (13: Permission denied) while reading upstream
610 | ```
611 |
612 | 以下方式解决
613 |
614 | ```bash
615 | chown -R root:root /usr/local/nginx/proxy_temp
616 | # 编辑 nginx.conf
617 | sudo vi /usr/local/nginx/conf/nginx.conf
618 | # 在第一行添加
619 | user root;
620 | ```
621 |
622 | ### 其它错误
623 |
624 | ```bash
625 | Error executing action `run` on resource 'bash[migrate gitlab-rails database]'
626 | ```
627 |
628 | 上面错误是数据库没有启动,我不知道如何启动,我重启了服务器,然后好球了。😆
629 | https://gitlab.com/gitlab-org/gitlab-ce/issues/2052#note_1667899
630 |
631 | ```bash
632 | NameError: uninitialized constant Devise::Async
633 | ```
634 |
635 |
636 | ```
637 | Processing by RootController#index as HTML
638 | Completed 401 Unauthorized in 17ms (ActiveRecord: 2.7ms)
639 | ```
640 |
641 |
642 | ```
643 | /var/log/gitlab/nginx/gitlab_access.log <==
644 | 114.55.148.71 - - [04/Jan/2017:17:20:24 +0800] "GET /favicon.ico HTTP/1.0" 502 2662 "http://git.xxxxx.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
645 | ```
646 |
647 | ## 参考资料
648 |
649 | - [gitlab/gitlab-ce](https://packages.gitlab.com/gitlab/gitlab-ce)
650 | - [官网下载](https://www.gitlab.cc/downloads)
651 | - [官网安装说明](https://doc.gitlab.cc/ce/install/requirements.html)
652 | - [开源版本和企业版本对比](https://www.gitlab.cc/features/#enterprise)
653 | - [官方升级Gitlab教程](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/8.14-to-8.15.md)
654 | - [官方Centos安装Gitlab教程](https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/install/centos)
655 | - [Gitlab升级记录](http://opjasee.com/2016/01/28/gitlab-upgrade.html)
656 | - [修改gitlab使用现有nginx服务及502问题解决](http://www.yuzhewo.com/2015/11/03/%E4%BF%AE%E6%94%B9gitlab%E4%BD%BF%E7%94%A8%E7%8E%B0%E6%9C%89nginx%E6%9C%8D%E5%8A%A1%E5%8F%8A502%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/)
657 | - [我所遇到的GitLab 502问题的解决](http://blog.csdn.net/wangxicoding/article/details/43738137)
--------------------------------------------------------------------------------
/back-end/centOS/CentOS7安装配置vsftp搭建FTP.md:
--------------------------------------------------------------------------------
1 |
2 | CentOS7安装配置vsftp搭建FTP
3 | ===
4 |
5 | 安装配置vsftpd做FTP服务,我们的项目应用使用git管理进行迭代,公共文件软件存储使用开源网盘Seafile来管理,基本够用。想不到FTP的使用的场景,感觉它好像老去了,虽然现在基本没有用到这个工具,刚好公司公司刷一个硬件需要使用FTP来配置下载文件,于是研究使用了一下,记录了一下使用过程。😀
6 |
7 | ## 目录
8 |
9 | - [安装](#安装)
10 | - [查看位置](#查看位置)
11 | - [启动vsftpd服务](#启动vsftpd服务)
12 | - [关闭firewall和SELinux](#关闭firewall和selinux)
13 | - [修改配置文件](#修改配置文件)
14 | - [匿名登录](#匿名登录)
15 | - [多用户配置](#多用户配置)
16 | - [创建宿主用户](#创建宿主用户)
17 | - [建立虚拟用户文件](#建立虚拟用户文件)
18 | - [生成虚拟用户数据文件](#生成虚拟用户数据文件)
19 | - [创建用户配置](#创建用户配置)
20 | - [创建用户目录](#创建用户目录)
21 | - [最后重启vsftpd服务器](#最后重启vsftpd服务器)
22 | - [服务运维](#服务运维)
23 | - [FTP命令](#ftp命令)
24 | - [关闭FTP连接](#关闭ftp连接)
25 | - [下载文件](#下载文件)
26 | - [上传文件](#上传文件)
27 | - [状态码](#状态码)
28 | - [参考资料](#参考资料)
29 |
30 | ## 安装
31 |
32 | 在安装前查看是否已安装vsftpd
33 |
34 | ```shell
35 | # 查看是否已安装 方法一
36 | [root@localhost ~]# rpm -q vsftpd
37 | vsftpd-3.0.2-21.el7.x86_64
38 |
39 | # 查看是否已安装 方法二
40 | [root@localhost ~]# vsftpd -v
41 | vsftpd: version 3.0.2
42 |
43 | # 安装 vsftpd
44 | [root@localhost ~]# yum -y install vsftpd
45 | ```
46 |
47 | ## 查看位置
48 |
49 | ```shell
50 | [root@localhost ~]# whereis vsftpd
51 | vsftpd: /usr/sbin/vsftpd /etc/vsftpd /usr/share/man/man8/vsftpd.8.gz
52 | ```
53 |
54 | ## 启动vsftpd服务
55 |
56 | ```shell
57 | systemctl start vsftpd.service
58 | ```
59 |
60 | ## 关闭firewall和SELinux
61 |
62 | ```shell
63 | setenforce 0 # 设置SELinux 成为permissive模式 (关闭SELinux)
64 | setenforce 1 # 设置SELinux 成为enforcing模式 (开启SELinux)
65 |
66 | # 或者修改配置
67 | vi /etc/selinux/config
68 | # SELINUX=enforcing
69 | # 注释掉
70 | # SELINUXTYPE=targeted
71 | # 注释掉
72 | SELINUX=disabled
73 | # 增加
74 | :wq! #保存退出
75 | setenforce 0
76 | ```
77 |
78 | 或者设置SELinux
79 |
80 | ```shell
81 |
82 | getsebool -a | grep ftp
83 | setsebool -P ftpd_full_access on
84 | ```
85 |
86 | ```shell
87 | systemctl stop firewalld.service
88 | #停止firewall
89 | systemctl disable firewalld.service
90 | #禁止firewall开机启动
91 | ```
92 |
93 | 如果你不愿意关闭防火墙,需要防火墙添加FTP服务。
94 |
95 | ```shell
96 | firewall-cmd --permanent --zone=public --add-service=ftp
97 | firewall-cmd --reload
98 | ```
99 |
100 | ## 修改配置文件
101 |
102 | 配置文件`/etc/vsftpd/vsftpd.conf`
103 |
104 | ```shell
105 | anonymous_enable=NO # 不允许匿名访问,禁用匿名登录
106 | chroot_local_user=YES # 启用限定用户在其主目录下
107 | use_localtime=YES # 使用本地时(自行添加)
108 | chroot_list_enable=YES
109 | local_enable=YES # 允许使用本地帐户进行FTP用户登录验证
110 | allow_writeable_chroot=YES # 如果启用了限定用户在其主目录下需要添加这个配置,解决报错 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
111 | xferlog_enable=YES # 启用上传和下载的日志功能,默认开启。
112 | local_umask=022 # 设置本地用户默认文件掩码022
113 | # FTP上本地的文件权限,默认是077,不过vsftpd安装后的配置文件里默认是022
114 | ```
115 |
116 | 虚拟用户高级参数
117 |
118 | ```
119 | 当virtual_use_local_privs=YES 时,虚拟用户和本地用户有相同的权限;
120 | 当virtual_use_local_privs=NO 时,虚拟用户和匿名用户有相同的权限,默认是NO。
121 | 当virtual_use_local_privs=YES,write_enable=YES时,虚拟用户具有写权限(上传、下载、删除、重命名)。
122 | 当virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=YES,
123 | anon_upload_enable=YES时,虚拟用户不能浏览目录,只能上传文件,无其他权限。
124 | 当virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
125 | anon_upload_enable=NO时,虚拟用户只能下载文件,无其他权限。
126 | 当virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
127 | anon_upload_enable=YES时,虚拟用户只能上传和下载文件,无其他权限。
128 | 当virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
129 | anon_mkdir_write_enable=YES时,虚拟用户只能下载文件和创建文件夹,无其他权限。
130 | 当virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
131 | anon_other_write_enable=YES时,虚拟用户只能下载、删除和重命名文件,无其他权限。
132 | ```
133 |
134 |
135 | ## 匿名登录
136 |
137 | 安装完默认情况下是开启匿名登录的,对应的是 `/var/ftp` 目录,这时只要服务启动了,就可以直接连上FTP了。默认用户名是`ftp`,密码是空的。如果你在配置里面配置了`anonymous_enable=NO`,匿名就无法登录。
138 |
139 | ```shell
140 | $ ftp 192.168.188.114
141 |
142 | Connected to 192.168.188.114.
143 | 220 (vsFTPd 3.0.2)
144 | Name (192.168.188.114:kennywang): ftp
145 | 331 Please specify the password.
146 | Password:
147 | 230 Login successful.
148 | Remote system type is UNIX.
149 | Using binary mode to transfer files.
150 | ftp> ls
151 | 229 Entering Extended Passive Mode (|||47867|).
152 | 150 Here comes the directory listing.
153 | -rw-r--r-- 1 0 0 12 Jan 18 06:31 README.md
154 | drwxr-xr-x 2 0 0 6 Nov 05 19:43 pub
155 | 226 Directory send OK.
156 | ```
157 |
158 | ## 多用户配置
159 |
160 | 多用户配置需要自己手工添加配置,下面内容到vsftpd.conf末尾
161 |
162 | ```shell
163 | #
164 | #
165 |
166 | use_localtime=YES # 使用本地时(自行添加)
167 | listen_port=21
168 | chroot_local_user=YES # 启用限定用户在其主目录下
169 | idle_session_timeout=300
170 |
171 | data_connection_timeout=120 # 数据连接超时时间
172 | guest_enable=YES # 设定启用虚拟用户功能
173 | guest_username=ftpuser # 指定虚拟用户的宿主用户 ftpuser(就是我们后面会新建这个用户)
174 | # guest_username=www
175 | # 如果ftp目录是指向网站根目录,用来上传网站程序,
176 | # 可以指定虚拟用户的宿主用户为nginx运行账户www,可以避免很多权限设置问题
177 |
178 |
179 | user_config_dir=/etc/vsftpd/vuser_conf # 虚拟用户配置文件目录
180 | virtual_use_local_privs=YES # NO时,虚拟用户和匿名用户有相同的权限,默认是NO
181 |
182 | pasv_min_port=10060 # 被动模式最小端口号10060
183 | pasv_max_port=10090 # 被动模式最大端口号10090
184 |
185 | accept_timeout=5
186 | connect_timeout=1
187 | ```
188 |
189 | ### 创建宿主用户
190 |
191 | 新建系统用户ftpuser,用户目录为`/home/vsftpd`, 用户登录终端设为/bin/false(即使之不能登录系统)
192 |
193 | ```shell
194 | # 方法一
195 | # 创建用户 ftpuser 指定 `/home/vsftpd` 目录
196 | useradd -g root -M -d /home/vsftpd -s /sbin/nologin ftpuser
197 |
198 | # 设置用户 ftpuser 的密码
199 | passwd ftpuser
200 | # 把 /home/vsftpd 的所有权给ftpuser.root
201 | chown -R ftpuser.root /home/vsftpd
202 |
203 | # 方法二
204 | useradd ftpuser -d /home/vsftpd -s /bin/false
205 | chown ftpuser:ftpuser /home/vsftpd -R
206 |
207 | # 如果虚拟用户的宿主用户为www,需要这样设置
208 | # www目录是你应用的目录
209 | chown www:www /home/www -R
210 | ```
211 |
212 | 删除用户 `userdel ftpuser`
213 |
214 | ### 建立虚拟用户文件
215 |
216 | ```shell
217 | touch /etc/vsftpd/vuser_passwd
218 | # 编辑虚拟用户名单文件:(
219 | # 第一行账号,第二行密码,注意:不能使用root做用户名,系统保留)
220 | vi /etc/vsftpd/vuser_passwd
221 | # 编辑内容,下面是 vuser_passwd 内容
222 | wcj
223 | 123456
224 | hss
225 | 123456
226 | #保存退出
227 | ```
228 |
229 | ### 生成虚拟用户数据文件
230 |
231 | ```shell
232 | db_load -T -t hash -f /etc/vsftpd/vuser_passwd /etc/vsftpd/vuser_passwd.db
233 | chmod 600 /etc/vsftpd/vuser_passwd.db
234 | ```
235 |
236 | ### 创建用户配置
237 |
238 | ```shell
239 | mkdir /etc/vsftpd/vuser_conf # 建立虚拟用户个人vsftp的配置文件
240 | cd /etc/vsftpd/vuser_conf # 进入目录
241 | touch hss wcj # 这里创建两个虚拟用户配置文件
242 | ```
243 |
244 | 每一个文件配置文件都差不多,只是参数`local_root`不一样。
245 |
246 | ```shell
247 | local_root=/home/vsftpd/hss # 用户 hss 配置目录,这个地方不一样
248 | write_enable=YES # 允许本地用户对FTP服务器文件具有写权限
249 | anon_world_readable_only=NO
250 | anon_upload_enable=YES # 允许匿名用户上传文件(须将全局的write_enable=YES,默认YES)
251 | anon_mkdir_write_enable=YES # 允许匿名用户创建目录
252 | anon_other_write_enable=YES # 允许匿名用户删除和重命名权限(自行添加)
253 | ```
254 |
255 | ### 创建用户目录
256 |
257 | 每个用户目录文件夹是有root用户创建的,也就是上面`local_root`配置目录,其权限应设置为755。因为权限的问题在该文件夹内无法直接上传文件。而如果设置为777则无法访问,这是由于vsftpd的安全性设置。解决上传问题的方法是在local_root文件夹内新建一个upload的文件夹,权限设置为777,可将文件上传到该文件夹。
258 |
259 | ```shell
260 | mkdir -p /home/vsftpd/hss # 每个用户对于一个目录,创建两个目录“hss”、“wcj”
261 |
262 | # 下面是目录结构
263 | /home/vsftpd
264 | ├── hss
265 | │ ├── filename.md
266 | │ └── upload
267 | └── wcj
268 | └── filename.md
269 |
270 |
271 | # 赋予其权限
272 | chmod -R 777 /var/vsftpd/hss/upload/
273 |
274 | # 在/var/ftp下新建一个目录来实现匿名用户上传
275 | mkdir /var/ftp/upload
276 | ```
277 |
278 | vsftpd中几种用户的区分:
279 |
280 | **本地用户**:用户在FTP服务器拥有账号,且该账号为本地用户的账号,可以通过自己的账号和口令进行授权登录,登录目录为自己的home目录`$HOME`
281 | **虚拟用户**:用户在FTP服务器上拥有账号,但该账号只能用于文件传输服务。登录目录为某一特定的目录,通常可以上传和下载
282 | **匿名用户**:用户在FTP服务器上没有账号,登录目录为/var/ftp
283 |
284 | ### 最后重启vsftpd服务器
285 |
286 | ```shell
287 | systemctl restart vsftpd.service
288 | ```
289 |
290 | ## 服务运维
291 |
292 | ```shell
293 | systemctl restart vsftpd.service # 重启服务
294 | systemctl start vsftpd.service # 启动服务
295 | systemctl status vsftpd.service # 服务状态查看
296 | ```
297 |
298 | ## FTP命令
299 |
300 | ```shell
301 | ftp> ascii # 设定以ASCII方式传送文件(缺省值)
302 | ftp> bell # 每完成一次文件传送,报警提示.
303 | ftp> binary # 设定以二进制方式传送文件.
304 | ftp> bye # 终止主机FTP进程,并退出FTP管理方式.
305 | ftp> case # 当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母.
306 | ftp> cd # 同UNIX的CD命令.
307 | ftp> cdup # 返回上一级目录.
308 | ftp> chmod # 改变远端主机的文件权限.
309 | ftp> close # 终止远端的FTP进程,返回到FTP命令状态, 所有的宏定义都被删除.
310 | ftp> delete # 删除远端主机中的文件.
311 | ftp> dir [remote-directory] [local-file] # 列出当前远端主机目录中的文件.如果有本地文件,就将结果写至本地文件.
312 | ftp> get [remote-file] [local-file] # 从远端主机中传送至本地主机中.
313 | ftp> help [command] # 输出命令的解释.
314 | ftp> lcd # 改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录.
315 | ftp> ls [remote-directory] [local-file] # 同DIR.
316 | ftp> macdef # 定义宏命令.
317 | ftp> mdelete [remote-files] # 删除一批文件.
318 | ftp> mget [remote-files] # 从远端主机接收一批文件至本地主机.
319 | ftp> mkdir directory-name # 在远端主机中建立目录.
320 | ftp> mput local-files # 将本地主机中一批文件传送至远端主机.
321 | ftp> open host [port] # 重新建立一个新的连接.
322 | ftp> prompt # 交互提示模式.
323 | ftp> put local-file [remote-file] # 将本地一个文件传送至远端主机中.
324 | ftp> pwd # 列出当前远端主机目录.
325 | ftp> quit # 同BYE.
326 | ftp> recv remote-file [local-file] # 同GET.
327 | ftp> rename [from] [to] # 改变远端主机中的文件名.
328 | ftp> rmdir directory-name # 删除远端主机中的目录.
329 | ftp> send local-file [remote-file] # 同PUT.
330 | ftp> status # 显示当前FTP的状态.
331 | ftp> system # 显示远端主机系统类型.
332 | ftp> user user-name [password] [account] # 重新以别的用户名登录远端主机.
333 | ftp> ? [command] # 同HELP. [command]指定需要帮助的命令名称。如果没有指定 command,ftp 将显示全部命令的列表。
334 | ftp> ! # 从 ftp 子系统退出到外壳。
335 | ```
336 |
337 | ### 关闭FTP连接
338 |
339 | ```shel
340 | bye
341 | exit
342 | quit
343 | ```
344 |
345 | ### 下载文件
346 |
347 | ```shell
348 | ftp> get readme.txt # 下载 readme.txt 文件
349 | ftp> mget *.txt # 下载
350 | ```
351 |
352 | ### 上传文件
353 |
354 | ```shell
355 | ftp> put /path/readme.txt # 上传 readme.txt 文件
356 | ftp> mput *.txt # 可以上传多个文件
357 | ```
358 |
359 | ## 状态码
360 |
361 | - 230 - 登录成功
362 | - 200 - 命令执行成功
363 | - 150 - 文件状态正常,开启数据连接端口
364 | - 250 - 目录切换操作完成
365 | - 226 - 关闭数据连接端口,请求的文件操作成功
366 |
367 | ## 参考资料
368 |
369 | - [Vsftpd虚拟用户的配置](http://hx100.blog.51cto.com/44326/383143/)
370 | - [CentOS7安装和配置FTP](http://www.cnblogs.com/flandre/p/6051532.html)
--------------------------------------------------------------------------------
/back-end/centOS/CentOS7更换yum软件镜像源.md:
--------------------------------------------------------------------------------
1 | CentOS7系统更换软件安装源
2 | ===
3 |
4 | 阿里云Linux安装镜像源地址:http://mirrors.aliyun.com/ 。
5 |
6 | 第一步:备份你的原镜像文件,以免出错后可以恢复。
7 |
8 | ```bash
9 | cp /etc/yum.repos.d/CentOS-Base.repo{,.backup}
10 | # 或者
11 | mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
12 | ```
13 |
14 | 第二步:下载新的CentOS-Base.repo 到/etc/yum.repos.d/
15 |
16 | 如果 wget 没有安装,运行下面命令安装 wget 软件。
17 |
18 | ```bash
19 | yum update --skip-broken
20 | yum -y install wget
21 | ```
22 |
23 | 安装完成更新下载源
24 |
25 | ```bash
26 | # CentOS 5
27 | wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
28 | # CentOS 6
29 | wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
30 | # CentOS 7
31 | wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
32 | ```
33 |
34 | 第三步:运行yum makecache生成缓存
35 |
36 | ```bash
37 | yum clean all
38 | yum makecache
39 | ```
40 |
41 | yum 安装报错
42 |
43 | ```bash
44 | File "/usr/bin/yum", line 30 except KeyboardInterrupt, e:
45 | ```
46 |
47 | 解决:修改文件`/usr/bin/yum`、`/usr/libexec/urlgrabber-ext-down`头中相应python为`#!/usr/bin/python2.7`
48 |
49 | # 163官方说明:
50 |
51 | http://mirrors.163.com/
52 | http://mirrors.163.com/.help/centos.html
53 |
54 | # 中国开源镜像站点
55 |
56 | - 阿里云开源镜像站:http://mirrors.aliyun.com/
57 | - 网易开源镜像站:http://mirrors.163.com/
58 | - 搜狐开源镜像站:http://mirrors.sohu.com/
59 | - 北京交通大学:http://mirror.bjtu.edu.cn/cn/ <教育网荐>
60 | - 兰州大学:http://mirror.lzu.edu.cn/ <西北高校FTP搜索引擎>
61 | - 厦门大学:http://mirrors.xmu.edu.cn/
62 | - 上海交通大学:http://ftp.sjtu.edu.cn/
63 | - 清华大学:http://mirrors.tuna.tsinghua.edu.cn/
64 | - http://mirrors.6.tuna.tsinghua.edu.cn/
65 | - http://mirrors.4.tuna.tsinghua.edu.cn/
66 | - 天津大学:http://mirror.tju.edu.cn/
67 | - 中国科学技术大学:http://mirrors.ustc.edu.cn/
68 | - http://mirrors4.ustc.edu.cn/ <教育网、电信>
69 | - http://mirrors6.ustc.edu.cn/
70 | - 西南大学:http://linux.swu.edu.cn/swudownload/
71 | - 泰安移动:http://mirrors.ta139.com/
72 | - 东北大学:http://mirror.neu.edu.cn/
73 | - 浙江大学:http://mirrors.zju.edu.cn/
74 | - 东软信息学院:http://mirrors.neusoft.edu.cn/
75 |
--------------------------------------------------------------------------------
/back-end/centOS/CentOS7网络配置.md:
--------------------------------------------------------------------------------
1 | Centos7网络配置
2 | ---
3 |
4 | ## 目录
5 |
6 | - [网络相关目录说明](#网络相关目录说明)
7 | - [ip命令工具](#ip命令工具)
8 | - [ip配置](#ip配置)
9 | - [启动和关闭网卡命令](#启动和关闭网卡命令)
10 | - [网卡开机自动启动](#网卡开机自动启动)
11 | - [重启/停止/查看网络](#重启停止查看网络)
12 | - [其它名词解释](#其它名词解释)
13 |
14 | ## 网络相关目录说明
15 |
16 | ```bash
17 | /etc/sysconfig/network # 包括主机基本网络信息,用于系统启动
18 | /etc/sysconfig/network-script/ # 此目录下是系统启动最初始化网络的信息
19 | /etc/sysconfig/network-script/ifcfg-em1 # 网络配置信息,每个人的配置名字不一样通过命令查看
20 | /etc/xinetd.conf 定义了由超级进程XINETD启动的网络服务
21 | /etc/protocols # 设定了主机使用的协议以及各个协议的协议号
22 | /etc/services # 设定了主机的不同端口的网络服务
23 | ```
24 |
25 | 在 CentOS 7 中 ifconfig 命令已经不灵了,换成了 `ip` 命令工具,输入 ifconfig 会报如下错误:
26 |
27 | ```bash
28 | ifconfig
29 | -bash: ifconfig: command not found
30 | ```
31 |
32 | 你可通过命令 `ls /usr/sbin/` 查看这个目录下 有没有 ifconfig 工具,这个路径一般是配置在环境变量上面,你通过查看环境变量看一下放置系统管理程序的路径 /usr/sbin 。
33 |
34 | ```
35 | echo $PATH
36 | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
37 | ```
38 |
39 | 如果没有可以安装一个工具 **yum install net-tools** 将 **ifconfig** 命令找回来。
40 |
41 | ## ip命令工具
42 |
43 | ip [选项] 操作对象{link|addr|route...}
44 |
45 | ```bash
46 |
47 | ip link show # 显示网络接口信息
48 | ip link set eth0 upi # 开启网卡
49 | ip link set eth0 down # 关闭网卡
50 | ip link set eth0 promisc on # 开启网卡的混合模式
51 | ip link set eth0 promisc offi # 关闭网卡的混个模式
52 | ip link set eth0 txqueuelen 1200 # 设置网卡队列长度
53 | ip link set eth0 mtu 1400 # 设置网卡最大传输单元
54 | ip addr show # 显示网卡IP信息
55 | ip addr add 192.168.0.1/24 dev eth0 # 设置eth0网卡IP地址192.168.0.1
56 | ip addr del 192.168.0.1/24 dev eth0 # 删除eth0网卡IP地址
57 |
58 | ip route list # 查看路由信息
59 | ip route add 192.168.4.0/24 via 192.168.0.254 dev eth0 # 设置192.168.4.0网段的网关为192.168.0.254,数据走eth0接口
60 | ip route add default via 192.168.0.254 dev eth0 # 设置默认网关为192.168.0.254
61 | ip route del 192.168.4.0/24 # 删除192.168.4.0网段的网关
62 | ip route del default # 删除默认路由
63 | ```
64 |
65 | ## ip配置
66 |
67 | 通过 ip addr 命令 查看ip。看到两个配置,**lo** 和 **em1** ,lo代表127.0.0.1,即localhost。em1这个是你的网卡,如果上面没有 inet 字段后面跟着 IP 的话,你需要去配置文件中修改配置。
68 |
69 | 默认配置文件在这里 /etc/sysconfig/network-scripts/ifcfg-em1 ,一般情况这个配置文件是 ifcfg-<网卡名字> 加上你网卡名字,新的Centos。运行下面命令编辑配置文件。
70 |
71 | ```bash
72 | vi /etc/sysconfig/network-scripts/ifcfg-em1
73 | ```
74 |
75 | 主要更改这三项:**BOOTPROTO=dhcp**、**ONBOOT=yes**,下面是我的配置文件
76 |
77 | ```bash
78 | # TYPE:配置文件接口类型。在/etc/sysconfig/network-scripts/目录有多种网络配置文件,有Ethernet 、IPsec等类型,网络接口类型为Ethernet。
79 | TYPE=Ethernet
80 |
81 | BOOTPROTO=dhcp # 自动获取IP
82 | # BOOTPROTO=none # 静态配置,若该值为“dhcp”则为动态获得,另外 static也是表示静态ip地址
83 | DEFROUTE=yes
84 | PEERDNS=yes
85 | PEERROUTES=yes
86 | IPV4_FAILURE_FATAL=no
87 | IPV6INIT=yes # 是否执行IPv6。yes:支持IPv6。no:不支持IPv6。
88 | IPV6_AUTOCONF=yes
89 | IPV6_DEFROUTE=yes
90 | IPV6_PEERDNS=yes
91 | IPV6_PEERROUTES=yes
92 | IPV6_FAILURE_FATAL=no
93 | NAME=em1 # 网卡名称
94 | UUID=99-6217--a****** # UUID号,没事不要动它,否则你会后悔的
95 | DEVICE=em1 # 接口名称
96 | ONBOOT=yes # 设置网络开机自动启动
97 |
98 | IPADDR=<这里固定IP配置的地方> # 设置IP地址
99 | PREFIX=24 # 设置子网掩码
100 | GATEWAY=<这里设置网关> # 设置网关
101 | DNS1=<这里设置DNS> # DNS
102 |
103 | DNS1=8.8.8.8 # 设置主DNS
104 | DNS2=8.8.4.4 # 设置备DNS
105 | ```
106 |
107 | ## 启动和关闭网卡命令
108 |
109 | ```bash
110 | ifup <设备名> # 激活网卡 {网卡名字}
111 | ifdown <设备名> # 关闭网卡
112 | ifup em1 # 激活网卡 em1
113 | ```
114 |
115 | ## 网卡开机自动启动
116 |
117 | 修改配置文件里面 vi /etc/sysconfig/network-scripts/ifcfg-em1 的参数 **ONBOOT=yes**
118 |
119 | ## 重启/停止/查看网络
120 |
121 | ```bash
122 | service network start # 启动网络服务
123 | service network stop # 停止网络服务
124 | service network restart # 重启网络服务
125 | service network status # 查看网络服务状态
126 | nmcli dev status # 检查受网络管理器管理的网络接口
127 | systemctl status NetworkManager.service # 验证网络管理器服务的状态
128 | ```
129 |
130 | ## 其它名词解释
131 |
132 | - wlan0 表示第一块无线以太网卡
133 | - Link encap 表示该网卡位于OSI物理层(Physical Layer)的名称
134 | - HWaddr 表示网卡的MAC地址(Hardware Address)
135 | - inet addr 表示该网卡在TCP/IP网络中的IP地址
136 | - Bcast 表示广播地址(Broad Address)
137 | - Mask 表示子网掩码(Subnet Mask)
138 | - MTU 表示最大传送单元,不同局域网 MTU值不一定相同,对以太网来说,MTU的默认设置是1500个字节
139 | - Metric 表示度量值,通常用于计算路由成本
140 | - RX 表示接收的数据包
141 | - TX 表示发送的数据包
142 | - collisions 表示数据包冲突的次数
143 | - txqueuelen 表示传送列队(Transfer Queue)长度
144 | - interrupt 表示该网卡的IRQ中断号
145 | - Base address 表示I/O地址
--------------------------------------------------------------------------------
/back-end/centOS/Centos7安装编译Node.md:
--------------------------------------------------------------------------------
1 |
2 | 安装node.js
3 | ---
4 |
5 | 给大家介绍在 Centos7 上安装Node.js的方法。
6 |
7 | ## 登陆Centos
8 |
9 | 终端登录 `$ ssh root@192.168.0.23` IP可以是局域网内或者公网IP。
10 |
11 | ## 下载node
12 |
13 | 根据你的系统,在官网找到 https://nodejs.org/en/download/ 你需要下载的版本。比如我选择的 Linux Binaries (x86/x64) **64bit** ,点击右键将你需要的版本连接地址复制出来,通过命令下载nodejs安装压缩包。
14 |
15 | ```bash
16 | $ wget https://nodejs.org/dist/v4.4.4/node-v4.4.4-linux-x64.tar.xz
17 | ```
18 |
19 | 如果你 **wget** 命令不存在,可以通过 **yum install wget** 命令安装下载工具 **wget** 。如果你是最小版本的 centos 需要安装 **yum -y install gcc make gcc-c++ openssl-devel wget**
20 |
21 | ## 解压安装
22 |
23 |
24 | ```bash
25 | # 没有用到`gzip`压缩去掉`z`参数
26 | $ sudo tar --strip-components 1 -xzvf node-v* -C /usr/local
27 | ```
28 |
29 | ## 查看安装
30 |
31 | 可以查看安装是否成功!一般情况安装会报错误信息,如果没有报错误信息,你可以通过调用 **node** 命令测试一下安装是否成功!
32 |
33 | ```bash
34 | node -v # 会输出版本信息
35 | # v6.9.1
36 |
37 | npm -v # 会输出版本信息
38 | # 3.10.8
39 | ```
40 |
--------------------------------------------------------------------------------
/back-end/centOS/Elasticsearch安装维护.md:
--------------------------------------------------------------------------------
1 | ElasticSearch安装维护
2 | ---
3 |
4 | 目录
5 | ===
6 |
7 |
8 |
9 | - [下载安装](#下载安装)
10 | - [命令行运行](#命令行运行)
11 | - [全局命令调用](#全局命令调用)
12 | - [作为守护进程启动](#作为守护进程启动)
13 | - [命令行中修改配置](#命令行中修改配置)
14 | - [管理](#管理)
15 | - [对比理解](#对比理解)
16 | - [插件安装](#插件安装)
17 | - [插件](#插件)
18 | - [MySQL数据导入](#mysql数据导入)
19 | - [错误处理](#错误处理)
20 | - [参考文档](#参考文档)
21 |
22 |
23 |
24 | ## 下载安装
25 |
26 | 官方[Elasticsearch 5.3](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/zip-targz.html) 安装教程
27 |
28 | ```bash
29 | # 下载Elasticsearch 5.3
30 | wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.3.0.tar.gz
31 | # 解压压缩包
32 | tar -xzf elasticsearch-5.3.0.tar.gz
33 | # 进入解压出来的目录
34 | cd elasticsearch-5.3.0/
35 | ```
36 |
37 | 注意:如果官方下载不下来,可以通过迅雷断点下载。
38 |
39 | ## 命令行运行
40 |
41 | 进入解压目录之后,运行下面命令即可开始运行Elasticsearch服务了。`ctrl-c` 结束服务。
42 |
43 | ```bash
44 | # 命令行运行
45 | ./bin/elasticsearch
46 | # 查看日志
47 | tail -f logs/elasticsearch.log
48 | ```
49 |
50 | 运行出现下面警告,一般是磁盘不够的样子
51 |
52 | ```bash
53 | [2017-04-06T14:01:41,191][INFO ][o.e.c.r.a.DiskThresholdMonitor] [cki_UTv] low disk watermark [85%] exceeded on [cki_UTvDRtWzj9hzmC1kvg][cki_UTv][/usr/local/elasticsearch-5.3.0/data/nodes/0] free: 25gb[10.7%], replicas will not be assigned to this node
54 | ```
55 |
56 | ## 全局命令调用
57 |
58 | 将你下载的目录拷贝到一个特定目录`/usr/local` 这个目录一般是本地系统管理员,用来自由添加程序的目录。
59 |
60 | ```bash
61 | cp -rf elasticsearch-5.3.0 /usr/local/
62 | ```
63 |
64 | 编辑 `vim ~/.bash_profile` 文件添加下面两行配置。
65 |
66 | ```bash
67 | export ELASTIC_SEARCH=/usr/local/elasticsearch-5.3.0/bin
68 | export PATH=${ELASTIC_SEARCH}:${PATH}
69 | ```
70 |
71 | 上面操作完成记得 `source ~/.bash_profile` 立即生效。
72 |
73 |
74 | ## 作为守护进程启动
75 |
76 | 加上 `-p` 参数将进程id保存到`es.pid`文本文件里面。
77 |
78 | ```bash
79 | elasticsearch -d -p es.pid
80 | ```
81 |
82 | 通过 `es.pid` 文件中的进程id 将其杀掉
83 |
84 | ```
85 | kill `cat es.pid`
86 | ```
87 |
88 | ## 命令行中修改配置
89 |
90 | 任何[Elasticsearch配置](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/settings.html)都可以通过命令行修改,但是要遵循elasticsearch的语法,每个参数前面跟上`-E`,如:
91 |
92 | ```bash
93 | elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_1
94 | ```
95 |
96 | ## 管理
97 |
98 | 健康状态
99 |
100 | ```bash
101 | curl 'localhost:9200/_cat/health?v'
102 | # epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
103 | # 1473669150 16:32:30 es-test green 1 1 0 0 0 0 0 0
104 | ```
105 |
106 | 列出节点
107 |
108 | ```bash
109 | curl 'localhost:9200/_cat/nodes?v'
110 | # host ip heap.percent ram.percent load node.role master name
111 | # 127.0.0.1 127.0.0.1 6 16 0.00 d * node-1
112 | ```
113 |
114 | 列出索引
115 |
116 | ```
117 | curl 'localhost:9200/_cat/indices?v'
118 | health status index pri rep docs.count docs.deleted store.size pri.store.size
119 | ```
120 |
121 | ## 对比理解
122 |
123 | ```
124 | Relational DB -> Databases -> Tables -> Rows -> Columns
125 | Elasticsearch -> Indices -> Types -> Documents -> Fields
126 | ```
127 |
128 | 在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,我们可以画一些简单的对比图来类比传统关系型数据库
129 |
130 | Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。
131 |
132 | ## 插件安装
133 |
134 | ```bash
135 | # 列出当前插件列表
136 | sudo bin/elasticsearch-plugin list
137 | # 删除插件
138 | sudo bin/elasticsearch-plugin remove [pluginname]
139 | # 更新插件
140 | sudo bin/elasticsearch-plugin remove [pluginname]
141 | sudo bin/elasticsearch-plugin install [pluginname]
142 | # 通过URL或者系统文件夹安装插件
143 | sudo bin/elasticsearch-plugin install [url]
144 | sudo bin/elasticsearch-plugin install file:///path/to/plugin.zip
145 | sudo ES_JAVA_OPTS="-Djavax.net.ssl.trustStore=/path/to/trustStore.jks" bin/elasticsearch-plugin install https://....
146 | # 某些插件需要更多权限
147 | # 这些插件将列出所需的权限,并要求用户进行确认,然后再继续安装。
148 | sudo bin/elasticsearch-plugin install --batch [pluginname]
149 | # 如果您的elasticsearch.yml配置文件位于自定义位置,
150 | # 则需要在使用插件脚本时指定配置文件的路径。
151 | sudo bin/elasticsearch-plugin -Epath.conf=/path/to/custom/config/dir install
152 | # 通过代理安装插件
153 | sudo ES_JAVA_OPTS="-Dhttp.proxyHost=host_name -Dhttp.proxyPort=port_number -Dhttps.proxyHost=host_name -Dhttps.proxyPort=https_port_number" bin/elasticsearch-plugin install analysis-icu
154 | # windows中通过代理安装插件
155 | set ES_JAVA_OPTS="-Dhttp.proxyHost=host_name -Dhttp.proxyPort=port_number -Dhttps.proxyHost=host_name -Dhttps.proxyPort=https_port_number"
156 | bin\elasticsearch-plugin install analysis-icu
157 | # 如果您依赖某些插件,可以通过将plugin.mandatory设置添加到config / elasticsearch.yml文件中来定义强制插件,
158 | plugin.mandatory: analysis-icu,lang-js
159 | ```
160 |
161 | ⚠️ 注意:
162 |
163 | - 对于Elasticsearch 5.x:不支持网站插件。
164 | - 对于不支持的插件,不能放到elasticsearch-5.3.0/plugins目录中。
165 |
166 | ### 插件
167 |
168 | - [ElasticSearch Toolbox](https://chrome.google.com/webstore/detail/elasticsearch-toolbox/focdbmjgdonlpdknobfghplhmafpgfbp/related) 谷歌浏览器的扩展组件
169 | - [Elasticsearch GUI](http://www.gridshore.nl/esgui/)
170 | - [Elasticsearch-head](https://github.com/mobz/elasticsearch-head)
171 | - [Sense (Beta)](https://chrome.google.com/webstore/detail/sense-beta/lhjgkmllcaadmopgmanpapmpjgmfcfig/related?hl=zh-CN)
172 |
173 | 插件[elasticsearch-head](https://github.com/mobz/elasticsearch-head)不能通过命令安装,这是一个图形界面管理elasticsearch。
174 |
175 | ```bash
176 | # 修改 elasticsearch/config/elasticsearch.yml 添加
177 | http.cors.enabled: true
178 | http.cors.allow-origin: "*"
179 | ```
180 |
181 | 下载 [elasticsearch-head](https://github.com/mobz/elasticsearch-head) 或者 git clone 到随便一个文件夹
182 |
183 | ```bash
184 | cd /path/to/elasticsearch-head
185 | npm install
186 | npm start
187 | http://localhost:9100/
188 | ```
189 |
190 | ### MySQL数据导入
191 |
192 | - [go-mysql-elasticsearch](https://github.com/siddontang/go-mysql-elasticsearch) golang版本
193 | - [elasticsearch-river-mysql](https://github.com/scharron/elasticsearch-river-mysql)
194 | - [elasticsearch-river-jdbc](https://github.com/jprante/elasticsearch-river-jdbc)
195 |
196 | ## 错误处理
197 |
198 | 注:ES有执行脚本的能力,因安全因素,不能在root用户下运行,强行运行会报如下错误:
199 |
200 | > org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
201 |
202 | ```bash
203 | groupadd elsearch # 增加es组
204 | useradd elsearch -g elsearch -p elasticsearch # 增加elsearch用户并附加到elsearch组
205 | chown -R elsearch:elsearch elasticsearch-5.1.1 # 给目录权限
206 | su elsearch # 使用es用户
207 | ```
208 |
209 | 注: `network.host: 127.0.0.1`
210 |
211 | ```bash
212 | bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks
213 | ERROR: bootstrap checks failed
214 | ```
215 |
216 | 我通过设置Nginx代理来访问
217 |
218 | ## 参考文档
219 |
220 | - [Elasticsearch配置](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/settings.html)
221 | - [官方安装Elasticsearch 5.3文档](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/zip-targz.html)
222 | - [Github官方仓库](https://github.com/elastic/elasticsearch-js)
223 | - [npm官方仓库](https://www.npmjs.com/package/elasticsearch)
224 | - [Elasticsearch 权威指南(中文版)](https://www.gitbook.com/book/looly/elasticsearch-the-definitive-guide-cn/details)
225 | - [Node.js 官方文档](https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/12.1/index.html)
226 | - [Elasticsearch配置说明](http://www.cnblogs.com/hanyouchun/p/5163183.html)
227 | - [Elasticsearch5.0 安装问题集锦](http://www.cnblogs.com/woxpp/p/6061073.html)
--------------------------------------------------------------------------------
/back-end/centOS/Golang安装.md:
--------------------------------------------------------------------------------
1 | Golang安装
2 | ---
3 |
4 | 安装之前需要了解及新建几个必要的文件目录:
5 |
6 | - GOROOT 目录,该目录为解压压缩包所存放的目录。(建议 linux 环境解压到 /usr/local 目录,windows 环境解压到 C:\ProgramFiles 目录)
7 | - 新建 GOPATH 目录,即为我们的“工作目录”,该目录可以有多个,建议只设置一个。
8 | - 在 GOPATH 目录下新建 src 目录,该目录用于存放第三方库源码,以及存放我们的项目的源码。
9 | - 在 GOPATH 目录下新建 bin 目录,该目录用于存放项目中所生成的可执行文件。
10 | - 在 GOPATH 目录下新建 pkg 目录,该目录用于存放编译生成的库文件。
11 |
12 |
13 | CentOS7 可以只用使用yum安装
14 |
15 | ```bash
16 | yum install golang
17 | ```
18 |
19 | 源码安装
20 |
21 | ```bash
22 | wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
23 | tar zxvf go1.8.linux-amd64.tar.gz -C /usr/local
24 | ```
25 |
26 | 新建GOPATH目录
27 |
28 | ```bash
29 | mkdir -p $HOME/gopath
30 | ```
31 |
32 | 编辑 `vim /etc/profile` 添加环境变量。
33 |
34 | ```bash
35 | export GOROOT=/usr/local/go
36 | export GOBIN=$GOROOT/bin
37 | export PATH=$PATH:$GOBIN
38 | export GOPATH=$HOME/wwwroot/gofile
39 | ```
40 |
41 | 使其立即生效
42 |
43 | ```bash
44 | source /etc/profile
45 | ```
46 |
47 |
48 | 其它命令
49 |
50 | ```bash
51 | cat $GOROOT/VERSION # 查看版本
52 | $GOROOT/src/all.bash # 测试用例正确
53 | ```
54 |
55 |
56 |
--------------------------------------------------------------------------------
/back-end/centOS/Linux添加、删除用户和用户组.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # 管理用户(user)
4 |
5 |
6 | | 命令 | 说明 |
7 | | ---- | ---- |
8 | | useradd wcj | 注:添加用户 wcj |
9 | | useradd -g test wcj | 注:新建wcj用户并增加到test工作组 |
10 | | adduser | 注:添加用户 |
11 | | passwd wcj | 注:给wcj用户设置密码 |
12 | | passwd peter –l | 注:关闭用户账号|
13 | | passwd peter –u | 注:关闭用户账号|
14 | | userdel peter | 注:永久性删除用户账号 |
15 | | groupdel peter | 注:永久性删除用户账号组 |
16 | | usermod –G peter peter | 注:强制删除该用户的主目录和主目录下的所有文件和子目录 |
17 | | usermod | 注:修改用户命令,可以通过usermod 来修改登录名、用户的家目录等等; |
18 | | usermod -G groupname username | 注:给已有的用户增加工作组 |
19 | | gpasswd -a user group | 注:给已有的用户增加工作组 |
20 | | pwcov | 注:同步用户从/etc/passwd 到/etc/shadow |
21 | | pwck | 注:pwck是校验用户配置文件/etc/passwd 和/etc/shadow 文件内容是否合法或完整; |
22 | | pwunconv | 注:是pwcov 的立逆向操作,是从/etc/shadow和 /etc/passwd 创建/etc/passwd ,然后会删除 /etc/shadow 文件; |
23 | | finger | 注:查看用户信息工具 |
24 | | id | 注:查看用户的UID、GID及所归属的用户组 |
25 | | chfn | 注:更改用户信息工具 |
26 | | su | 注:用户切换工具 |
27 | | sudo | 注:sudo 是通过另一个用户来执行命令(execute a command as another user),su 是用来切换用户,然后通过切换到的用户来完成相应的任务,但sudo 能后面直接执行命令,比如sudo 不需要root 密码就可以执行root 赋与的执行只有root才能执行相应的命令;但得通过visudo 来编辑/etc/sudoers来实现; |
28 | | visudo | 注:visodo 是编辑 /etc/sudoers 的命令;也可以不用这个命令,直接用vi 来编辑 /etc/sudoers 的效果是一样的;|
29 | | sudoedit | 注:和sudo 功能差不多;|
30 | | id user | 注:显示用户信息|
31 |
32 |
33 | # 管理用户组(group)
34 |
35 | | 命令 | 说明 |
36 | | ---- | ---- |
37 | | groupadd | 注:添加用户组;|
38 | | groupdel | 注:删除用户组;|
39 | | groupmod | 注:修改用户组信息 |
40 | | groups | 注:显示用户所属的用户组 |
41 | | grpck | - |
42 | | grpconv | 注:通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ,如果/etc/gshadow 不存在则创建;|
43 | | grpunconv | 注:通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group ,然后删除gshadow文件;|
44 | | usermod -G groupname username | 给已有的用户增加工作组 |
45 | | gpasswd -a user group | 给已有的用户增加工作组 |
46 | | gpasswd -d A GROUP | 从组中删除用户 |
47 |
48 |
49 | # /etc/skel 目录
50 |
51 | /etc/skel目录一般是存放用户启动文件的目录,这个目录是由root权限控制,当我们添加用户时,这个目录下的文件自动复制到新添加的用户的家目录下;/etc/skel 目录下的文件都是隐藏文件,也就是类似.file格式的;我们可通过修改、添加、删除/etc/skel目录下的文件,来为用户提供一个统一、标准的、默认的用户环境;
52 |
53 | ```
54 | [root@localhost beinan]# ls -la /etc/skel/
55 | 总用量 92
56 | drwxr-xr-x 3 root root 4096 8月 11 23:32 .
57 | drwxr-xr-x 115 root root 12288 10月 14 13:44 ..
58 | -rw-r--r-- 1 root root 24 5月 11 00:15 .bash_logout
59 | -rw-r--r-- 1 root root 191 5月 11 00:15 .bash_profile
60 | -rw-r--r-- 1 root root 124 5月 11 00:15 .bashrc
61 | -rw-r--r-- 1 root root 5619 2005-03-08 .canna
62 | -rw-r--r-- 1 root root 438 5月 18 15:23 .emacs
63 | -rw-r--r-- 1 root root 120 5月 23 05:18 .gtkrc
64 | drwxr-xr-x 3 root root 4096 8月 11 23:16 .kde
65 | -rw-r--r-- 1 root root 658 2005-01-17 .zshrc
66 | ```
67 |
68 | /etc/default/useradd 文件;
69 |
70 | 通过useradd 添加用户时的规则文件;
71 |
72 | # useradd defaults file
73 |
74 | ```
75 | GROUP=100
76 | HOME=/home 注:把用户的家目录建在/home中;
77 | INACTIVE=-1 注:是否启用帐号过期停权,-1表示不启用;
78 | EXPIRE= 注:帐号终止日期,不设置表示不启用;
79 | SHELL=/bin/bash 注:所用SHELL的类型;
80 | SKEL=/etc/skel 注: 默认添加用户的目录默认文件存放位置;也就是说,当我们用adduser添加用户时,用户家目录下的文件,都是从这个目录中复制过去的;
81 | ```
--------------------------------------------------------------------------------
/back-end/centOS/Mac下制作CentOS7启动盘.md:
--------------------------------------------------------------------------------
1 | Mac上制作linux系统U盘安装盘
2 | ===
3 |
4 | Mac下将ISO写入U盘可使用命令行工具dd,操作如下:
5 |
6 | 1. 找出U盘挂载的路径,使用如下命令:diskutil list
7 | 2. 将U盘unmount(将N替换为挂载路径):diskutil unmountDisk /dev/disk[N]
8 | 3. 写入U盘:sudo dd if=iso路径 of=/dev/rdisk[N] bs=1m rdisk 中加入r可以让写入速度加快
9 |
10 |
11 | ## 查看所有的disk
12 |
13 | ```bash
14 | $ diskutil list
15 | ```
16 |
17 | ```bash
18 | /dev/disk5 (external, physical):
19 | #: TYPE NAME SIZE IDENTIFIER
20 | 0: FDisk_partition_scheme *15.7 GB disk5
21 | 1: Apple_HFS TAIDIAN 15.7 GB disk5s1
22 | ```
23 |
24 | ## 解除其挂载
25 |
26 | ```bash
27 | $ diskutil unmountDisk /dev/disk5
28 | # 提示卸载成功!
29 | # Unmount of all volumes on disk5 was successful
30 | ```
31 |
32 | ## 用 dd 命令将 iso 写入
33 |
34 | 这 /Volumes/Untitled\ 1/CentOS-7-x86_64-Everything-1511.iso 是我本地移动硬盘镜像路径
35 |
36 | ```bash
37 | $ sudo dd if=/Volumes/Untitled\ 1/CentOS-7-x86_64-Everything-1511.iso of=/dev/disk5 bs=1m
38 | ```
39 |
40 | 使用brew安装pv工具,之后使用以下的命令来实现进度条的显示
41 |
42 | ```bash
43 | sudo pv -cN source < /Users/kacperwang/Downloads/CentOS-7-x86_64-Everything-1511.iso | sudo dd of=/dev/disk2 bs=4m
44 | ## 显示下面进度
45 | source: 5.2GiB 5:11:41 [ 503KiB/s] [=====================> ] 71% ETA 2:01:56
46 | ```
47 |
48 | ## 查看磁盘进度
49 |
50 | 可以用iostat命令查看磁盘写入状态,进度。
51 |
52 | ```bash
53 | $ iostat -w 5
54 | disk0 disk2 disk3 cpu load average
55 | KB/t tps MB/s KB/t tps MB/s KB/t tps MB/s us sy id 1m 5m 15m
56 | 20.65 21 0.42 131.00 0 0.00 278.80 0 0.00 4 3 93 2.31 2.05 2.02
57 | 14.29 1 0.02 0.00 0 0.00 0.00 0 0.00 2 3 95 2.45 2.08 2.03
58 | 92.56 13 1.16 0.00 0 0.00 0.00 0 0.00 3 4 94 2.33 2.06 2.02
59 | ```
60 |
61 | ## pv时刻监控克隆的进度
62 |
63 | 用brew安装pv命令,之后才用如下方式执行dd命令:
64 |
65 | ```bash
66 | # 安装pv
67 | brew install pv
68 |
69 | # 刻监控克隆的进度
70 | pv -cN source < xxx.img | dd of=/dev/rdisk2 bs=4m
71 | ```
72 |
73 | ## 操作完毕后将U盘弹出
74 |
75 | ```bash
76 | diskutil eject /dev/disk2
77 | Disk /dev/disk2 ejected
78 | ```
--------------------------------------------------------------------------------
/back-end/centOS/Mac使用NFS连接CentOS上的共享文件夹.md:
--------------------------------------------------------------------------------
1 | Mac使用NFS连接CentOS上的共享文件夹
2 | ---
3 |
4 | 首先使用下面命令确认依赖的软件是否安装
5 |
6 | ```bash
7 | rpm -qa|grep nfs
8 | rpm -qa|grep portmap
9 | # centos7中的已经将名字改成rpcbind了。
10 | rpm -qa|grep rpcbind
11 | ```
12 |
13 | 两条命令检测是否已安装NFS,如果有就会有输出结果,没有就需要运行命令安装下面两个软件。
14 |
15 | ```bash
16 | yum install -y nfs-utils portmap
17 | # 或者rpcbind,centos7中的已经将名字改成rpcbind了
18 | yum install -y nfs-utils rpcbind
19 | ```
20 |
21 | 在CentOS设置共享目录,把该目录开放给`192.168.188.164`,编辑 `/etc/exports`,增加一行
22 |
23 | ```bash
24 | /root/wwwroot 192.168.188.164(rw,subtree_check,insecure,nohide)
25 | ```
26 |
27 | ## Mac端配置
28 |
29 | 挂载共享目录
30 |
31 | ```bash
32 | sudo mount -t nfs 192.168.99.100:/root/wwwroot ~/centos_share
33 | ```
34 |
35 | 卸载共享目录
36 |
37 | ```bash
38 | sudo umout ~/centos_share
39 | ```
40 |
41 | 查看共享主机状态
42 |
43 |
44 | ```bash
45 | showmount -e 192.168.99.100
46 |
47 | Exports list on 192.168.99.100:
48 | /root/wwwroot 192.168.99.1 192.168.188.164
49 | ```
50 |
51 |
52 | ```bash
53 | showmount -e # 默认查看自己共享的服务,前提是要DNS能解析自己
54 | showmount -a # 显示已经与客户端连接上的目录信息
55 | ```
--------------------------------------------------------------------------------
/back-end/centOS/Python2升级到Python3.md:
--------------------------------------------------------------------------------
1 | CentOS7中Python2升级到Python3
2 | ===
3 |
4 |
5 | ## 编译安装
6 |
7 | 从Python官网到获取[Python3](https://www.python.org/ftp/python/3.6.1/)的包, 切换到目录`/usr/local/src`。
8 |
9 | ```bash
10 | wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
11 | ```
12 |
13 | 使用命令如下命令进行解压缩
14 |
15 | ```bash
16 | xz -d Python-3.6.1.tar.xz
17 | tar -xf Python-3.6.1.tar
18 | ```
19 |
20 | 在`/usr/local`路径下创建目录`python3.6.1`
21 |
22 | ```
23 | mkdir /usr/local/python3.6.1
24 | ```
25 |
26 | 编译安装(会自动安装pip-7.1.2)
27 |
28 | ```bash
29 | cd /usr/local/src/Python-3.6.1
30 | # ./configure --prefix=/usr/local/python3.6.1 --enable-shared
31 | # make all
32 | # make install
33 | # make clean
34 | # make distclean
35 | ```
36 |
37 | 进入安装的绝对路径,检查是否安装成功
38 |
39 | ```bash
40 | /usr/local/python3.6/bin/python3.6 -V
41 | Python 3.6.1
42 | ```
43 |
44 | 修改软连接,启动python时指向`python3.6`
45 |
46 | ```bash
47 | # 备份python
48 | mv /usr/bin/python /usr/bin/python3.6.1
49 |
50 | # 修改软连接
51 | sudo ln -s /usr/local/python3.6.1/bin/python3 /usr/bin/python
52 | ```
53 |
54 |
55 | ## 多版本共存pyenv
56 |
57 | 此时需要在系统中安装多个 Python,但又不能影响系统自带的 Python,即需要实现 Python 的多版本共存。 [pyenv](https://github.com/pyenv/pyenv) 就是这样一个 Python 版本管理器。
58 |
59 | 在终端执行如下命令以安装 pyenv 及其插件:
60 |
61 | ```
62 | curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
63 | ```
64 |
65 | 安装完成后会提示将下面三行配置,根据提示将如下语句加入到 ~/.bash_profile 或者 ~/.bashrc 中:
66 |
67 | ```bash
68 | export PATH="/root/.pyenv/bin:$PATH"
69 | eval "$(pyenv init -)"
70 | eval "$(pyenv virtualenv-init -)"
71 | ```
72 |
73 | 查看可安装的版本
74 |
75 | ```bash
76 | pyenv install --list
77 | ```
78 |
79 | ### 安装依赖包
80 |
81 | 在编译 Python 过程中会依赖一些其他库文件,因而需要首先安装这些库文件,已知的一些需要预先安装的库如下。
82 |
83 | 在 CentOS/RHEL/Fedora 下:
84 |
85 | ```bash
86 | sudo yum install readline readline-devel readline-static
87 | sudo yum install openssl openssl-devel openssl-static
88 | sudo yum install sqlite-devel
89 | sudo yum install bzip2-devel bzip2-libs
90 | ```
91 |
92 | 在 Ubuntu下:
93 |
94 | ```bash
95 | sudo apt-get update
96 | sudo apt-get install make build-essential libssl-dev zlib1g-dev
97 | sudo apt-get install libbz2-dev libreadline-dev libsqlite3-dev wget curl
98 | sudo apt-get install llvm libncurses5-dev libncursesw5-dev
99 | ```
100 |
101 | ### 安装指定版本
102 |
103 | 用户可以使用 `pyenv install` 安装指定版本的 python。如果你不知道该用哪一个,推荐你安装 anaconda3 的最新版本,这是一个专为科学计算准备的发行版。
104 |
105 | ```bash
106 | $ pyenv install 3.6.1 -v
107 | /tmp/python-build.20170108123450.2752 ~
108 | Downloading 3.6.1.sh...
109 | -> https://repo.continuum.io/archive/3.6.1.sh
110 | ```
111 |
112 | 安装过程中
113 |
114 | ### 其它操作
115 |
116 | ```bash
117 | # 更新数据库
118 | pyenv rehash
119 | # 在安装 Python 或者其他带有可执行文件的模块之后,需要对数据库进行更新
120 |
121 | # 查看当前已安装的 python 版本
122 | pyenv versions
123 | # * system (set by /home/seisman/.pyenv/version)
124 | # 3.6.1
125 |
126 | # 设置全局的 python 版本
127 | pyenv global 3.6.1
128 | # system
129 | # * 3.6.1 (set by /root/.pyenv/version)
130 | # 当前全局的 python 版本已经变成了 3.6.1。
131 | # 也可以使用 pyenv local 或 pyenv shell 临时改变 python 版本。
132 |
133 | pyenv uninstall # 卸载某个版本
134 | pyenv update # 更新 pyenv 及其插件
135 | ```
136 |
137 | 使用python注意 ⚠️
138 |
139 | - 输入 python 即可使用新版本的 python;
140 | - 系统自带的脚本会以 /usr/bin/python 的方式直接调用老版本的 python,因而不会对系统脚本产生影响;
141 | - 使用 pip 安装第三方模块时会自动按照到当前的python版本下,不会和系统模块发生冲突。
142 | - 使用 pip 安装模块后,可能需要执行 pyenv rehash 更新数据库;
143 |
144 |
145 | ## 错误处理
146 |
147 | ⚠️ 注意:
148 |
149 | ```bash
150 | ERROR: found static Python library (/usr/local/python3.6.1/lib/python3.6/config-3.6m-x86_64-linux-gnu/libpython3.6m.a) but a dynamic one is required. You must use a Python compiled with the --enable-shared flag. If using pyenv, you need to run the command:
151 | export PYTHON_CONFIGURE_OPTS="--enable-shared"
152 | before installing a Python version.
153 | ```
154 |
155 | 通过工具pyenv 来解决
156 |
157 | ```bash
158 | pyenv uninstall 3.6.1
159 |
160 | env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.1
161 | ```
162 |
--------------------------------------------------------------------------------
/back-end/centOS/Rocket.Chat.md:
--------------------------------------------------------------------------------
1 | Rocket.Chat 开源IM系统部署
2 | ===
3 |
4 | Rocket.Chat 是特性最丰富的 Slack 开源替代品之一。
5 |
6 | 主要功能:群组聊天,直接通信,私聊群,桌面通知,媒体嵌入,链接预览,文件上传,语音/视频 聊天,截图等等。Rocket.Chat 原生支持 Windows,Mac OS X ,Linux,iOS 和 Android 平台。Rocket.Chat 通过 hubot 集成了非常流行的服务,比如 GitHub,GitLab,Confluence,JIRA 等等。
7 |
8 | 高级的特性包括:OTR 消息,XMPP 多用户聊天,Kerberos 认证,p2p 文件分享等等。
9 |
10 | 以下教程是在 `CentOS Linux release 7.2.1511 (Core)` 下安装 `Rocket.Chat`,可以通过官方教程安装在这里:[Deploying Rocket.Chat on Centos 7](https://rocket.chat/docs/installation/manual-installation/centos/)。
11 |
12 | 主要依赖三个工具 `Nginx`、`CentOS 7`、`Mongodb`
13 |
14 | 
15 |
16 |
17 |
18 |
19 | - [安装依赖步骤](#安装依赖步骤)
20 | - [安装Mongodb数据库](#安装mongodb数据库)
21 | - [安装Rocket.Chat](#安装rocketchat)
22 | - [启动服务](#启动服务)
23 | - [开机启动](#开机启动)
24 |
25 |
26 |
27 | ## 安装依赖步骤
28 |
29 | 添加epel存储库并更新所有内容。
30 |
31 | ```bash
32 | yum -y install epel-release && yum -y update
33 | ```
34 |
35 | 一般情况下,新系统自带`curl`工具,没有的话你需要安装,后面会用到,如下:
36 |
37 | ```bash
38 | yum install -y curl
39 | ```
40 |
41 | 安装 `node.js` 和 `npm`
42 |
43 | ```bash
44 | yum install -y nodejs npm
45 | # node版本很重要需要安装`n`来切换版本
46 | npm install -g inherits n
47 | # 切换node版本, 很重要
48 | n 4.8.4
49 | ```
50 |
51 | 安装meteor
52 |
53 | ```bash
54 | curl https://install.meteor.com | sh
55 | ```
56 |
57 | ## 安装Mongodb数据库
58 |
59 | 安装使用`Mongodb`,先添加 `yum repo`
60 |
61 | ```bash
62 | vi /etc/yum.repos.d/mongodb.repo
63 | ```
64 |
65 | 复制下面内容,保存并退出`:wq`
66 |
67 | ```bash
68 | [mongodb]
69 | name=MongoDB Repository
70 | baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
71 | gpgcheck=0
72 | enabled=1
73 | ```
74 |
75 | 安装图形库以及`Mongodb`数据库
76 |
77 | ```bash
78 | yum install -y GraphicsMagick mongodb-org-server mongodb-org gcc-c++
79 | ```
80 |
81 | 提前配置数据库
82 |
83 | ```bash
84 | # 启动MongoDB
85 | service mongod start
86 |
87 | # 连接MongoDB
88 | mongo
89 | > use rocketchat # 添加数据库
90 | > exit
91 | ## 重启数据库
92 | service mongod restart
93 | ```
94 |
95 | ## 安装Rocket.Chat
96 |
97 | 安装的时候记得前面加上`sudo`
98 |
99 | ```bash
100 | cd /opt
101 | curl -L https://download.rocket.chat/stable -o rocket.chat.tgz
102 | # 解压 rocket.chat.tgz
103 | tar zxvf rocket.chat.tgz
104 | mv bundle Rocket.Chat
105 | cd Rocket.Chat/programs/server
106 | # ========sudo很重要===========
107 | sudo npm install # 记得前面加上sudo
108 | cd ../..
109 | ```
110 |
111 | 直接在命令行中运行下面命令,配置 `PORT`, `ROOT_URL` 和 `MONGO_URL`:
112 |
113 | ```bash
114 | export PORT=3000
115 | export ROOT_URL=http://127.0.0.1:3000/
116 | export MONGO_URL=mongodb://localhost:27017/rocketchat
117 | ```
118 |
119 | 将3000替换为您选择的端口,一般情况默认就好。
120 | 如果您选择使用端口80,则需要以root身份运行Rocket.Chat。
121 | 如果您没有配置DNS,请使用您的IP代替主机名。 您可以稍后在管理员菜单中进行更改。
122 |
123 | ## 启动服务
124 |
125 | 首先让Mongodb使用以下命令启动主机:
126 |
127 | ```bash
128 | chkconfig mongod on
129 | ```
130 |
131 | 现在我们需要启动mongo:
132 |
133 | ```bash
134 | systemctl start mongod
135 | # CentOS 6.X
136 | /etc/init.d/mongod start
137 | ```
138 |
139 | 尝试安装
140 |
141 | 现在让我们做一个快速测试,看看是否一切正常,然后再继续:
142 |
143 | ```bash
144 | node main.js
145 | ```
146 |
147 | ```bash
148 | meteor npm install --save bcrypt
149 | ```
150 |
151 | 使用上面的连接地址 `http://127.0.0.1:3000/`在浏览器中打开,点击`注册新账号`,输入`管理员姓名`,`电子邮件`,`两次密码`,如下:
152 |
153 | ```bash
154 | 姓名:admin
155 | 电子邮件:admin@admin.com
156 | 密码:test1234
157 | ```
158 |
159 | 点击提交,系统会提示你选择一个用户,直接选择管理员,点击使用此用户名继续。
160 |
161 |
162 | ```bash
163 | Error: MONGO_URL must be set in environment
164 | ```
165 |
166 | 报`node-v46-linux-x64`不存在错误 直接更改文件夹名字就解决了。
167 |
168 | ```bash
169 | cd /opt/Rocket.Chat/programs/server/npm/node_modules/meteor/rocketchat_google-vision/node_modules/grpc/src/node/extension_binary/
170 | mv node-v48-linux-x64 node-v46-linux-x64/
171 | ```
172 |
173 | ## 开机启动
174 |
175 | ```bash
176 | vi /usr/lib/systemd/system/rocketchat.service
177 | ```
178 |
179 | 将下面内容复制到上面文件中。
180 |
181 | ```
182 | [Unit]
183 | Description=The Rocket.Chat server
184 | After=network.target remote-fs.target nss-lookup.target nginx.target mongod.target
185 | [Service]
186 | ExecStart=/usr/local/bin/node /opt/Rocket.Chat/main.js
187 | StandardOutput=syslog
188 | StandardError=syslog
189 | SyslogIdentifier=rocketchat
190 | User=root
191 | Environment=MONGO_URL=mongodb://localhost:27017/rocketchat ROOT_URL=http://your-host-name.com-as-accessed-from-internet:3000/ PORT=3000
192 | [Install]
193 | WantedBy=multi-user.target
194 | ```
195 |
196 | 现在可以运行以下命令来启用此服务:
197 |
198 | ```bash
199 | systemctl enable rocketchat.service
200 | ```
201 |
202 | 最后通过运行来启动它,你就不需要:
203 |
204 | ```bash
205 | systemctl start rocketchat.service
206 | ```
--------------------------------------------------------------------------------
/back-end/centOS/Ruby安装.md:
--------------------------------------------------------------------------------
1 | Ruby安装
2 | ---
3 |
4 |
5 |
6 | - [安装](#安装)
7 | - [编译安装](#编译安装)
8 | - [yum安装](#yum安装)
9 | - [RVM安装](#rvm安装)
10 | - [卸载](#卸载)
11 | - [yum安装卸载](#yum安装卸载)
12 | - [编译安装卸载](#编译安装卸载)
13 |
14 |
15 |
16 | ## 安装
17 |
18 | ### 编译安装
19 |
20 | 下载地址可以换成 [淘宝镜像](https://ruby.taobao.org/mirrors/ruby/2.4/)
21 |
22 | ```bash
23 | sudo yum groupinstall "Development Tools"
24 | sudo yum install openssl-devel
25 | wget https://ruby.taobao.org/mirrors/ruby/2.4/ruby-2.4.0.tar.gz
26 | tar xvfvz ruby-2.1.2.tar.gz
27 | cd ruby-2.1.2
28 | ./configure
29 | make
30 | sudo make install
31 |
32 | ```
33 |
34 | ### yum安装
35 |
36 | ```bash
37 | yum install ruby
38 | ```
39 |
40 | ### RVM安装
41 |
42 | ```bash
43 | gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
44 | curl -sSL https://get.rvm.io | bash -s stable
45 | # 如果上面的连接失败,可以尝试:
46 | curl -L https://raw.githubusercontent.com/wayneeseguin/rvm/master/binscripts/rvm-installer | bash -s stable
47 |
48 | curl -L get.rvm.io | bash -s stable
49 | echo "source /etc/profile.d/rvm.sh" >> ~/.bashrc && source /etc/profile.d/rvm.sh
50 |
51 | # 安装完RVM之后,我们需要使用如下命令设置RVM运行环境。
52 | source /etc/profile.d/rvm.sh
53 |
54 | # 列出rvm知道的ruby版本
55 | rvm list known
56 |
57 | # 重新安装ruby 2.3.3版本
58 | rvm install 2.3.3
59 |
60 | # 重新安装
61 | rvm reinstall ruby-2.3.3
62 |
63 | # 切换要使用的ruby版本
64 | rvm use 2.2.1
65 |
66 | # 输出变量参数
67 | echo "export rvm_max_time_flag=20" >> ~/.rvmrc
68 |
69 |
70 | # 这种方式安装
71 | bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
72 | ```
73 |
74 | 最终使用下面方式安装成功的
75 |
76 | ```bash
77 | curl -L https://raw.githubusercontent.com/wayneeseguin/rvm/master/binscripts/rvm-installer | bash -s stable
78 | # 安装完RVM之后,我们需要使用如下命令设置RVM运行环境。
79 | source /etc/profile.d/rvm.sh
80 | ```
81 |
82 | RVM换淘宝镜像
83 |
84 | ```bash
85 | # For Mac
86 | sed -i .bak -E 's!https?://cache.ruby-lang.org/pub/ruby!https://ruby.taobao.org/mirrors/ruby!' $rvm_path/config/db
87 |
88 | # For Linux
89 | sed -i -E 's!https?://cache.ruby-lang.org/pub/ruby!https://ruby.taobao.org/mirrors/ruby!' $rvm_path/config/db
90 | ```
91 |
92 | ## 卸载
93 |
94 | ### yum安装卸载
95 |
96 | ```bash
97 | sudo yum remove ruby ruby-devel
98 | ```
99 |
100 | ### 编译安装卸载
101 |
102 |
103 | ```bash
104 | make uninstall
105 | ```
106 |
--------------------------------------------------------------------------------
/back-end/centOS/chmod.md:
--------------------------------------------------------------------------------
1 |
2 | Linux系统下有多种权限控制,一般为:可执行、可读、可写,如何快速在命令行下给相应文件或文件夹赋予相应权限呢?
3 |
4 | # chmod
5 |
6 | ## 语法
7 |
8 | > chmod [选项][参数]
9 |
10 | ## 详解
11 |
12 | chmod命令用于改变文件或目录的权限,设置权限有字符和数字两种设定方法。
13 | 在数字设定法中,0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,以上数字相加所得到的数最最终权限。如可写可读为6,可执行和可读为5权限。
14 | 在英文设定法中,r表示可读权限,w表示可写权限,x表示可执行权限,-表示无任何权限。
15 |
16 |
17 |
18 | ## 选项说明
19 |
20 | | 选项 | 相应功能 |
21 | | ---- | ---- |
22 | | u | 操作对象简称,用户user,文件或目录的所有者。 |
23 | | g | 操作对象简称,同组用户group,文件或目录所属群组 |
24 | | o | 操作对象简称,其它用户others |
25 | | a | 操作对象简称,所有用户all,系统默认使用此项 |
26 | | + | 权限操作符,添加某些权限 |
27 | | - | 权限操作符,取消某些权限 |
28 | | = | 权限操作符,设置文件的权限为给定的权限 |
29 | | r | 权限设定(英文),表示可读权限 |
30 | | w | 权限设定(英文),表示可写权限 |
31 | | x | 权限设定(英文),表示可执行权限 |
32 | | - | 权限设定(英文字符),表示没有权限 |
33 | | X | 权限设定,如果目标文件是可执行文件或目录,可给其设置可执行权限 |
34 | | s | 权限设定,设置权限suid和sgid,使用权限组合“u+s”设定文件的用户的ID位,“g+s”设置组ID位 |
35 | | t | 权限设定,只有目录或文件的所有者才可以删除目录下的文件 |
36 | | -c | 如果文件权限已经改变,显示其操作信息 |
37 | | -f | 操作过程中不显示任何错误信息 |
38 | | -R | 修改指定目录下所有文件或子目录的权限 |
39 | | -v | 显示命令运行时的详细执行过程 |
40 | | --help | 显示帮助信息 |
41 | | --version | 显示版本信息 |
42 |
43 | ## 参数说明
44 |
45 |
46 | | 参数 | 相应功能 |
47 | | ---------- | ------------- |
48 | | 文件 | 指定改变权限的文件或目录的名称。 |
49 |
50 |
51 | # 例子
52 |
53 | 将`/home/wwwroot/`里的所有文件和文件夹设置为`755`权限
54 |
55 | (1)直接指定路径修改
56 |
57 | ```bash
58 | chmod -R 755 /home/wwwroot/*
59 | ```
60 |
61 | (2)手动进入该目录修改权限(并显示详细过程)
62 |
63 |
64 | ```bash
65 | cd /home/wwwroot
66 | chmod -Rv 755 * #注意:“*”表示通配符,指的是所有文件和文件
67 | sudo chmod o+rw /shared #设置文件夹权限以保证其余用户可以访问它。
68 | ```
--------------------------------------------------------------------------------
/back-end/centOS/img/img01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/back-end/centOS/img/img01.jpg
--------------------------------------------------------------------------------
/back-end/centOS/img/kvmbanner-logo3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/back-end/centOS/img/kvmbanner-logo3.png
--------------------------------------------------------------------------------
/back-end/centOS/img/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/back-end/centOS/img/screenshot.png
--------------------------------------------------------------------------------
/back-end/centOS/samba.md:
--------------------------------------------------------------------------------
1 | # samba简介
2 |
3 | [samba](https://www.samba.org/),是一个基于[GPL](https://www.samba.org/samba/docs/GPL.html)协议的自由软件。它重新实现了[SMB/CIFS](https://en.wikipedia.org/wiki/Server_Message_Block)协议,可以在各个平台共享文件和打印机。
4 |
5 | 1991年,还是大学生的[Andrew Tridgwell](https://en.wikipedia.org/wiki/Andrew_Tridgell),有三台机器,分别是Microsoft的DOS系统、DEC的Digital Unix系统、以及Sun的Unix系统。当时的技术无法让三者共享文件。为此,他开发了samba并将其开源。
6 |
7 | 本来改名为smbserver,但是一家商业公司注册了SMBServer商标。他被告知不能使用。于是执行了`grep -i '^s.*m.*b' /usr/share/dict/words`,从中选择了samba这个词。我觉得这个是一个好想法,以后我也得着么干😄。
8 |
9 | # 安装
10 |
11 | ```bash
12 | yum -y install samba samba-client samba-common
13 | ```
14 |
15 | # 修改 samba 的配置文件
16 |
17 | vim 在文件参数后面接 `+` 可以直接打开到文件末尾,相当于在命令行模式下按 `G`,然后直接按 `o` 可以在下一行插入下面内容。
18 |
19 | ```bash
20 | sudo vim /etc/samba/smb.conf +
21 | testparm # 测试smb.conf配置是否正确
22 | testparm –v # 命令可以详细的列出smb.conf支持的配置参数
23 | ```
24 |
25 | ## 配置说明
26 |
27 | ```bash
28 | [myshare]
29 | comment = My share
30 | path = /home/public # 共享路径
31 | browseable = Yes # 可以被浏览,就是在网络邻居中能看到共享名
32 | read only = No # 可读写
33 | guest ok = Yes # 允许匿名访问,这个也需要设置,否则匿名无法访问
34 | valid users = samba liuag guest # 有效的用户和组
35 | invalid users = liuben # 无效用户和组
36 | read list = samba # 只读用户和组(如果read only = No,只读用户需要在此设置)
37 | write list = liuag # 可读写用户和组(如果read only = Yes,可读写用户需要在此设置)
38 | allow hosts = 192.168.100.236 # 允许访问主机列表,支持通配符
39 | deny hosts = 192.168.100.0/24 # 禁止访问主机列表,支持通配符
40 |
41 |
42 | security = user #这里指定samba的安全等级。关于安全等级有四种:
43 | # share:用户不需要账户及密码即可登录samba服务器
44 | # user:由提供服务的samba服务器负责检查账户及密码(默认)
45 | # server:检查账户及密码的工作由另一台windows或samba服务器负责
46 | # domain:指定windows域控制服务器来验证用户的账户及密码。
47 |
48 |
49 | ```
50 |
51 | # 重启服务
52 |
53 | ```
54 | systemctl restart smb
55 | systemctl reload smb
56 | systemctl status smb
57 | ```
58 |
59 | # 查看安装状况
60 |
61 | ```
62 | rpm -qa|grep samba
63 | ```
64 |
65 | # 设置开机自启动
66 |
67 | ```
68 | chkconfig --level 35 smb on //在3、5级别上自动运行samba服务
69 | ```
70 |
71 | # samba用户管理
72 |
73 | ```
74 | pdbedit –a username:新建Samba账户。
75 | pdbedit –x username:删除Samba账户。
76 | pdbedit –L:列出Samba用户列表,读取passdb.tdb数据库文件。
77 | pdbedit –Lv:列出Samba用户列表的详细信息。
78 | pdbedit –c “[D]” –u username:暂停该Samba用户的账号。
79 | pdbedit –c “[]” –u username:恢复该Samba用户的账号。
80 |
81 |
82 | smbpasswd -a 增加用户(要增加的用户必须以是系统用户)
83 | smbpasswd -d 冻结用户,就是这个用户不能在登录了
84 | smbpasswd -e 恢复用户,解冻用户,让冻结的用户可以在使用
85 | smbpasswd -n 把用户的密码设置成空.
86 | 要在global中写入 null passwords -true
87 | smbpasswd -x 删除用户
88 | ```
89 |
90 |
91 | `netstat -anlp | grep samba`
92 |
93 | # 关闭防火墙
94 |
95 | ```bash
96 | systemctl stop firewalld #关闭防火墙
97 | systemctl disable firewalld #开机禁用防火墙
98 | ```
99 |
100 |
101 | 如何让Finder不在远程连接时产生`.DS_Store`打开Mac的Terminal,输入
102 |
103 | ```bash
104 | defaults write com.apple.desktopservices DSDontWriteNetworkStores true
105 | ```
106 |
107 | 然后重启Mac,再试试远程连接。
108 |
109 | # 错误解决
110 |
111 | ## 增加samba用户提示Failed to add entry for user
112 |
113 | ```
114 | [root@ubuntu ~]# smbpasswd -a wcj
115 | New SMB password:
116 | Retype new SMB password:
117 | Failed to add entry for user wcj.
118 |
119 | ```
120 |
121 | **解决办法:**
122 |
123 | 这是因为没有加相应的系统账号,所以会提示`Failed to add entry for user`的错误,只需增加相应的系统账号`wcj`就可以了:
124 |
125 | `sudo useradd wcj`
126 | `useradd -g test wcj` 注:新建wcj用户并增加到test工作组
127 |
128 | 而且samba的登录密码可以和本机登录密码不一样。
129 |
130 | `sudo touch /etc/samba/smbpasswd`
131 | `sudo smbpasswd -a wcj`
132 |
133 |
134 | `smbclient -L \\192.168.0.104 -U username`
135 | `smbclient //192.168.60.231/username` #登录Samba服务器
136 |
137 | ## 我的配置
138 |
139 | ```
140 | [global]
141 | workgroup = MYGROUP
142 | server string = Samba Server Version %v
143 |
144 | # log files split per-machine:
145 | log file = /var/log/samba/log.%m
146 | # maximum size of 50KB per log file, then rotate:
147 | max log size = 50
148 |
149 | security = user
150 | passdb backend = tdbsam
151 |
152 | load printers = yes
153 | cups options = raw
154 |
155 | printcap name = /dev/null
156 | ;printable = yes
157 |
158 | directory mask =0777
159 | force directorymode = 0777
160 | directorysecurity mask = 0777
161 | force directorysecurity mode = 0777
162 | create mask =0777
163 | force createmode = 0777
164 | security mask =0777
165 | force securitymode = 0777
166 |
167 | [homes]
168 | comment = Home Directories
169 | browseable = no
170 | writable = yes
171 | ; valid users = %S
172 | ; valid users = MYDOMAIN\%S
173 | [dev]
174 | path = /home/wangchuajiang/shared
175 | writeable = yes
176 | browseable = yes
177 | write list = wangchujiang
178 | ```
179 |
180 | ## session setup failed
181 |
182 | [samba报错:session setup failed: NT_STATUS_LOGON_FAILURE 解决](http://shineforever.blog.51cto.com/1429204/317305/)
183 |
184 | ## 错误三
185 |
186 | [Failed to retrieve printer list: NT_STATUS_UNSUCCESSFUL解决](http://www.sotechdesign.com.au/samba-log-showing-error-failed-to-retrieve-printer-list/)
187 |
188 | ```
189 | printing = bsd
190 | printcap name = /dev/null
191 | ```
192 |
193 | ## 错误四
194 |
195 | security不再支持share
196 | WARNING: Ignoring invalid value 'share' forparameter 'security'
197 |
198 | ## 错误五
199 |
200 | 请检查服务器名称或 IP 地址,然后再试一次。如果问题持续发生,请联系系统管理员。
201 |
202 | 解决办法:重启电脑
203 |
204 | ## 错误六
205 |
206 | ```bash
207 | # 解決方法:於smb.conf中加入以下設定
208 | load printers = no
209 | printing = bsd
210 | printcap name = /dev/null
211 | disable spoolss = yes
212 | ```
213 |
214 | [about:Unable to connect to CUPS server localhost:631 - Connection refused](http://blog.csdn.net/wzhwho/article/details/6275063)
215 |
216 | ## 错误六
217 |
218 | STATUS=daemon 'smbd' finished starting up and ready to serve connections
219 |
220 | # 参考
221 |
222 | [samba官网](https://www.samba.org)
223 | [Mac连接远程Linux管理文件(samba)](http://www.jianshu.com/p/fe7fd0286c4e)
224 | [简单的配置 samba 共享](http://www.jianshu.com/p/a6d70f1fbfa1)
225 | [Ubuntu下配置samba服务器](http://my.oschina.net/junn/blog/171388)
226 | [linux6-samba服务器&SSH工具](http://www.jianshu.com/p/a6d70f1fbfa1)
227 | [CentOS7安装配置SAMBA服务器](http://www.cnblogs.com/kluan/p/4452684.html)
--------------------------------------------------------------------------------
/back-end/centOS/使用免费SSL证书让网站支持HTTPS访问.md:
--------------------------------------------------------------------------------
1 | 使用免费SSL证书让网站支持HTTPS访问
2 | ---
3 |
4 | 我们使用的服务器是在公司内部,用联通送的ip,通过路由器隐射使得外网可以访问,我们在这个服务器搭建了很多工具,比如Gitlab,聊天工具,网盘等,访问都很麻烦,没有备案,都必须带上端口号访问对应的服务,据说80端口被封了,假设有了https就可以默认443端口,就不用带端口号了,通过https访问默认浏览器会给你带上443端口,下面是我使用[Let's Encrypt](https://www.sslforfree.com/)提供的SSL证书,记录配置SSL的安装实践过程。
5 |
6 | ## 安装 EPEL 仓库
7 |
8 | 首先要安装 `Let's Encrypt` 证书用的工具,这个可以在CentOS 的 EPEL 仓库里找到它,在找到它之前,先检查是否存在 `EPEL` 源:
9 |
10 | ```bash
11 | # 进入目录检查是否存在 EPEL 源,一般情况文件名称 epel.repo
12 | cd /etc/yum.repos.d/
13 | ```
14 |
15 | 如果不存在可以直接安装
16 |
17 | ```bash
18 | sudo yum install epel-release -y
19 | ```
20 |
21 | ## 安装签发证书工具
22 |
23 | ```bash
24 | sudo yum install certbot-nginx -y
25 | ```
26 |
27 | ## 申请证书
28 |
29 | #### 报nginx命令不存在错误
30 |
31 | ```bash
32 | sudo certbot --nginx
33 | # Saving debug log to /var/log/letsencrypt/letsencrypt.log
34 | # The nginx plugin is not working; there may be problems with your existing configuration.
35 | # The error was: NoInstallationError()
36 | # 如果你报上面错误运行下面,命令解决问题
37 | which nginx # 查看目录
38 | #输出 /usr/local/nginx/sbin/nginx
39 | yum info nginx
40 | ```
41 |
42 | 解决方法
43 |
44 | ```bash
45 | ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
46 | ln -s /usr/local/nginx/conf/ /etc/nginx
47 | ```
48 |
49 | #### 报nginx配置文件目录不对错误
50 |
51 | ```bash
52 | sudo certbot --nginx
53 | # Saving debug log to /var/log/letsencrypt/letsencrypt.log
54 | # Error while running nginx -c /etc/nginx/nginx.conf -t.
55 |
56 | # nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
57 | # nginx: configuration file /etc/nginx/nginx.conf test failed
58 |
59 | # The nginx plugin is not working; there may be problems with your existing configuration.
60 | # The error was: MisconfigurationError('Error while running nginx -c /etc/nginx/nginx.conf -t.\n\nnginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)\nnginx: configuration file /etc/nginx/nginx.conf test failed\n',)
61 | ```
62 |
63 | 解决方法,这个解决方法就是让`certbot`认为你的,你的配置存在,并且将SSL配置写入你的nginx配置文件中,然后拷贝配置到你的默认 nginx 配置中。哈哈为了方便 nginx 启动不用指定配置,也没有看到 `certbot` 工具提供指定目录的命令,暂时我就这么解决吧。
64 |
65 | ```bash
66 | # nginx 默认配置文件目录不 /etc/nginx/ 目录下,
67 | # 需要拷贝/usr/local/nginx/conf目录下的全部文件
68 | # 复制到/etc/nginx/目录下
69 | cp -r /usr/local/nginx/conf/* /etc/nginx/
70 |
71 | # 编辑开机启动将所有目录换成/etc/nginx/
72 | vim /lib/systemd/system/nginx.service
73 | cp /lib/systemd/system/nginx.service{,.bak}
74 |
75 | # 测试配置是否正确
76 | nginx -t -c /etc/nginx/nginx.conf
77 | ```
78 |
79 | 正确之后将`nginx`中的 `SSL` 配置复制到你的原来正在运行的配置中,在默认安装目录配置`/usr/local/nginx/conf/`。会在配置中生成如下内容,主要是复制这个。
80 |
81 | ```nginx
82 | {
83 | ssl_certificate /etc/letsencrypt/live/chat.wangchujiang.com/fullchain.pem; # managed by Certbot
84 | ssl_certificate_key /etc/letsencrypt/live/chat.wangchujiang.com/privkey.pem; # managed by Certbot
85 | }
86 | ```
87 |
88 | #### 正式申请申请证书
89 |
90 | 首先运行证书生成命令,选择你要配置`SSL`证书的网站,这个是基于你网站已经在`nginx`中配置好了的情况。
91 |
92 | ```bash
93 | sudo certbot --nginx certonly
94 | # Saving debug log to /var/log/letsencrypt/letsencrypt.log
95 | # Plugins selected: Authenticator nginx, Installer nginx
96 | # Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
97 | #
98 | # Which names would you like to activate HTTPS for?
99 | # -------------------------------------------------------------------------------
100 | # 1: chat.wangchujiang.com
101 | # 2: g.wangchujiang.com
102 | # 3: pan.wangchujiang.com
103 | # -------------------------------------------------------------------------------
104 | # Select the appropriate numbers separated by commas and/or spaces, or leave input
105 | # blank to select all options shown (Enter 'c' to cancel): 2
106 | ```
107 |
108 | 上面选择了`g.wangchujiang.com`生成证书,下面是验证过程,添加 `certonly`参数表示只生成证书。
109 |
110 | ```bash
111 | # Obtaining a new certificate
112 | # Performing the following challenges:
113 | # tls-sni-01 challenge for g.wangchujiang.com
114 | # Waiting for verification...
115 | # Cleaning up challenges
116 | #
117 | # IMPORTANT NOTES:
118 | # - Congratulations! Your certificate and chain have been saved at:
119 | # /etc/letsencrypt/live/g.wangchujiang.com/fullchain.pem
120 | # Your key file has been saved at:
121 | # /etc/letsencrypt/live/g.wangchujiang.com/privkey.pem
122 | # Your cert will expire on 2018-03-13. To obtain a new or tweaked
123 | # version of this certificate in the future, simply run certbot
124 | # again. To non-interactively renew *all* of your certificates, run
125 | # "certbot renew"
126 | # - If you like Certbot, please consider supporting our work by:
127 | #
128 | # Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
129 | # Donating to EFF: https://eff.org/donate-le
130 | ```
131 |
132 | 上面生成成功了,可以添加到 nginx 配置中,这下完事儿了,下面是一端nginx的配置实例。
133 |
134 | #### 配置nginx
135 |
136 | ```nginx
137 | # http 重定向到 https
138 | server {
139 | listen 80;
140 | server_name g.wangchujiang.com;
141 | rewrite ^ https://$http_host$request_uri? permanent;
142 | # Enables or disables emitting nginx version on error pages and in the "Server" response header field.
143 | server_tokens off;
144 | }
145 | # https 的配置
146 | server {
147 | listen 443 ssl;
148 | server_name g.wangchujiang.com;
149 |
150 | ssl_certificate /etc/letsencrypt/live/g.wangchujiang.com/fullchain.pem;
151 | ssl_certificate_key /etc/letsencrypt/live/g.wangchujiang.com/privkey.pem;
152 | # 禁止在header中出现服务器版本,防止黑客利用版本漏洞攻击
153 | server_tokens off;
154 | # 设置ssl/tls会话缓存的类型和大小。如果设置了这个参数一般是shared,buildin可能会参数内存碎片,默认是none,和off差不多,停用缓存。如shared:SSL:10m表示我所有的nginx工作进程共享ssl会话缓存,官网介绍说1M可以存放约4000个sessions。
155 | ssl_session_cache shared:SSL:1m;
156 |
157 | # 客户端可以重用会话缓存中ssl参数的过期时间,内网系统默认5分钟太短了,可以设成30m即30分钟甚至4h。
158 | ssl_session_timeout 5m;
159 |
160 | # 选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同。
161 | # 这里指定的是OpenSSL库能够识别的写法,你可以通过 openssl -v cipher 'RC4:HIGH:!aNULL:!MD5'(后面是你所指定的套件加密算法) 来看所支持算法。
162 | ssl_ciphers HIGH:!aNULL:!MD5;
163 |
164 | # 设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。
165 | ssl_prefer_server_ciphers on;
166 |
167 | location / {
168 | root html;
169 | index index.html index.htm;
170 | }
171 | }
172 | ```
173 |
174 | ## 参考阅读
175 |
176 | - [利用SSL For Free工具3分钟获取Let's Encrypt免费SSL证书](http://www.laozuo.org/7742.html)
177 | - [Let's Encrypt:用免费的 SSL 证书,让网站支持 HTTPS](https://mp.weixin.qq.com/s/UHTMJjglrgjBHxi5l1EO8g)
178 | - [Automatically enable HTTPS on your website with EFF's Certbot, deploying Let's Encrypt certificates.](https://certbot.eff.org/)
--------------------------------------------------------------------------------
/back-end/centOS/修改ssh端口号的方法.md:
--------------------------------------------------------------------------------
1 |
2 | Centos7中修改ssh端口号的方法
3 | ===
4 |
5 | 使用场景,公司一个公网IP,两台服务器,所以尝试使用修改ssh端口号的方法,来链接不同的服务器。
6 |
7 | ## 查看端口
8 |
9 | ```bash
10 | netstat -tnlp # 查看端口
11 | netstat -tnlp |grep ssh # 查看ssh端口
12 |
13 | tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 986/sshd
14 | tcp6 0 0 :::22 :::* LISTEN 986/sshd
15 | ```
16 |
17 |
18 | ## 修改端口
19 |
20 | ```bash
21 | vi /etc/ssh/sshd_config
22 | #Port 22 # 这行去掉#号
23 | Port 2211 # 下面添加这一行
24 | ```
25 |
26 | 修改SELinux
27 |
28 | ```bash
29 | # 修改SELinux
30 | # 使用以下命令查看当前SElinux 允许的ssh端口:
31 | semanage port -l | grep ssh
32 |
33 | # 添加2211端口到 SELinux
34 | semanage port -a -t ssh_port_t -p tcp 2211
35 |
36 | # 然后确认一下是否添加进去
37 | semanage port -l | grep ssh
38 |
39 | # 如果成功会输出
40 | ssh_port_t tcp 2211, 22
41 | ```
42 |
43 | 重启ssh
44 |
45 | ```bash
46 | systemctl restart sshd.service
47 | ```
48 |
49 | 不过上述方法仅仅是在ssh中设置端口,还要在防火墙firewalld中放行才是
50 |
51 | ### 另一种方法
52 |
53 | ```bash
54 | # 还有一种办法直接关掉, 执行下面三条命令
55 | sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
56 | grep SELINUX=disabled /etc/selinux/config
57 | setenforce 0
58 | ```
59 |
60 |
61 | ### 修改防火墙
62 |
63 | ```bash
64 | # 编辑文件/etc/sysconfig/iptables 添加下面这行
65 | -A INPUT -p tcp -m state --state NEW -m tcp --dport 2211 -j ACCEPT
66 | ```
67 |
68 | 也可下面方法
69 |
70 | ```bash
71 | # 防火墙中开启端口2211
72 | firewall-cmd --zone=public --add-port=2211/tcp --permanent
73 |
74 | # 查看2211端口打开情况
75 | firewall-cmd --query-port=2211/tcp
76 | ```
77 |
78 | 重启iptables
79 |
80 | ```bash
81 | systemctl stop iptables
82 | systemctl start iptables
83 | systemctl status iptables
84 | ```
85 |
86 | 重启sshd
87 |
88 | ```bash
89 | systemctl status sshd
90 | ```
91 |
--------------------------------------------------------------------------------
/back-end/centOS/在5分钟内搭建企业内部私有npm仓库.md:
--------------------------------------------------------------------------------
1 | 在5分钟内搭建企业内部私有npm仓库
2 | ---
3 |
4 | 下面通过三种方法来搭建公司私有npm仓库,每种方式都有自己的优势。
5 |
6 | > Node.js >= 6.11.3,我的Node版本:node v8.2.1
7 | > Linux or OSX,我的系统版本:CentOS Linux release 7.2.1511 (Core)
8 |
9 | 目录
10 | ===
11 |
12 |
13 |
14 | - [cnpm搭建](#cnpm搭建)
15 | - [安装](#安装)
16 | - [启动并配置服务](#启动并配置服务)
17 | - [设置注册地址](#设置注册地址)
18 | - [登录cnpm](#登录cnpm)
19 | - [包上传到私有仓库](#包上传到私有仓库)
20 | - [查看预览包](#查看预览包)
21 | - [安装](#安装-1)
22 | - [通过verdaccio搭建](#通过verdaccio搭建)
23 | - [安装](#安装-2)
24 | - [启动服务](#启动服务)
25 | - [添加用户/登录](#添加用户登录)
26 | - [上传私有包](#上传私有包)
27 | - [本地配置注册地址](#本地配置注册地址)
28 | - [Git仓库当私有npm](#git仓库当私有npm)
29 | - [建立一个私有模块](#建立一个私有模块)
30 | - [安装使用私有模块](#安装使用私有模块)
31 | - [优劣势](#优劣势)
32 | - [参考资料](#参考资料)
33 |
34 |
35 |
36 | ## cnpm搭建
37 |
38 | ### 安装
39 |
40 | ```bash
41 | npm install -g --build-from-source cnpmjs.org cnpm sqlite3
42 | # 如果报错或者警告通过下面方式安装
43 | npm install -g --unsafe-perm --verbose --build-from-source cnpmjs.org cnpm sqlite3
44 | ```
45 |
46 | 如果安装不流畅通过下面形式安装:
47 |
48 | ```bash
49 | npm install -g --build-from-source \
50 | --registry=https://registry.npm.taobao.org \
51 | --disturl=https://npm.taobao.org/mirrors/node \
52 | cnpmjs.org cnpm sqlite3
53 | ```
54 |
55 | 如果报警告或者安装错误,请添加参数`--unsafe-perm --verbose`
56 |
57 | ### 启动并配置服务
58 |
59 | > 管理员:`myname,othername`
60 | > 范围:`my-company-name,other-name`
61 | > 默认端口:7001-registry, 7002-web
62 |
63 | 启动服务
64 |
65 | ```bash
66 | $ nohup cnpmjs.org start --admins='myname,othername' \
67 | --scopes='@my-company-name,@other-name' &
68 | ```
69 |
70 | ### 设置注册地址
71 |
72 | 将cnpm默认注册地址更改为私有注册地址
73 |
74 | ```bash
75 | cnpm set registry http://localhost:7001
76 | ```
77 |
78 | ### 登录cnpm
79 |
80 | ```bash
81 | $ cnpm login
82 | Username: myname
83 | Password: ***
84 | Email: (this IS public) test@test.com
85 | ```
86 |
87 | ### 包上传到私有仓库
88 |
89 | 新建项目
90 |
91 | ```
92 | $ cd /tmp
93 | $ mkdir helloworld && cd helloworld
94 | $ cnpm init
95 | name: (helloworld) @my-company-name/helloworld
96 | version: (1.0.0)
97 |
98 | {
99 | "name": "@my-company-name/helloworld",
100 | "version": "1.0.0",
101 | "description": "my first scoped package",
102 | "main": "index.js",
103 | "scripts": {
104 | "test": "echo \"Error: no test specified\" && exit 1"
105 | },
106 | "author": "",
107 | "license": "ISC"
108 | }
109 | ```
110 |
111 | 上传到私有仓库
112 |
113 | ```bash
114 | $ cnpm publish
115 | + @my-company-name/helloworld@1.0.0
116 | ```
117 |
118 | ### 查看预览包
119 |
120 | 浏览器中预览
121 |
122 | ```bash
123 | open http://localhost:7002/@my-company-name/helloworld
124 | ```
125 |
126 | 使用`cnpm`预览
127 |
128 | ```
129 | cnpm info
130 | ```
131 |
132 | ### 安装
133 |
134 | 所有公共包都可直接使用`cnpm`安装
135 |
136 | ```bash
137 | cnpm install hotkeys-js
138 | ```
139 |
140 |
141 | ## 通过verdaccio搭建
142 |
143 | [verdaccio](https://github.com/verdaccio/verdaccio) 是一个轻量级的私有npm代理注册。([sinopia](https://github.com/rlidwka/sinopia) fork)
144 |
145 | ### 安装
146 |
147 | ```bash
148 | # 使用 npm 安装
149 | npm install -g npm
150 |
151 | # 使用 yarn 安装
152 | yarn global add verdaccio
153 | ```
154 |
155 | ### 启动服务
156 |
157 | ```bash
158 | verdaccio >> verdaccio.log 2>&1 & # 后台启动并写入日志
159 |
160 | # Verdaccio doesn't need superuser privileges. Don't run it under root.
161 | # warn --- config file - /root/.config/verdaccio/config.yaml
162 | # warn --- http address - http://localhost:4873/ - verdaccio/2.3.6
163 |
164 | verdaccio --listen 4000 --config ./config.yaml # 指定配置启动
165 | ```
166 |
167 | ### 添加用户/登录
168 |
169 | ```bash
170 | npm adduser --registry http://localhost:4873
171 | ```
172 |
173 | ### 上传私有包
174 |
175 | ```bash
176 | npm publish --registry http://localhost:4873
177 | ```
178 |
179 | ### 本地配置注册地址
180 |
181 | ```bash
182 | npm config list -l # 查看默认配置
183 | # 将默认地址 https://registry.npmjs.org/ 改成私有地址
184 | npm set registry http://localhost:4873
185 | # 如果您使用HTTPS,请添加适当的CA信息
186 | #(“null”表示从操作系统获取CA列表)
187 | $ npm set ca null
188 | ```
189 |
190 | ## Git仓库当私有npm
191 |
192 | 这个方法得益于,npm提供的的丰富安装方法。通过下面方法安装:
193 |
194 | ```bash
195 | npm i -S git+ssh://git@git.showgold.cn:npm/hello.git
196 |
197 | npm install -S git+ssh://git@github.com:npm/npm.git#v1.0.27
198 | npm install -S git+ssh://git@github.com:npm/npm#semver:^5.0
199 | npm install -S git+https://isaacs@github.com/npm/npm.git
200 | npm install -S git://github.com/npm/npm.git#v1.0.27
201 | ```
202 |
203 | ⚠️ 上面安装需要注意:你的工程一定是在某一个组下面建立,方便管理,在生成你的包的时候`package.json`中的`name`一定要带上范围
204 |
205 | ### 建立一个私有模块
206 |
207 | ```bash
208 | # 假设你建立了一个Git仓库,先克隆下来
209 | git clone http://git.your-inc.com/companyfe/hello-private.git
210 |
211 | # 生成 `package.json` 配置, 注意限定 `@scope` 范围
212 | npm init --scope=companyfe
213 | # 提交到仓库
214 | git push origin master
215 | ```
216 |
217 | ⚠️ 将得到如下依赖,注意:
218 |
219 | > `name`字段必须限定范围,一般为 GitLab group 的名字, 例如 `@companyfe`, 那么 `name` 为: `@companyfe/hello-private`。
220 | > `private` 设为 `true` 防止将私有模块上传到公网上去,需要手动设置一下。
221 |
222 | ```json
223 | {
224 | "name": "@companyfe/hello-private",
225 | "version": "1.0.1",
226 | "description": "",
227 | "main": "index.js",
228 | "private":true,
229 | "scripts": {
230 | "test": "echo \"Error: no test specified\" && exit 1"
231 | },
232 | "author": "kenny wang (http://wangchujiang.com)",
233 | "license": "ISC"
234 | }
235 | ```
236 |
237 | ### 安装使用私有模块
238 |
239 | 跟安装开源的模块一样, 使用 `npm install` 安装依赖即可. 私有模块会安装在 `@scope` 的子文件夹中, 例如: `node_modules/@companyfe/hello-private`.
240 |
241 | ```bash
242 | # 基础安装
243 | npm i -S git+ssh://git@git.your-inc.com/companyfe/hello-private.git
244 | # 带版本信息的,必须通过 git 打 tag
245 | npm i -S git+ssh://git@git.your-inc.com/companyfe/hello-private.git#v1.2.0
246 | ```
247 |
248 | 将得到如下依赖
249 |
250 | ```json
251 | {
252 | "name": "helloworld",
253 | "version": "1.0.0",
254 | "description": "",
255 | "main": "index.js",
256 | "scripts": {
257 | "test": "echo \"Error: no test specified\" && exit 1"
258 | },
259 | "dependencies": {
260 | "@companyfe/hello-private": "git+ssh://git@git.your-inc.com/companyfe/hello-private.git#v1.2.0"
261 | },
262 | "author": "kenny wang (http://wangchujiang.com)",
263 | "license": "ISC"
264 | }
265 | ```
266 |
267 | 使用私有模块
268 |
269 | ```js
270 | var hello = require('@companyfe/hello-private');
271 | ```
272 |
273 | ### 优劣势
274 |
275 | 不好的地方是,使用 `npm update` 是无法更新私有模块,想更新只能重新安装一次。好处是不用搭建服务。
276 |
277 | ## 参考资料
278 |
279 | - [Can I run my own private registry?](https://docs.npmjs.com/misc/registry#can-i-run-my-own-private-registry)
--------------------------------------------------------------------------------
/back-end/centOS/安装Java.md:
--------------------------------------------------------------------------------
1 | CentOS7安装JAVA
2 | ---
3 |
4 | ## 卸载老版本
5 |
6 | ```bash
7 | # 更新系统软件
8 | yum update
9 | # 查找系统已安装的jdk组件
10 | rpm -qa | grep -E '^open[jre|jdk]|j[re|dk]'
11 | # 查看java版本
12 | java -version
13 | # 卸载以前已有的jdk
14 | yum remove java-1.6.0-openjdk
15 | yum remove java-1.7.0-openjdk
16 | ```
17 |
18 | ## 安装
19 |
20 | ```
21 | mkdir /usr/java
22 | ```
23 |
24 | 在 [Java SE Downloads](http://www.oracle.com/technetwork/java/javase/downloads/index.html) 页面下载 [JRE](http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html) 版本,这里面有rpm版本,rpm可以通过yum简单安装。这是[linux-x64 Java 7 JRE](http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jre-7u79-linux-x64.rpm)
25 |
26 | ```bash
27 | wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jre-8u121-linux-x64.rpm"
28 | ```
29 |
30 | 下载完成,通过yum本地安装。
31 |
32 | ```bash
33 | sudo yum localinstall jre-8u121-linux-x64.rpm
34 | ```
35 |
36 | 安装完成,查看版本
37 |
38 | ```bash
39 | java -version
40 | # java version "1.8.0_121"
41 | # Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
42 | # Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
43 | ```
44 |
45 |
--------------------------------------------------------------------------------
/back-end/centOS/安装openstack.md:
--------------------------------------------------------------------------------
1 | CentOS7安装OpenStack
2 | ---
3 |
4 |
5 |
6 | - [概念简介](#概念简介)
7 | - [安装](#安装)
8 | - [安装Mitaka](#安装mitaka)
9 | - [卸载](#卸载)
10 | - [登陆Dashboard](#登陆dashboard)
11 | - [错误处理](#错误处理)
12 | - [devstack部署openstack遇到rdo源配置问题及解决办法](#devstack部署openstack遇到rdo源配置问题及解决办法)
13 | - [端口被占用](#端口被占用)
14 | - [日志](#日志)
15 | - [Nova日志](#nova日志)
16 | - [Dashboard日志](#dashboard日志)
17 | - [存储日志](#存储日志)
18 | - [Glance日志](#glance日志)
19 | - [Neutron日志](#neutron日志)
20 | - [改变日志级别](#改变日志级别)
21 | - [设置Nova服务的日志级别](#设置nova服务的日志级别)
22 | - [设置其他OpenStack服务中的日志级别](#设置其他openstack服务中的日志级别)
23 | - [服务管理](#服务管理)
24 | - [重启 Neutron 服务](#重启-neutron-服务)
25 | - [控制节点](#控制节点)
26 | - [网络节点](#网络节点)
27 | - [计算节点](#计算节点)
28 | - [重启cinder服务](#重启cinder服务)
29 | - [存储节点](#存储节点)
30 | - [存储节点](#存储节点-1)
31 | - [重启glance服务](#重启glance服务)
32 | - [重启Swift服务](#重启swift服务)
33 | - [控制节点](#控制节点-1)
34 | - [存储节点](#存储节点-2)
35 | - [重启Nova服务](#重启nova服务)
36 | - [控制节点](#控制节点-2)
37 | - [计算节点](#计算节点-1)
38 | - [参考知识](#参考知识)
39 |
40 |
41 |
42 | ## 概念简介
43 |
44 | **OpenStack**:OpenStack是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,每个服务提供API以进行集成。OpenStack是用Python编程语言编写的。
45 |
46 | **DevStack**:可以自动安装OpenStack的工具。
47 |
48 | **OpenStack核心项目**:OpenStack是由很多核心项目组合在一起的。
49 |
50 | **计算(Compute)**:Nova。一套控制器,用于为单个用户或使用群组管理虚拟机实例的整个生命周期,根据用户需求来提供虚拟服务。负责虚拟机创建、开机、关机、挂起、暂停、调整、迁移、重启、销毁等操作,配置CPU、内存等信息规格。自Austin版本集成到项目中。
51 |
52 | **对象存储(Object Storage)**:Swift。一套用于在大规模可扩展系统中通过内置冗余及高容错机制实现对象存储的系统,允许进行存储或者检索文件。可为Glance提供镜像存储,为Cinder提供卷备份服务。自Austin版本集成到项目中。
53 |
54 | **镜像服务(Image Service)**:Glance。一套虚拟机镜像查找及检索系统,支持多种虚拟机镜像格式(AKI、AMI、ARI、ISO、QCOW2、Raw、VDI、VHD、VMDK),有创建上传镜像、删除镜像、编辑镜像基本信息的功能。自Bexar版本集成到项目中。
55 |
56 | **身份服务(Identity Service)**:Keystone。为OpenStack其他服务提供身份验证、服务规则和服务令牌的功能,管理Domains、Projects、Users、Groups、Roles。自Essex版本集成到项目中。
57 |
58 | **网络&地址管理(Network)**:Neutron。提供云计算的网络虚拟化技术,为OpenStack其他服务提供网络连接服务。为用户提供接口,可以定义Network、Subnet、Router,配置DHCP、DNS、负载均衡、L3服务,网络支持GRE、VLAN。插件架构支持许多主流的网络厂家和技术,如OpenvSwitch。自Folsom版本集成到项目中。
59 |
60 | **块存储(Block Storage)**:Cinder。为运行实例提供稳定的数据块存储服务,它的插件驱动架构有利于块设备的创建和管理,如创建卷、删除卷,在实例上挂载和卸载卷。自Folsom版本集成到项目中。
61 |
62 | **UI 界面(Dashboard)**:Horizon。OpenStack中各种服务的Web管理门户,用于简化用户对服务的操作,例如:启动实例、分配IP地址、配置访问控制等。自Essex版本集成到项目中。
63 |
64 | **pip**:是一个Python包管理工具,主要是用于安装 PyPI 上的软件包,DevStack安装OpenStack的时候会使用到这个工具。
65 |
66 | ## 安装
67 |
68 | ```
69 | wget --no-check-certificate http://rdo.fedorapeople.org/rdo-release.rpm
70 | rpm -ivh rdo-release.rpm
71 |
72 | yum install -y openstack-packstack
73 | yum -y update
74 |
75 | # 接下来一键安装OpenStack,--install-hosts参数需要输入你的IP地址
76 | packstack --install-hosts=your_ip; # 提示输入的时候输入你的密码,等待安装完成即可。
77 | packstack --allinone
78 |
79 | # 输出结果
80 | You will find full trace in log /var/tmp/packstack/20170113-125411-kkk_H3/manifests/192.168.188.127_controller.pp.log
81 | Please check log file /var/tmp/packstack/20170113-125411-kkk_H3/openstack-setup.log for more information
82 | Additional information:
83 | * A new answerfile was created in: /root/packstack-answers-20170113-125412.txt
84 | * Time synchronization installation was skipped. Please note that unsynchronized time on server instances might be problem for some OpenStack components.
85 | * File /root/keystonerc_admin has been created on OpenStack client host 192.168.188.127. To use the command line tools you need to source the file.
86 | * To access the OpenStack Dashboard browse to http://192.168.188.127/dashboard .
87 | Please, find your login credentials stored in the keystonerc_admin in your home directory.
88 | * To use Nagios, browse to http://192.168.188.127/nagios username: nagiosadmin, password: de7af5954a834f89
89 | # reboot 重启机器
90 | ```
91 |
92 | ## 安装Mitaka
93 |
94 | 执行下列命令安装RDO库[RDO官网](https://www.rdoproject.org/install/quickstart/)
95 |
96 | ```
97 | yum install https://rdoproject.org/repos/rdo-release.rpm
98 | yum reinstall -y http://rdo.fedorapeople.org/rdo-release.rpm
99 | ```
100 |
101 | 安装CentOS openstack RPM repository
102 |
103 | ```
104 | yum install centos-release-openstack-mitaka
105 |
106 | # 最新的版本
107 | yum install -y centos-release-openstack-newton
108 | ```
109 |
110 | 更新系统包
111 |
112 | ```
113 | yum update -y
114 | ```
115 |
116 | 安装packstack工具
117 |
118 | ```
119 | yum install -y openstack-packstack
120 | ```
121 |
122 | 安装openstack newton版本
123 |
124 | ```
125 | packstack --allinone
126 | ```
127 |
128 | 执行这一步之后会花费一些时间
129 |
130 | ## 卸载
131 |
132 | ```bash
133 | yum list installed | grep @openstack- | awk '{ print $1 }' | xargs yum -y remove
134 | ```
135 |
136 | ## 登陆Dashboard
137 |
138 | ```bash
139 | cat /root/keystonerc_admin
140 |
141 | export OS_USERNAME=admin
142 | export OS_TENANT_NAME=admin
143 | export OS_PASSWORD=d6433394e15f4175
144 | export OS_AUTH_URL=http://10.1.199.8:35357/v2.0/
145 | export PS1='[\u@\h \W(keystone_admin)]\$ '
146 | ```
147 |
148 | ## 错误处理
149 |
150 | ### devstack部署openstack遇到rdo源配置问题及解决办法
151 |
152 | ```bash
153 | yum install http://rdo.fedorapeople.org/rdo-release.rpm
154 | 无法打开 http://rdo.fedorapeople.org/rdo-release.rpm ,跳过。
155 | 错误:无须任何处理
156 | ```
157 |
158 | 解决办法
159 |
160 | ```bash
161 | wget --no-check-certificate http://rdo.fedorapeople.org/rdo-release.rpm
162 | rpm -ivh rdo-release.rpm
163 | ```
164 |
165 | ### 端口被占用
166 |
167 | ```shell
168 | # 查看到80端口
169 | netstat -lnp|grep 80
170 |
171 | tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 27906/nginx: master
172 | tcp 0 0 0.0.0.0:6080 0.0.0.0:* LISTEN 32437/python2
173 | unix 2 [ ACC ] STREAM LISTENING 21680 2003/master public/flush
174 | unix 2 [ ACC ] STREAM LISTENING 13380 1/systemd /run/lvm/lvmetad.sock
175 | ```
176 |
177 | 杀掉或者停用服务
178 |
179 | ```shell
180 | kill -9 27906
181 | ```
182 |
183 |
184 | ```
185 | warning: /var/cache/yum/x86_64/7/openstack-newton/packages/hiera-1.3.4-5.el7.noarch.rpm: Header V4 RSA/SHA1 Signature, key ID 764429e6: NOKEY2.4 MB 00:00:53 ETA
186 | hiera-1.3.4-5.el7.noarch.rpm 的公钥尚未安装
187 | ```
188 |
189 |
190 | ```
191 | ERROR : Error appeared during Puppet run: 192.168.188.127_controller.pp
192 | Error: Could not prefetch nova_flavor provider 'openstack': Command: 'openstack ["flavor", "list", "--quiet", "--format", "csv", ["--long", "--all"]]' has been running for more than 40 seconds (tried 4, for a total of 170 seconds)
193 | ```
194 |
195 | ## 日志
196 |
197 | OpenStack通过生成大量日志信息来帮助排查系统安装运行期间出现的问题,接下来介绍几个常见服务的相关日志位置。
198 |
199 | ### Nova日志
200 |
201 | OpenStack计算服务日志位于/var/log/nova,默认权限拥有者是nova用户。需要注意的是,并不是每台服务器上都包含所有的日志文件,例如nova-compute.log仅在计算节点生成。
202 |
203 | - nova-compute.log:虚拟机实例在启动和运行中产生的日志
204 | - nova-network.log:关于网络状态、分配、路由和安全组的日志
205 | - nova-manage.log:运行nova-manage命令时产生的日志
206 | - nova-scheduler.log:有关调度的,分配任务给节点以及消息队列的相关日志
207 | - nova-objectstore.log:镜像相关的日志
208 | - nova-api.log:用户与OpenStack交互以及OpenStack组件间交互的消息相关日志
209 | - nova-cert.log:nova-cert过程的相关日志
210 | - nova-console.log:关于nova-console的VNC服务的详细信息
211 | - nova-consoleauth.log:关于nova-console服务的验证细节
212 | - nova-dhcpbridge.log:与dhckbridge服务先关的网络信息
213 |
214 | ### Dashboard日志
215 |
216 | Dashboard是一个DJango的web应用程序,默认运行在Apache服务器上,相应的运行日志也都记录在Apache的日志中,用户可以在`/var/log/apache2/`中查看。
217 |
218 | ### 存储日志
219 |
220 | 对象存储Swift默认日志写到syslog中,在Ubuntu系统中,可以通过/var/log/syslog查看,在其他系统中,可能位于/var/log/messages中。
221 | 块存储Cinder产生的日志默认存放在/var/log/cinder目录中
222 | - cinder-api.log:关于cinder-api服务的细节
223 | - cinder-scheduler.log:关于cinder调度服务的操作的细节
224 | - cinder-volume.log:与cinder卷服务相关的日志项
225 |
226 | Keystone日志
227 |
228 | 身份认证Keystone服务的日志记录在/var/log/keystone/keystone.log中。
229 |
230 | ### Glance日志
231 |
232 | 镜像服务Glance的日志默认存放在/var/log/glance目录中
233 | - api.log:Glance API相关的日志
234 | - registry.log:Glance registry服务相关的日志
235 | 根据日志配置的不同,会保存诸如元信息更新和访问记录这些信息。
236 |
237 | ### Neutron日志
238 |
239 | 网络服务Neutron的日志默认存放在/var/log/neutron目录中
240 | - dhcp-agent.log:关于dhcp-agent的日志
241 | - l3-agent.log:与l3代理及其功能相关的日志
242 | - metadata-agent.log:通过neutron代理给Nova元数据服务的相关日志
243 | - openvswitch-agent.log:与openvswitch相关操作的日志项,在具体实现OpenStack网络时,如果使用了不同的插件,就会有相应的日志文件名
244 | - server.log:与Neutron API服务相关的日志
245 |
246 | ### 改变日志级别
247 |
248 | 每个OpenStack服务的默认日志级别均为警告级(Warning),该级别的日志对于了解运行中系统的状态或者基本的错误定位已经够用,但是有时候需要上调日志级别来帮助诊断问题,或者下调日志级别以减少日志噪声。由于各个服务的日志设置方式类似,因此这里就以Nova服务为例。
249 |
250 | #### 设置Nova服务的日志级别
251 |
252 | ```
253 | vi /etc/nova/logging.conf
254 | ```
255 |
256 | 将列出的服务的日志级别修改为DEBUG、INFO或WARNING
257 |
258 | ```
259 | [logger_root]
260 | level = WARNING
261 | handlers = null
262 |
263 | [logger_nova]
264 | level = INFO
265 | handlers = stderr
266 | qualname = nova
267 | ......
268 | ```
269 |
270 | #### 设置其他OpenStack服务中的日志级别
271 |
272 | 其他服务(如Glance和Keystone)目前都在它们的主配置文件中设置了日志级别颗,例如/etc/glance/glance-api.conf。可以通过修改这些文件中对应设置来将日志级别调整到INFO和DEBUG:
273 |
274 | ```
275 | [DEFAULT]
276 | #set INFO log level output
277 | verbose = False
278 |
279 | #set DEBUG log level output
280 | debug = False
281 | ```
282 |
283 | ## 服务管理
284 |
285 | ```bash
286 | systemctl stop httpd
287 | systemctl start httpd
288 | ```
289 |
290 | ### 重启 Neutron 服务
291 |
292 | #### 控制节点
293 |
294 | ```
295 | service openstack-nova-api restart
296 | service openstack-nova-scheduler restart
297 | service openstack-nova-conductor restart
298 | service neutron-server restart
299 | ```
300 |
301 | #### 网络节点
302 |
303 | ```
304 | service openvswitch restart
305 | service neutron-openvswitch-agent restart(fuel控制节点默认stop)
306 | service neutron-l3-agent restart(fuel控制节点默认stop)
307 | service neutron-dhcp-agent restart(fuel控制节点默认stop)
308 | service neutron-metadata-agent restart(fuel控制节点默认stop)
309 | ```
310 |
311 | #### 计算节点
312 |
313 | ```
314 | service neutron-openvswitch-agent restart
315 | service openvswitch restart
316 | ```
317 |
318 | ### 重启cinder服务
319 |
320 | #### 存储节点
321 |
322 | ```
323 | service openstack-cinder-api restart
324 | service openstack-cinder-scheduler restart
325 | ```
326 |
327 | #### 存储节点
328 |
329 | ```
330 | service openstack-cinder-volume restart
331 | ```
332 |
333 | ### 重启glance服务
334 |
335 | ```
336 | service openstack-glance-api restart
337 | service openstack-glance-registry restart
338 | ```
339 |
340 | ### 重启Swift服务
341 |
342 | #### 控制节点
343 |
344 | ```
345 | service openstack-swift-proxy restart
346 | service memcached restart
347 | ```
348 |
349 | #### 存储节点
350 |
351 | ```
352 | service openstack-swift-account restart
353 | service openstack-swift-account-auditor restart
354 | service openstack-swift-account-reaper restart
355 | service openstack-swift-account-replicator restart
356 | service openstack-swift-container restart
357 | service openstack-swift-container-auditor restart
358 | service openstack-swift-container-replicator restart
359 | service openstack-swift-container-updater restart
360 | service openstack-swift-object restart
361 | service openstack-swift-object-auditor restart
362 | service openstack-swift-object-replicator restart
363 | service openstack-swift-object-updater restart
364 | ```
365 |
366 | ### 重启Nova服务
367 |
368 | #### 控制节点
369 |
370 | ```
371 | service openstack-nova-api restart
372 | service openstack-nova-cert restart
373 | service openstack-nova-consoleauth restart
374 | service openstack-nova-scheduler restart
375 | service openstack-nova-conductor restart
376 | service openstack-nova-novncproxy restart
377 | ```
378 |
379 | #### 计算节点
380 |
381 | ```
382 | service libvirtd restart
383 | service openstack-nova-compute restart
384 | ```
385 |
386 | ## 参考知识
387 |
388 | - [在 CentOS7.2 上安装 OpenStack Liberty 版](http://www.infocool.net/kb/OpenStack/201609/187078.htmldddAA)
389 | - [OpenStack部署都有哪些方式](http://www.trystack.cn/Articles/openstack-deployment.html)
390 | - [Openstack安装部署](http://promisejohn.github.io/2015/05/07/HelloOpenstack/)
391 | - [CentOS 6.4 RDO测试](http://www.chenshake.com/centos-6-4-rdo-test/)
392 | - [Install And Configure OpenStack Mitaka RDO On CentOS 7](http://linuxpitstop.com/openstack-mitaka-rdo-on-centos-7/)
393 | - [OpenStack Havana Dashboard测试和使用](http://www.chenshake.com/openstack-havana-dashboard-to-test-and-use/#i)
394 | - [OpenStack安装视频教程](http://cloudman.cc/)
395 | - [10分钟安装OpenStack](https://www.ustack.com/blog/install-openstack-in-10mins/#OpenStack-3/)
396 | - [cirros镜像下载](http://download.cirros-cloud.net/0.3.4/)
397 | - [制作openstack镜像win7.qcow2(centos/ubuntu/win镜像分享)](http://blog.csdn.net/qq_20154221/article/details/51586537) 镜像密码均为 intel@123
398 |
399 |
400 |
--------------------------------------------------------------------------------
/back-end/centOS/安装pip工具.md:
--------------------------------------------------------------------------------
1 | Centos7安装pip工具
2 | ===
3 |
4 | ## 下载
5 |
6 | ```bash
7 | wget --no-check-certificate https://github.com/pypa/pip/archive/1.5.5.tar.gz
8 | # wget获取https的时候要加上:--no-check-certificate
9 | ```
10 |
11 |
12 | ## 安装解压
13 |
14 | ```bash
15 | tar -zvxf 1.5.5.tar.gz #解压文件
16 | cd pip-1.5.5/
17 | python setup.py install
18 | ```
19 |
--------------------------------------------------------------------------------
/back-end/centOS/安装使用svn.md:
--------------------------------------------------------------------------------
1 | CentOS7安装使用svn
2 | ===
3 |
4 |
5 |
6 | - [安装部署](#安装部署)
7 | - [安装SVN](#安装svn)
8 | - [验证安装](#验证安装)
9 | - [代码库创建](#代码库创建)
10 | - [配置用户](#配置用户)
11 | - [添加用户](#添加用户)
12 | - [配置用户权限](#配置用户权限)
13 | - [svnserve.conf配置](#svnserveconf配置)
14 | - [启动svn](#启动svn)
15 | - [配置防火墙端口](#配置防火墙端口)
16 | - [启动SVN](#启动svn)
17 | - [查看SVN进程](#查看svn进程)
18 | - [检测SVN 端口](#检测svn-端口)
19 | - [停止重启SVN](#停止重启svn)
20 | - [简单SVN命令](#简单svn命令)
21 | - [下载克隆项目](#下载克隆项目)
22 | - [添加](#添加)
23 | - [删除](#删除)
24 | - [提交修改](#提交修改)
25 | - [查看状态](#查看状态)
26 | - [查看日志](#查看日志)
27 | - [更新](#更新)
28 | - [锁定](#锁定)
29 | - [比较差异](#比较差异)
30 | - [分支](#分支)
31 | - [解决冲突](#解决冲突)
32 | - [帮助](#帮助)
33 |
34 |
35 |
36 | ## 安装部署
37 |
38 | ### 安装SVN
39 |
40 | ```bash
41 | yum install httpd subversion mod_dav_svn
42 | rpm -ql subvserion # 查看 subversion 安装位置
43 | ```
44 |
45 | OK 这样就完成了安装。下面是SVN的配置:
46 |
47 |
48 | ### 验证安装
49 |
50 | ```bash
51 | svnserve --version
52 |
53 | # svnserve,版本 1.7.14 (r1542130)
54 | # 编译于 Aug 23 2017,20:43:38
55 | #
56 | # 版权所有 (C) 2013 Apache 软件基金会。
57 | # 此软件包含了许多人的贡献,请查看文件 NOTICE 以获得更多信息。
58 | # Subversion 是开放源代码软件,请参阅 http://subversion.apache.org/ 站点。
59 | #
60 | # 下列版本库后端(FS) 模块可用:
61 | #
62 | # * fs_base : 模块只能操作BDB版本库。
63 | # * fs_fs : 模块与文本文件(FSFS)版本库一起工作。
64 | #
65 | # Cyrus SASL 认证可用。
66 | ```
67 |
68 | ## 代码库创建
69 |
70 | SVN软件安装完成后还需要建立SVN库
71 |
72 | ```bash
73 | mkdir -p /opt/svn/repo
74 | svnadmin create /opt/svn/repo
75 | ```
76 |
77 | 执行上面的命令后,自动建立`repo`库,查看`/opt/svn/repo` 文件夹发现包含了conf, db,format,hooks, locks, README.txt等文件,说明一个SVN库已经建立。
78 |
79 |
80 | ## 配置用户
81 |
82 | 在`/source/svn/【项目文件】/conf`目录下有三个文件:
83 |
84 | - `passwd` : 里面保存用户信息,基本格式为:user = passwd
85 | - `authz` : 里面保存用户的分组信息,以及每个组的访问权限
86 | - `svnserve.conf` : 里面保存服务器的基本配置(下面介绍)
87 |
88 |
89 | ### 添加用户
90 |
91 | 在 `passwd` 文件中添加用户。
92 |
93 | ```bash
94 | [users]
95 | harry = harry123
96 | sally = sally123
97 | wcj = wcj123
98 | ```
99 |
100 | ### 配置用户权限
101 |
102 | 在 `authz` 文件中配置用户权限。
103 |
104 | ```bash
105 | [groups]
106 | admin = harry,sally
107 |
108 | # 该项目的权限配置
109 | [/]
110 | @admin=rw # admin分组配置读写权限(实际中可以增加只读分组)
111 |
112 | wcj=rw # wcj # 用户的权限为读写
113 | * = r # 其他用户的权限为只读
114 | ```
115 |
116 | ### svnserve.conf配置
117 |
118 | ```bash
119 | [general]
120 | # 匿名用户权限(none:拒绝, write:读写, read:只读权限)
121 | anon-access = none
122 | auth-access = write
123 |
124 | authz-db = authz
125 |
126 | # 这个配置我给删除了,多数教程填写工程 /opt/svn/repo 目录
127 | # 我测试没有什么卵用
128 | # realm = My First Repository
129 | ```
130 |
131 | ## 启动svn
132 |
133 | ### 配置防火墙端口
134 |
135 | ```bash
136 | vi /etc/sysconfig/iptables
137 | # 添加以下内容:
138 | -A INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT
139 |
140 | # 或者下面方式
141 | # 开启3690端口的命令,在终端输入以下命令:
142 | iptables -I INPUT -i eth0 -p tcp --dport 3690 -j ACCEPT
143 | iptables -I OUTPUT -o eth0 -p tcp --sport 3690 -j ACCEPT
144 | # 保存后重启防火墙
145 | service iptables save
146 | service iptables restart
147 | ```
148 |
149 | ### 启动SVN
150 |
151 | > 注意,创建的工程`repo` 启动指定目录为`/opt/svn` 而不是 ~`/opt/svn/repo`~
152 | > 这里是非常深的坑哦。
153 |
154 | ```bash
155 | svnserve -d -r /opt/svn
156 | ```
157 |
158 | ### 启动报警告
159 |
160 | ```bash
161 | svnserve -d -r /opt/svn
162 | svnserve: warning: cannot set LC_CTYPE locale
163 | svnserve: warning: environment variable LC_CTYPE is UTF-8
164 | svnserve: warning: please check that your locale name is correct
165 | ```
166 |
167 | 解决方法
168 |
169 | ```bash
170 | echo "export LC_ALL=C" >> /etc/profile
171 | ```
172 |
173 | ### 查看SVN进程
174 |
175 | ```bash
176 | ps -ef|grep svn|grep -v grep
177 | # root 24394 1 0 23:32 ? 00:00:00 svnserve -d -r /opt/svn
178 | ```
179 |
180 | ### 检测SVN 端口
181 |
182 | ```bash
183 | netstat -ln |grep 3690
184 | tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN
185 | ```
186 |
187 | ### 停止重启SVN
188 |
189 |
190 | ```bash
191 | killall svnserve # 停止
192 | svnserve -d -r /opt/svn # 启动
193 | ```
194 |
195 |
196 | ## 简单SVN命令
197 |
198 |
199 | ### 下载克隆项目
200 |
201 | ```bash
202 | # 下载项目
203 | svn checkout 'url'
204 | # 简写
205 | svn co 'url'
206 | # 实例
207 | svn checkout path(path是服务器上的目录)
208 | svn checkout svn://192.168.1.1/pro/domain
209 | ```
210 |
211 |
212 | ### 添加
213 |
214 | ```bash
215 | # 添加指定文件或目录
216 | svn add 'file'或'dir'
217 |
218 | # 添加所有目录文件
219 | svn add *
220 |
221 | # 创建纳入版本目录
222 | svn mkdir -m 'commit message' 'url/dir'
223 | ```
224 |
225 | ### 删除
226 |
227 | ```bash
228 | 删除指定文件
229 | svn delete 'file'
230 | 推荐组合
231 | svn delete 'file name'
232 | svn commit -m 'delete file name'
233 | ```
234 |
235 | ### 提交修改
236 |
237 | ```bash
238 | # 提交指定文件
239 | svn commit -m 'commit message' 'file'
240 |
241 | # 提交所有文件
242 | svn commit -m 'commit message'
243 | # 简写
244 | svn ci -m
245 | ```
246 |
247 |
248 | ### 查看状态
249 |
250 | ```bash
251 | # 查看文件或目录状态
252 | svn status 'file'或'dir'
253 | # 简写
254 | svn st 'file'或'dir'
255 | ```
256 |
257 | 正常状态不显示
258 |
259 | > ?:不在svn的控制中
260 | > M:内容被修改
261 | > C:发生冲突
262 | > A:预定加入到版本库
263 | > K:被锁定
264 |
265 | ### 查看日志
266 |
267 | ```bash
268 | # 看指定文件日志
269 | svn log 'file'
270 |
271 | # 查看指定文件详细信息
272 | svn info 'file'
273 |
274 | # 查看指定目录文件列表
275 | svn list 'dir'
276 | ```
277 |
278 |
279 | ### 更新
280 |
281 | ```bash
282 | # 更新指定文件
283 | svn update 'file'
284 |
285 | # 更新所有文件
286 | svn update
287 | ```
288 |
289 | ### 锁定
290 |
291 | ```bash
292 | # 加锁指定文件
293 | svn lock -m 'commit message' 'file'
294 |
295 | # 解锁指定文件
296 | svn unlock 'file'
297 | ```
298 |
299 | ### 比较差异
300 |
301 | ```bash
302 | 比较指定文件差异
303 | svn diff 'file'
304 |
305 | 对指定文件的版本1和版本2比较差异
306 | svn diff -r version1:version2 'file'
307 | ```
308 |
309 | ### 分支
310 |
311 | ```bash
312 | 从分支A新建出一个分支B
313 | svn copy branchA branchB -m 'commit message'
314 | ```
315 |
316 | ### 解决冲突
317 |
318 | ```bash
319 | svn resolved
320 | # 产生冲突是,会生成三个新的文件,
321 | # svn resolved除了删除冲突文件,
322 | # 还修正了一些记录在工作拷贝管理区域的记录数据
323 | ```
324 |
325 | ### 帮助
326 |
327 | ```bash
328 | svn help
329 | ```
330 |
--------------------------------------------------------------------------------
/back-end/centOS/尝试在CentOS7.2上编译安装Swift.md:
--------------------------------------------------------------------------------
1 | 尝试在CentOS7.2上编译安装Swift
2 | ---
3 |
4 | 苹果提供 [Ubuntu上构建Swift](https://github.com/apple/swift/blob/master/README.md) 的教程,通过这个教程我尝试使用`CentOS7.2`上玩儿一把。目前已经成功在CentOS7.2上班成功安装 `swift 4.0`
5 |
6 | ```bash
7 | swift --version
8 | Swift version 4.0-dev
9 | Target: x86_64-unknown-linux-gnu
10 | ```
11 |
12 |
13 |
14 | - [安装依赖](#安装依赖)
15 | - [下载Swift的源代码](#下载swift的源代码)
16 | - [编译安装ninja](#编译安装ninja)
17 | - [编译Swift编译器](#编译swift编译器)
18 | - [HellWorld](#hellworld)
19 | - [Web框架](#web框架)
20 |
21 |
22 |
23 | ## 安装依赖
24 |
25 | ```bash
26 | yum install -y git clang gcc-c++ uuid-devel libicu-devel icu libedit-devel libxml2-devel sqlite-devel swig python-devel ncurses-libs ncurses-devel pkgconfig libuuid-devel epel-release libbsd-devel
27 | ```
28 |
29 | 更新CMake
30 |
31 | 对 `CMake 3.4.3` 版本有要求,必须比 `CMake 3.4.3` 高。[CMake官网](https://cmake.org/download/)
32 |
33 | ```bash
34 | # 下载
35 | wget https://cmake.org/files/v3.9/cmake-3.9.0.tar.gz
36 | # 解压
37 | tar -zxvf cmake-3.9.0.tar.gz
38 | cd cmake-3.9.0
39 | ./bootstrap --prefix=/usr
40 | make
41 | sudo make install
42 | ```
43 |
44 | ## 下载Swift的源代码
45 |
46 | 打开 https://swift.org/source-code/#cloned-repositories 找到 `Cloned Repositories` 创建 `mkdir -p /usr/local/swift && cd /usr/local/swift` 目录并进入`swift`
47 |
48 | ```bash
49 | # 下载 swift-llvm
50 | wget https://github.com/apple/swift-llvm/archive/swift-DEVELOPMENT-SNAPSHOT-2017-07-29-a.tar.gz -P llvm
51 | tar -zxvf swift-DEVELOPMENT-SNAPSHOT-2017-07-29-a.tar.gz -C src/llvm
52 | # 下载 swift-clang
53 | wget https://github.com/apple/swift-clang/archive/swift-DEVELOPMENT-SNAPSHOT-2017-07-29-a.tar.gz -P clang
54 | # 下载 swift-lldb
55 | wget https://github.com/apple/swift-lldb/archive/swift-DEVELOPMENT-SNAPSHOT-2017-07-29-a.tar.gz -P lldb
56 | # 下载 swift-cmark
57 | wget https://github.com/apple/swift-cmark/archive/swift-DEVELOPMENT-SNAPSHOT-2017-07-29-a.tar.gz -P cmark
58 | # 下载 swift
59 | wget https://github.com/apple/swift/archive/swift-DEVELOPMENT-SNAPSHOT-2017-07-29-a.tar.gz -P swift
60 | # 下载 ninja
61 | wget https://github.com/ninja-build/ninja/archive/v1.7.2.tar.gz -P ninja
62 | ```
63 |
64 | 上面采用 开发板编译花了三个小时,后面用 released 版本编译,警告少了许多,而且编译快了相当多呢,所以你需要选择一个稳定的 released 版本安装。
65 |
66 | ```bash
67 | wget https://github.com/ninja-build/ninja/archive/v1.7.2.tar.gz -P ninja
68 | wget https://github.com/apple/swift/archive/swift-DEVELOPMENT-SNAPSHOT-2017-07-29-a.tar.gz -P swift
69 | wget https://github.com/apple/swift-cmark/archive/swift-DEVELOPMENT-SNAPSHOT-2017-07-29-a.tar.gz -P cmark
70 | wget https://github.com/apple/swift-lldb/archive/swift-DEVELOPMENT-SNAPSHOT-2017-07-29-a.tar.gz -P lldb
71 | wget https://github.com/apple/swift-clang/archive/swift-DEVELOPMENT-SNAPSHOT-2017-07-29-a.tar.gz -P clang
72 | wget https://github.com/apple/swift-llvm/archive/swift-DEVELOPMENT-SNAPSHOT-2017-07-29-a.tar.gz -P llvm
73 |
74 | wget https://github.com/apple/swift-corelibs-libdispatch/archive/swift-DEVELOPMENT-SNAPSHOT-2017-07-30-a.tar.gz -P swift-corelibs-libdispatch
75 | ```
76 |
77 | 安装之后的目录结构
78 |
79 | ```bash
80 | swift/
81 | └── src
82 | ├── clang
83 | ├── cmark
84 | ├── lldb
85 | ├── llvm
86 | ├── ninja
87 | ├── swift-corelibs-libdispatch
88 | └── swift
89 | ```
90 |
91 | ## 编译安装ninja
92 |
93 | ```bash
94 | yum install re2c -y # re2c 是一个用于编写快速灵活的词法分析器的工具
95 | ```
96 |
97 | 编译
98 |
99 | ```bash
100 | ./configure.py --bootstrap
101 | cp ninja /usr/local/bin/
102 | ```
103 |
104 |
105 | ## 编译Swift编译器
106 |
107 | 在文件 `vi /etc/profile` 添加下面代码,添加完成之后,`source /etc/profile` 更改立即生效。
108 |
109 | ```bash
110 | export SWIFT_SOURCE_ROOT=/usr/local/swift/src
111 | ```
112 |
113 | 进入`cd /usr/local/swift/src/swift/utils/` 目录,运行脚本
114 |
115 | ```bash
116 | # ./build-script -R
117 | # 上面命令会报错,建议使用下面命令
118 | # https://github.com/apple/swift/pull/3594#issuecomment-234169759
119 |
120 | ./build-script --libdispatch
121 | ./build-script --libdispatch --extra-cmake-options="-DSWIFT_BUILD_SOURCEKIT:BOOL=TRUE"
122 | ```
123 |
124 | `swap`区不够大的原因。导致`clang++ kernel opps`
125 |
126 | ```bash
127 | clang: error: unable to execute command: Killed
128 | clang: error: linker command failed due to signal (use -v to see invocation)
129 | ```
130 |
131 | 请加大分区:
132 |
133 | ```bash
134 | sudo fallocate -l 4G /swapfile
135 | sudo chmod 600 /swapfile
136 | sudo mkswap /swapfile
137 | sudo swapon /swapfile
138 | ```
139 |
140 | 开机自动挂载swap:
141 | 使用 vi 或 nano 在 /etc/fstab 文件底部添加如下内容:
142 |
143 | ```bash
144 | /swapfile none swap sw 0 0
145 | ```
146 |
147 | **libatomic不存在**
148 |
149 | ```bash
150 | # 错误
151 | /usr/bin/ld: cannot find /usr/lib64/libatomic.so.1.0.0
152 | ```
153 |
154 | 解决办法,[building swift on centos](https://stackoverflow.com/questions/34234250/building-swift-on-centos)。
155 |
156 | ```bash
157 | # 下载
158 | # 这里https://pkgs.org/download/libatomic找对应的rpm下载地址
159 | wget --no-check-certificate -O /etc/yum.repos.d/libatomic-4.8.5-11.el7.x86_64.rpm ftp://ftp.pbone.net/mirror/ftp.centos.org/7.3.1611/os/x86_64/Packages/libatomic-4.8.5-11.el7.x86_64.rpm
160 |
161 | # 安装
162 | rpm -ivh libatomic-4.8.5-11.el7.x86_64.rpm
163 | ```
164 |
165 | 编译完成,设置环境信息 `vi ~/.bash_profile`
166 |
167 | ```bash
168 | PATH=$PATH:/usr/local/swift/src/build/Ninja-ReleaseAssert/swift-linux-x86_64/bin
169 | ```
170 |
171 | 立即生效`source ~/.bash_profile`
172 |
173 | ## HellWorld
174 |
175 | 添加 `touch ~/HelloWorld.swift` 文件,添加下面代码测试
176 |
177 | ```swift
178 | print("Hello world!")
179 | ```
180 |
181 | 编译 `swift` 文件
182 |
183 | ```bash
184 | swiftc ~/HelloWorld.swift -o ~/Hello
185 | ```
186 |
187 | 运行 ` ~/Hello` 输出 `Hello world!`
188 |
189 | 大功告成!
190 |
191 | ## Web框架
192 |
193 | - [Vapor](https://github.com/vapor/vapor)
194 | - [Perfect](https://github.com/PerfectlySoft/Perfect)
195 | - [Kitura](https://github.com/IBM-Swift/Kitura)
196 | - [Zewo](https://github.com/Zewo/Zewo)
--------------------------------------------------------------------------------
/back-end/centOS/常用基础命令.md:
--------------------------------------------------------------------------------
1 | # 其它命令
2 |
3 | `sudo chmod 755 -R node` 修改目录权限
4 | `sudo lsof -nP -iTCP -sTCP:LISTEN` 查看本地服务
5 | `ps -ef | grep websocket` 查看websocket进程
6 | `ps aux | grep mysql` 查看mysql进程
7 | `sudo kill 443` 杀掉进程
8 |
9 |
10 | # 给目录权限
11 |
12 | `sudo chmod -R 777 目录`
13 |
14 | # 搜索
15 |
16 | `find path -option [-print] [-exec -ok command] { }\;`
17 |
18 | - pathname: find命令所查找的目录路径。例如用`.`来表示当前目录,用`/`来表示系统根目录。
19 | - `-print`: find命令将匹配的文件输出到标准输出。
20 | - `-exec`: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为`'command' { } \;`,注意`{ }`和`\;`之间的空格。
21 | - `-ok`: 和`-exec`的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
22 |
23 | ```bash
24 | $ find ~ -name "*.txt" -print #在$HOME中查.txt文件并显示
25 | $ find . -name "*.txt" -print
26 | $ find . -name "[A-Z]*" -print #查以大写字母开头的文件
27 | $ find /etc -name "host*" -print #查以host开头的文件
28 | # 查以两个小写字母和两个数字开头的txt文件
29 | $ find . -name "[a-z][a-z][0–9][0–9].txt" -print
30 | $ ind . -perm 755 -print
31 | $ ind . -perm -007 -exec ls -l {} \; #查所有用户都可读写执行的文件同-perm 777
32 | $ ind . -type d -print
33 | $ ind . ! -type d -print
34 | $ ind . -type l -print
35 | ```
36 |
37 | # ls
38 |
39 | > 类似于dos下的dir命令
40 |
41 | ls最常用的参数有三个: -a -l -F。
42 |
43 | ls –a
44 |
45 | Linux上的文件以.开头的文件被系统视为隐藏文件,仅用ls命令是看不到他们的,而用ls -
46 | a除了显示一般文件名外,连隐藏文件也会显示出来。
47 | ls –l
48 | 该参数显示更详细的文件信息。
49 | ls –F
50 | 使用这个参数表示在文件的后面多添加表示文件类型的符号,例如*表示可执行,/表示目录,@表示连结文件,这都是因为使用了-F这个参数。但是现在基本上所有的Linux发行版本的ls都已经内建了-F参数,也就是说,不用输入这个参数,我们也能看到各种分辨符号。
51 |
52 | # cd
53 |
54 | > 用于切换用户当前工作目录
55 |
56 | cd aaa 进入aaa目录
57 | cd 命令后不指定目录,会切换到当前用户的home 目录
58 | cd ~ 作用同cd后不指定目录,切换到当前用户的home 目录
59 | cd - 命令后跟一个减号,则会退回到切换前的目录
60 | cd .. 返回到当前目录下的上一级目录
61 |
62 | # pwd
63 |
64 | > 用于显示用户当前工作目录
65 |
66 | # mkdir 和 rmdir
67 |
68 | > midir:创建目录 / rmdir:删除目录
69 |
70 | 两个命令都支持-p参数,对于mkdir命令若指定路径的父目录不存在则一并创建,对于rmdir命令则删除指定路径的所有层次目录,如果文件夹里有内容,则不能用rmdir命令
71 |
72 | 如下:
73 |
74 | ```bash
75 | mkdir -p 1/2/3
76 | rmdir -p 1/2/3
77 | ```
78 |
79 | ## mkdir循环创建目录
80 |
81 | [How do I make multiple directories at once in a directory?](http://unix.stackexchange.com/questions/636/how-do-i-make-multiple-directories-at-once-in-a-directory)
82 |
83 | ```bash
84 | for char in {A..Z}; do
85 | mkdir $char
86 | done
87 |
88 | for num in {1..100}; do
89 | mkdir $num
90 | done
91 | ```
92 |
93 | # cp
94 | > 复制命令
95 |
96 | - 复制一个文件到另一目录:`cp 1.txt ../test2`
97 | - 复制一个文件到本目录并改名:`cp 1.txt 2.txt`
98 | - 复制一个文件夹a并改名为b,-r或-R 选项表明递归操作:`cp -r a b`
99 | - 同时拷贝多个文件,我们只需要将多个文件用空格隔开。`cp file_1.txt file_2.txt file_3.txt /home/pungki/office`
100 |
101 | # mv
102 |
103 | > 移动命令
104 |
105 | 将一个文件移动到另一个目录:mv 1.txt ../test1
106 | 将一个文件在本目录改名:mv 1.txt 2.txt
107 | 将一个文件一定到另一个目录并改名:mv 1.txt ../test1/2.txt
108 |
109 | # rm命令
110 |
111 | > 命令用于删除文件,与dos下的del/erase命令相似,rm命令常用的参数有三个:-i,-r,-f。
112 |
113 | 1. –i :系统在删除文件之前会先询问确认,用户回车之后,文件才会真的被删除。需要注意,linux下删除的文件是不能恢复的,删除之前一定要谨慎确认。
114 | 2. –r:该参数支持目录删除,功能和rmdir命令相似。
115 | 3. –f:和-i参数相反,-f表示强制删除
116 |
117 | # find
118 |
119 | > find 查找目录和文件
120 |
121 | ```bash
122 | -name filename #查找名为filename的文件
123 | -perm #按执行权限来查找
124 | -user username #按文件属主来查找
125 | -group groupname #按组来查找
126 | -mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
127 | -atime -n +n #按文件访问时间来查GIN: 0px">
128 |
129 | -ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
130 |
131 | -nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
132 | -nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
133 | -newer f1 !f2 #找文件,-n指n天以内,+n指n天以前
134 | -ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
135 | -nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
136 | -nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
137 | -newer f1 !f2 #查更改时间比f1新但比f2旧的文件
138 | -type b/d/c/p #查是块设备、目录、字符设备、管道、符号链接、普通文件
139 | -size n[c] #查长度为n块[或n字节]的文件
140 | -depth #使查找在进入子目录前先行查找完本目录
141 | -fstype #查更改时间比f1新但比f2旧的文件
142 | -type b/d/c/p #查是块设备、目录、字符设备、管道、符号链接、普通文件
143 | -size n[c] #查长度为n块[或n字节]的文件
144 | -depth #使查找在进入子目录前先行查找完本目录
145 | -fstype #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
146 | -mount #查文件时不跨越文件系统mount点
147 | -follow #如果遇到符号链接文件,就跟踪链接所指的文件
148 | -cpio %; #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
149 | -mount #查文件时不跨越文件系统mount点
150 | -follow #如果遇到符号链接文件,就跟踪链接所指的文件
151 | -cpio #对匹配的文件使用cpio命令,将他们备份到磁带设备中
152 | -prune #忽略某个目录
153 | ```
154 |
155 | 例子:
156 | - ~ 代表的是$home目录,
157 |
158 | ```bash
159 | $ find . -name '*.DS_Store' -type f -delete # 删除所有.DS_Store文件
160 | $ find ~ -name "*.txt" -print # 在$HOME中查.txt文件并显示
161 | $ find . -size +1000000c -print # 查长度大于1Mb的文件
162 | $ find . -size 100c -print # 查长度为100c的文件
163 | $ find . -size +10 -print # 查长度超过期作废10块的文件(1块=512字节)
164 | $ find -name april* # 在当前目录下查找以april开始的文件
165 | $ find -name april* fprint file # 在当前目录下查找以april开始的文件,并把结果输出到file中
166 | $ find -name ap* -o -name may* # 查找以ap或may开头的文件
167 | $ find /mnt -name tom.txt -ftype vfat # 在/mnt下查找名称为tom.txt且文件系统类型为vfat的文件
168 | $ find /mnt -name t.txt ! -ftype vfat # 在/mnt下查找名称为tom.txt且文件系统类型不为vfat的文件
169 | $ find /tmp -name wa* -type l # 在/tmp下查找名为wa开头且类型为符号链接的文件
170 | $ find ~ -mtime -2 # 在/home下查最近两天内改动过的文件
171 | $ find ~ -atime -1 # 查1天之内被存取过的文件
172 | $ find ~ -mmin +60 # 在/home下查60分钟前改动过的文件
173 | $ find ~ -amin +30 # 查最近30分钟前被存取过的文件
174 | $ find ~ -newer tmp.txt # 在/home下查更新时间比tmp.txt近的文件或目录
175 | $ find ~ -anewer tmp.txt # 在/home下查存取时间比tmp.txt近的文件或目录
176 | $ find ~ -used -2 # 列出文件或目录被改动过之后,在2日内被存取过的文件或目录
177 | $ find ~ -user cnscn # 列出/home目录内属于用户cnscn的文件或目录
178 | $ find ~ -uid +501 # 列出/home目录内用户的识别码大于501的文件或目录
179 | $ find ~ -group cnscn # 列出/home内组为cnscn的文件或目录
180 | $ find ~ -gid 501 # 列出/home内组id为501的文件或目录
181 | $ find ~ -nouser # 列出/home内不属于本地用户的文件或目录
182 | $ find ~ -nogroup # 列出/home内不属于本地组的文件或目录
183 | $ find ~ -name tmp.txt -maxdepth 4 # 列出/home内的tmp.txt 查时深度最多为3层
184 | $ find ~ -name tmp.txt -mindepth 3 # 从第2层开始查
185 | $ find ~ -empty # 查找大小为0的文件或空目录
186 | $ find ~ -size +512k # 查大于512k的文件
187 | $ find ~ -size -512k # 查小于512k的文件
188 | $ find ~ -links +2 # 查硬连接数大于2的文件或目录
189 | $ find ~ -perm 0700 # 查权限为700的文件或目录
190 | $ find ~ -perm 755 -print | more # 查找权限为755的文件
191 | $ find /tmp -name tmp.txt -exec cat {} \;
192 | $ find /tmp -name tmp.txt ok rm {} \;
193 |
194 | $ find / -amin -10 # 查找在系统中最后10分钟访问的文件
195 | $ find / -atime -2 # 查找在系统中最后48小时访问的文件
196 | $ find / -empty # 查找在系统中为空的文件或者文件夹
197 | $ find / -group cat # 查找在系统中属于 groupcat的文件
198 | $ find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件
199 | $ find / -mtime -1 # 查找在系统中最后24小时里修改过的文件
200 | $ find / -nouser # 查找在系统中属于作废用户的文件
201 | $ find / -user fred # 查找在系统中属于FRED这个用户的文件
202 | ```
203 |
204 | # du、df命令
205 |
206 | > du命令可以显示目前的目录所占用的磁盘空间,df命令可以显示目前磁盘剩余空间。
207 |
208 | 如果du命令不加任何参数,那么返回的是整个磁盘的使用情况,如果后面加了目录的话,就是这个目录在磁盘上的使用情况。
209 | 1. `du -hs` 指定目录 查看指定目录的总大小
210 | 2. `du -hs ./*` 查看当前目录下的所有文件夹和文件的大小
211 |
212 | 这两个命令都支持-k,-m和-h参数,-k和-m类似,都表示显示单位,一个是k字节一个是兆字节,-h则表示human-readable,即友好可读的显示方式。
213 |
214 | # cat命令
215 |
216 | > cat命令的功能是显示或连结一般的ascii文本文件。cat是concatenate的简写,类似于dos下面的type命令。用法如下:
217 |
218 | 1. `cat file1` 显示file1文件内容
219 | 2. `cat file1 file2` 依次显示file1,file2的内容
220 | 3. `cat file1 file2 > file3` 把file1, file2的内容结合起来,再“重定向(>)”到file3文件中。
221 | 4. `>`是右重定向符,表示将左边命令结果当成右边命令的输入,注意:如果右侧文件是一个已存在文件,其原有内容将会被清空,而变成左侧命令输出内容。如果希望以追加方式写入,请改用">>"重定向符。
222 |
223 | 如果">"左边没有指定文件,如: cat >file1,将会等用户输入,输入完毕后再按[Ctrl]+[c]或[Ctrl]+[d],就会将用户的输入内容写入file1。
224 |
225 | # echo命令
226 |
227 | > echo命令的使用频率不少于ls和cat,尤其是在shell脚本编写中。
228 | > 语法:echo [-ne][字符串]
229 | > 功能:echo会将输入的字符串送往标准输出,输出的字符串间以空白字符隔开, 并在最后加上换行符。
230 |
231 | 参数:
232 | - `-n` 显示字串时在最后自动换行
233 | - `-e` 支持以下格式的转义字符, -E 不支持以下格式的转义字符
234 | - `/a` 发出警告声;
235 | - `/b` 删除前一个字符;
236 | - `/c` 最后不加上换行符号;
237 | - `/f` 换行但光标仍旧停留在原来的位置;
238 | - `/n` 换行且光标移至行首;
239 | - `/r` 光标移至行首,但不换行;
240 | - `/t` 插入tab;
241 | - `/v` 与/f相同;
242 | - `//` 插入/字符;
243 | - `/nnn` 插入nnn(八进制)所代表的ASCII字符;
244 |
245 | 示例:
246 |
247 | ```bash
248 | kenny@jstest:~/hgd> echo "123" "456"
249 | 123 456
250 | kenny@jstest:~/hgd> echo "123/n456"
251 | 123/n456
252 | kenny@jstest:~/hgd> echo -e "123/n456"
253 | 123
254 | 456
255 | kenny@jstest:~/hgd> echo -E "123/n456"
256 | 123/n456
257 | kenny@jstest:~/hgd> echo -E "123///456"
258 | 123//456
259 | kenny@jstest:~/hgd> echo -e "123///456"
260 | 123/456
261 | kenny@jstest:~/hgd> echo -e "123/100456"
262 | 123@456
263 | ```
264 |
265 | 注意事项:
266 | 在Linux使用的bash下,单引号’’和双引号是有区别的,单引号忽略所有的转义,双引号不会忽略以下特殊字符:
267 | Dollar signs ($),Back quotes (`),Backslashes (/),Excalmatory mark(!)
268 |
269 | 示例如下:
270 |
271 | ```
272 | kenny@jstest:~> echo "`TEST`"
273 | -bash: TEST: command not found
274 | kenny@jstest:~> echo '`TEST`'
275 | `TEST`
276 | kenny@jstest:~> echo "$TEST"
277 |
278 | kenny@jstest:~> echo '$TEST'
279 | $TEST
280 | kenny@jstest:~> echo "//TEST"
281 | /TEST
282 | kenny@jstest:~> echo '//TEST'
283 | //TEST
284 | kenny@jstest:~> echo "Hello!"
285 | echo "Hello"
286 | Hello
287 | kenny@jstest:~> echo 'Hello!'
288 | Hello!
289 | ```
290 |
291 | # more,less,clear
292 |
293 | > more,less命令
294 |
295 | ```
296 | 这两个命令用于查看文件,如果一个文件太长,显示内容超出一个屏幕,用cat命令只能看到最后的内容,用more和less两个命令可以分页查看。more指令可以使超过一页的文件内容分页暂停显示,用户按键后才继续显示下一页。而less除了有more的功能以外,还可以用方向键往上或往下的滚动文件,更方便浏览阅读。
297 | ```
298 |
299 | less的常用动作命令:
300 | - 回车键 向下移动一行;
301 | - `y` 向上移动一行;
302 | - 空格键 向下滚动一屏;
303 | - `b` 向上滚动一屏;
304 | - `d` 向下滚动半屏;
305 | - `h` less的帮助;
306 | - `u` 向上洋动半屏;
307 | - `w` 可以指定显示哪行开始显示,是从指定数字的下一行显示;比如指定的是6,那就从第7行显示;
308 | - `g` 跳到第一行;
309 | - `G` 跳到最后一行;
310 | - `p n%` 跳到n%,比如 10%,也就是说比整个文件内容的10%处开始显示;
311 | - `/pattern` 搜索pattern ,比如 /MAIL表示在文件中搜索MAIL单词;
312 | - `v` 调用vi编辑器;
313 | - `q` 退出less
314 | - `!command` 调用SHELL,可以运行命令;比如!ls 显示当前列当前目录下的所有文件;
315 | - `clear`命令 clear命令是用来清除当前屏幕显示的,不需任何参数,和dos下的cls命令功能相同。
316 |
317 | # head,tail
318 |
319 | - head和tail命令都用于查看文本文件,区别在于: head显示文件的头n行,tail显示文件的尾n行,缺省情况n都为10行。可以通过-n方式指定行数,如:head -100 file和tail -100 file分别表示显示文件头100行和尾100行内容。
320 | - tail -f命令可以实时查看文件新增内容。
321 |
322 | # wc命令
323 |
324 | 该命令用于统计指定文件中的字节数、字数、行数。该命令各选项含义如下:
325 |
326 | - -l 统计行数
327 | - -w 统计字数
328 | - -c 统计字节数
329 |
330 | 这些选项可以组合使用。输出列的顺序和数目不受选项的顺序和数目的影响。总是按下述顺序显示并且每项最多一列。
331 | 行数、字数、字节数、文件名
332 | 如果命令行中没有文件名,则输出中不出现文件名。
333 |
334 | 例如:
335 |
336 | ```bash
337 | oracle@hjtest:~> wc 1.txt 2.txt
338 | 460 1679 16353 1.txt
339 | 300 1095 10665 2.txt
340 | 760 2774 27018 总用量
341 | oracle@hjtest:~> wc -l 1.txt
342 | 460 1.txt
343 | ```
344 |
345 | 缺省参数为-lcw,即wc file1 file2命令的执行结果与上面一样。
346 |
347 | # grep 命令
348 |
349 | > grep是(global search regular expression(RE) and print out the line的缩写,用于从文件面搜索包含指定模式的行并打印出来,它是一种强大的文本搜索工具,支持使用正则表达式搜索文本。grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被””引用,模板后的所有字符串被看作文件名。搜索结果送到屏幕,不影响原文件内容。
350 |
351 | grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
352 | 示例:
353 | ```
354 | $ ls -l | grep '^a'
355 | 通过管道过滤ls -l输出的内容,只显示以a开头的行。
356 | $ grep 'test' d*
357 | 显示所有以d开头的文件中包含test的行。
358 | $ grep 'test' aa bb cc
359 | 显示在aa,bb,cc文件中匹配test的行。
360 | $ grep '[a-z]/{5/}' aa
361 | 显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
362 | $ grep 'w/(es/)t.*/1' aa
363 | 如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(/1),找到就显示该行。如果用egrep或grep -E,就不用"/"号进行转义,直接写成'w(es)t.*/1'就可以了。
364 | ```
365 |
366 | # man,logout命令
367 |
368 | > man命令,man是manual的缩写,相当于Unix/Linux的联机Help,每个系统命令和调用都有非常详细的说明,绝大多数都是英文。如:man ls即是查看ls命令的使用说明,一般还有另一种方法用来查看帮助,如:ls –help,这种方式绝大多数命令都支持。
369 |
370 | > logout命令,该命令用于退出系统,与login命令对应。
371 |
372 | # 管道和xargs
373 |
374 | ## 管道
375 |
376 | 利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
377 | 注意:管道左边命令的输入作为管道右边命令的输入(命令的输入是一定的),不是参数,并不是所有命令都支持管道
378 | 例子:ls | grep a 查看当前目录下名称包含a的文件或文件夹
379 |
380 | ## xargs
381 | 大多数 Linux 命令都会产生输出:文件列表、字符串列表等。但如果要使用其他某个命令并将前一个命令的输出作为参数该怎么办?例如,file 命令显示文件类型(可执行文件、ascii 文本等);你能处理输出,使其仅显示文件名,目前你希望将这些名称传递给 ls -l 命令以查看时间戳记。xargs 命令就是用来完成此项工作的。
382 | 注意:find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去
383 |
384 | 例子:
385 | 1. 在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:
386 |
387 | ```
388 | $ find / -name "core" -print | xargs echo "" >/tmp/core.log
389 | ```
390 |
391 | 2. 当一个目录下文件太多时,直接用rm * 命令会包参数过长,用如下方法可以全部删除
392 |
393 | ```
394 | $ls | xargs rm
395 | ```
396 |
397 |
398 | # basename 和 dirname
399 |
400 | basename用于查看文件不含路径的名字,dirname则用于查看文件路径,使用效果我们测试一下便知:
401 |
402 | ```
403 | > basename /home/hj/1.txt
404 | 1.txt
405 | > dirname /home/hj/1.txt
406 | /home/hj
407 | > basename 1.txt
408 | 1.txt
409 | > dirname 1.txt
410 | .
411 | ```
412 |
--------------------------------------------------------------------------------
/back-end/centOS/搭建Shadowsocks服务器.md:
--------------------------------------------------------------------------------
1 | 搭建Shadowsocks服务器
2 | ---
3 |
4 |
5 |
6 | - [客户端](#客户端)
7 | - [安装shadowsocks](#安装shadowsocks)
8 | - [创建配置文件](#创建配置文件)
9 | - [多账号配置](#多账号配置)
10 | - [服务运营管理](#服务运营管理)
11 | - [运行](#运行)
12 | - [关闭](#关闭)
13 | - [查看日志](#查看日志)
14 | - [帮助](#帮助)
15 | - [参考文章](#参考文章)
16 |
17 |
18 |
19 | ## 客户端
20 |
21 | ### 安装shadowsocks
22 |
23 | ```bash
24 | yum install python-setuptools && easy_install pip
25 | ## pip install --upgrade pip
26 | pip install shadowsocks
27 | ```
28 |
29 | ### 创建配置文件
30 |
31 | `vim /etc/shadowsocks.json`
32 |
33 | ```json
34 | {
35 | "server":"your_server_ip",
36 | "server_port":8388,
37 | "password":"yourpassword",
38 | "timeout":300,
39 | "method":"aes-256-cfb",
40 | "fast_open":false,
41 | "workers": 1
42 | }
43 | ```
44 |
45 | 代码中各字段的含义
46 |
47 | - server:服务器 IP地址 (IPv4/IPv6)
48 | - server_port:服务器监听的端口,一般设为80,443等,注意不要设为使用中的端口
49 | - password:设置密码,自定义
50 | - timeout:超时时间(秒)
51 | - method:加密方法,可选择 “aes-256-cfb”, “rc4-md5”等等。推荐使用 “rc4-md5”
52 | - fast_open:true 或 false。如果你的服务器 Linux 内核在3.7+,可以开启 fast_open 以降低延迟。
53 | - workers:workers数量,默认为 1。
54 |
55 | ### 多账号配置
56 |
57 | ```json
58 | {
59 | "server":"your_server_ip",
60 | "port_password":{
61 | "8381":"pass1",
62 | "8382":"pass2",
63 | "8383":"pass3",
64 | "8384":"pass4"
65 | },
66 | "timeout":60,
67 | "method":"rc4-md5",
68 | "fast_open":false,
69 | "workers":1
70 | }
71 | ```
72 |
73 | ## 服务运营管理
74 |
75 | ### 运行
76 |
77 | ```bash
78 | ssserver -c /etc/shadowsocks.json -d start
79 | # 或不需要配置文件
80 | sudo ssserver -p 443 -k password -m rc4-md5 --user nobody -d start
81 |
82 | # 关闭防火墙
83 | systemctl stop firewalld.service # 停止firewall
84 | systemctl disable firewalld.service # 禁止firewall开机启动
85 | ```
86 |
87 | ### 关闭
88 |
89 | ```bash
90 | ssserver -d stop
91 | ```
92 |
93 | ### 查看日志
94 |
95 | ```bash
96 | less /var/log/shadowsocks.log
97 | ```
98 |
99 | ### 帮助
100 |
101 | ```bash
102 | ssserver -h
103 | ```
104 |
105 | ## 参考文章
106 |
107 | - [架设高性能shadowsocks服务器](http://yanyu.farbox.com/post/build-high-performance-shadowsocks-server)
108 | - [Shadowsocks 使用说明](https://github.com/shadowsocks/shadowsocks/wiki/Shadowsocks-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E)
109 | - [Shadowsocks & finalspeed 服务端搭建](https://github.com/ucoker/finalspeed#shadowsocks-installation)
110 |
--------------------------------------------------------------------------------
/back-end/centOS/管理远程会话screen工具.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | 关掉窗口或者断开连接,进程就会被杀掉,为什么关掉窗口/断开连接会使得正在运行的程序死掉。supervisord、screen、[pm2](https://github.com/Unitech/pm2) 这些工具都可以解决上面的情况
4 |
5 | # screen
6 |
7 | | C-a ? | 显示所有键绑定信息 |
8 | | ----- | ----- |
9 | | C-a w | 显示所有窗口列表 |
10 | | C-a C-a | 切换到之前显示的窗口 |
11 | | C-a c | 创建一个新的运行shell的窗口并切换到该窗口 |
12 | | C-a n | 切换到下一个窗口 |
13 | | C-a p | 切换到前一个窗口(与C-a n相对) |
14 | | C-a 0..9 | 切换到窗口0..9 |
15 | | C-a a | 发送 C-a到当前窗口 |
16 | | C-a d | 暂时断开screen会话 |
17 | | C-a k | 杀掉当前窗口 |
18 | | C-a [ | 进入拷贝/回滚模式 |
19 |
20 | 有时在恢复 screen 时会出现 There is no screen to be resumed matching ****,遇到这种情况咋办呢?输入命令
21 |
22 | screen -d ****
23 |
24 | -A 将所有的视窗都调整为目前终端机的大小。
25 | -d <作业名称> 将指定的screen作业离线。
26 | -h <行数> 指定视窗的缓冲区行数。
27 | -m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
28 | -r <作业名称> 恢复离线的screen作业。
29 | -R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
30 | -s 指定建立新视窗时,所要执行的shell。
31 | -S <作业名称> 指定screen作业的名称。
32 | -v 显示版本信息。
33 | -x 恢复之前离线的screen作业。
34 | -ls或--list 显示目前所有的screen作业。
35 | -wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。
36 |
37 |
38 | screen -S yourname -> 新建一个叫yourname的session
39 | screen -ls(或者screen -list) -> 列出当前所有的session
40 | screen -r yourname -> 回到yourname这个session
41 | screen -d yourname -> 远程detach某个session
42 | screen -d -r yourname -> 结束当前session并回到yourname这个session
43 |
44 |
45 | # 参考资料
46 |
47 | - http://www.gnu.org/software/screen/
48 | - http://www.ibm.com/developerworks/cn/linux/l-cn-screen/
49 | - [Screen的man page提供了最详细的信息](http://www.slac.stanford.edu/comp/unix/package/epics/extensions/iocConsole/screen.1.html)
50 |
--------------------------------------------------------------------------------
/back-end/centOS/部署Seafile搭建自己的网盘.md:
--------------------------------------------------------------------------------
1 | 部署Seafile搭建自己的网盘
2 | ===
3 |
4 | Seafile 是一个开源的文件云存储平台,解决文件集中存储、同步、多平台访问的问,允许用户创建“群组”,在群组内共享和同步文件,方便了团队协同工作。
5 |
6 |
7 |
8 | - [安装依赖](#安装依赖)
9 | - [下载](#下载)
10 | - [安装](#安装)
11 | - [启动 Seafile](#启动-seafile)
12 | - [启动 Seahub](#启动-seahub)
13 | - [备份](#备份)
14 | - [恢复](#恢复)
15 | - [服务管理](#服务管理)
16 | - [开机启动](#开机启动)
17 | - [参考资料](#参考资料)
18 |
19 |
20 |
21 | ## 安装依赖
22 |
23 | ```bash
24 | # 在 CentOS 7 下
25 | # (MariaDB 是 MySQL 的分支)
26 | yum install mariadb-server
27 |
28 | # 如果以来有问题
29 | # 尝试在后面加上参数 --skip-broken
30 | yum install python-setuptools python-imaging python-ldap MySQL-python python-memcached python-urllib3
31 | ```
32 |
33 | yum 安装 mysqldb-python 后面seafile安装报错,需要通过 python 的工具pip来安装MySQL-python `pip install MySQL-python`
34 |
35 | ## 下载
36 |
37 | 在这里下载[seafile-server_6.0.7_x86-64.tar.gz](https://www.seafile.com/download/),你可以选择你需要的版本
38 |
39 | ```bash
40 | # 查看系统版本
41 | cat /proc/version
42 | wget http://download-cn.seafile.com/seafile-server_6.0.7_x86-64.tar.gz
43 |
44 | # 解压
45 | tar -zxvf seafile-server_6.0.7_x86-64.tar.gz
46 |
47 | # 解压放到一个目录
48 | cd seafile-server-*
49 | ```
50 |
51 | ## 安装
52 |
53 | 我的数据库使用MySQL,你需要先在数据库中建立一个 MySQL 用户 `seafile`。
54 |
55 | ```bash
56 | # 登录MySQL创建一个用户
57 | mysql -uroot -p
58 |
59 | # 创建用户设置密码
60 | mysql> Create USER 'seafile'@'%' IDENTIFIED BY '123456';
61 | # 执行下面语句立即生效
62 | mysql> flush privileges;
63 | ```
64 |
65 | 运行`./setup-seafile-mysql.sh`安装脚本并回答预设问题
66 |
67 | ```bash
68 | ./setup-seafile-mysql.sh
69 | Checking python on this machine ...
70 | Checking python module: setuptools ... Done.
71 | Checking python module: python-imaging ... Done.
72 | Checking python module: python-mysqldb ... Done.
73 |
74 | -----------------------------------------------------------------
75 | This script will guide you to setup your seafile server using MySQL.
76 | Make sure you have read seafile server manual at
77 |
78 | https://github.com/haiwen/seafile/wiki
79 |
80 | Press ENTER to continue
81 | -----------------------------------------------------------------
82 |
83 | What is the name of the server? It will be displayed on the client.
84 | 3 - 15 letters or digits
85 | [ server name ] <填写 seafile 服务器的名字>
86 |
87 | What is the ip or domain of the server?
88 | For example: www.mycompany.com, 192.168.1.101
89 | [ This server's ip or domain ]
90 |
91 | Where do you want to put your seafile data?
92 | Please use a volume with enough free space
93 | [ default "/home/www/jinpans/seafile-data" ]
94 |
95 | Which port do you want to use for the seafile fileserver?
96 | [ default "8082" ] [ seafile fileserver 使用的 TCP 端口 ]
97 |
98 | -------------------------------------------------------
99 | Please choose a way to initialize seafile databases:
100 | -------------------------------------------------------
101 |
102 | [1] Create new ccnet/seafile/seahub databases
103 | 你需要提供根密码. 脚本程序会创建数据库和用户。
104 | [2] Use existing ccnet/seafile/seahub databases
105 | ccnet/seafile/seahub 数据库应该已经被你(或者其他人)提前创建。
106 | [ 1 or 2 ] <选择一种创建 Seafile 数据库的方式>
107 |
108 | What is the host of mysql server?
109 | [ default "localhost" ]
110 |
111 | What is the port of mysql server?
112 | [ default "3306" ]
113 |
114 | What is the password of the mysql root user?
115 | [ root password ] <输入root密码>
116 |
117 | verifying password of user root ... done
118 |
119 | Enter the name for mysql user of seafile. It would be created if not exists.
120 | [ default "seafile" ] <默认seafile的MySQL用户名,可以使用默认>
121 |
122 | Enter the password for mysql user "seafile":
123 | [ password for seafile ] <输入seafile密码>
124 |
125 | verifying password of user seafile ... done
126 |
127 | Enter the database name for ccnet-server:
128 | [ default "ccnet-db" ]
129 |
130 | Enter the database name for seafile-server:
131 | [ default "seafile-db" ]
132 |
133 | Enter the database name for seahub:
134 | [ default "seahub-db" ]
135 |
136 | ---------------------------------
137 | This is your configuration
138 | ---------------------------------
139 |
140 | server name: seafile 服务器的名字
141 | server ip/domain: 192.168.1.101
142 |
143 | seafile data dir: /home/www/jinpans/seafile-data
144 | fileserver port: 8082
145 |
146 | database: create new
147 | ccnet database: ccnet-db
148 | seafile database: seafile-db
149 | seahub database: seahub-db
150 | database user: seafile
151 |
152 | ---------------------------------
153 | Press ENTER to continue, or Ctrl-C to abort
154 | ---------------------------------
155 |
156 | Generating ccnet configuration ...
157 |
158 | done
159 | Successly create configuration dir /home/www/jinpans/ccnet.
160 | Generating seafile configuration ...
161 |
162 | Done.
163 | done
164 | Generating seahub configuration ...
165 |
166 | ----------------------------------------
167 | Now creating seahub database tables ...
168 |
169 | ----------------------------------------
170 |
171 | creating seafile-server-latest symbolic link ... done
172 |
173 | -----------------------------------------------------------------
174 | Your seafile server configuration has been finished successfully.
175 | -----------------------------------------------------------------
176 |
177 | run seafile server: ./seafile.sh { start | stop | restart }
178 | run seahub server: ./seahub.sh { start | stop | restart }
179 |
180 | -----------------------------------------------------------------
181 | If you are behind a firewall, remember to allow input/output of these tcp ports:
182 | -----------------------------------------------------------------
183 |
184 | port of seafile fileserver: 8082
185 | port of seahub: 8000
186 |
187 | When problems occur, Refer to
188 |
189 | https://github.com/haiwen/seafile/wiki
190 |
191 | ```
192 |
193 | 上面算是结束了,然后在 seafile-server_6.0.7 目录下面,运行如下命令
194 |
195 | ### 启动 Seafile
196 |
197 | ```bash
198 | ./seafile.sh start # 启动 Seafile 服务
199 | ```
200 |
201 | ### 启动 Seahub
202 |
203 | ```bash
204 | ./seahub.sh start # 启动 Seahub 网站 (默认运行在8000端口上)
205 | # 你第一次启动 seahub 时,seahub.sh 脚本会提示你创建一个 seafile 管理员帐号。
206 |
207 | LC_ALL is not set in ENV, set to en_US.UTF-8
208 | Starting seahub at port 8000 ...
209 |
210 | ----------------------------------------
211 | It's the first time you start the seafile server. Now let's create the admin account
212 | ----------------------------------------
213 |
214 | What is the email for the admin account?
215 | [ admin email ] <这里输入邮箱地址>
216 |
217 | What is the password for the admin account?
218 | [ admin password ] <这里输入密码>
219 |
220 | Enter the password again:
221 | [ admin password again ] <这里确认输入密码>
222 | ----------------------------------------
223 | Successfully created seafile admin
224 | ----------------------------------------
225 | Seahub is started
226 | Done.
227 | ```
228 |
229 | 然后你可以打开它了:
230 |
231 | ```bash
232 | http://192.168.1.111:8000/
233 | ```
234 |
235 | ## 备份
236 |
237 | 备份数据库,假设你的数据库名分别为 `ccnet-db` , `seafile-db` 和 `seahubdb`,下面命令分别备份这三个数据库,同时要注意备份需要先建立好文件夹。
238 |
239 | ```bash
240 | mysqldump -h localhost -uroot -p --opt ccnet-db > ./backup/databases/ccnet-db.sql.`date +"%Y-%m-%d-%H-%M-%S"`
241 | mysqldump -h localhost -uroot -p --opt seafile-db > ./backup/databases/seafile-db.sql.`date +"%Y-%m-%d-%H-%M-%S"`
242 | mysqldump -h localhost -uroot -p --opt seahub-db > ./backup/databases/seahub-db.sql.`date +"%Y-%m-%d-%H-%M-%S"`
243 | ```
244 |
245 | 备份文件
246 |
247 | ```bash
248 | nohup cp -R ./seafile-data ./backup/data/seafile-data-`date +"%Y-%m-%d-%H-%M-%S"` 2>&1 &
249 | nohup cp -R ./seahub-data ./backup/data/seahub-data-`date +"%Y-%m-%d-%H-%M-%S"` 2>&1 &
250 |
251 | [1] 17294
252 | ```
253 |
254 | ## 恢复
255 |
256 | ```bash
257 | mysql -uroot -p ccnet-db < ccnet-db.sql.2017-11-29-11-36-06
258 | mysql -uroot -p seafile-db < seafile-db.sql.2017-11-29-11-36-06
259 | mysql -uroot -p seahub-db < seahub-db.sql.2017-11-29-11-36-06
260 | ```
261 |
262 | ## 服务管理
263 |
264 | ```bash
265 | ./seahub.sh stop # 停止 Seafile 进程
266 | ./seafile.sh stop # 停止 Seahub
267 |
268 | ./seafile.sh start # 启动 Seafile 服务
269 | ./seahub.sh start 8001 # 启动 Seahub 网站 (运行在8001端口上)
270 |
271 | ./seafile.sh restart # 停止当前的 Seafile 进程,然后重启 Seafile
272 | ./seahub.sh restart # 停止当前的 Seahub 进程,并在 8000 端口重新启动 Seahub
273 | ```
274 |
275 | ## 开机启动
276 |
277 | 创建 systemd 服务文件`seafile.service`,记得将服务文件中的`${seafile_dir}`替换成你的安装目录
278 |
279 | ```bash
280 | sudo vim /etc/systemd/system/seafile.service
281 | ```
282 |
283 | 文件内容如下:
284 |
285 | ```bash
286 | [Unit]
287 | Description=Seafile
288 | # add mysql.service or postgresql.service depending on your database to the line below
289 | After=network.target
290 |
291 | [Service]
292 | Type=oneshot
293 | ExecStart=${seafile_dir}/seafile-server-latest/seafile.sh start
294 | ExecStop=${seafile_dir}/seafile-server-latest/seafile.sh stop
295 | RemainAfterExit=yes
296 | User=seafile
297 | Group=seafile
298 |
299 | [Install]
300 | WantedBy=multi-user.target
301 | ```
302 |
303 | 创建 systemd 服务文件 `seahub.service`,记得将服务文件中的`${seafile_dir}`替换成你的安装目录
304 |
305 | ```bash
306 | sudo vim /etc/systemd/system/seahub.service
307 | ```
308 |
309 | 文件内容如下:
310 |
311 | ```bash
312 | [Unit]
313 | Description=Seafile hub
314 | After=network.target seafile.service
315 |
316 | [Service]
317 | # change start to start-fastcgi if you want to run fastcgi
318 | ExecStart=${seafile_dir}/seafile-server-latest/seahub.sh start
319 | ExecStop=${seafile_dir}/seafile-server-latest/seahub.sh stop
320 | User=seafile
321 | Group=seafile
322 | Type=oneshot
323 | RemainAfterExit=yes
324 |
325 | [Install]
326 | WantedBy=multi-user.target
327 | ```
328 |
329 | [Install]
330 | WantedBy=multi-user.target
331 |
332 | ```bash
333 | sudo systemctl enable seafile.service
334 | sudo systemctl enable seahub.service
335 | ```
336 |
337 | ## 参考资料
338 |
339 | - [Seafile服务器手册中文版](https://www.gitbook.com/book/freeplant/seafile-manual-cn/details)
340 | - [Seafile for Github](https://github.com/haiwen/seafile)
341 | - [Seafile官网](http://seafile.com/)
--------------------------------------------------------------------------------
/front-end/Javascript/JS基础-基本概念.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/JS基础-基本概念.png
--------------------------------------------------------------------------------
/front-end/Javascript/JS基础-基本语句.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/JS基础-基本语句.png
--------------------------------------------------------------------------------
/front-end/Javascript/JS基础-字符串基本及常用方法汇总.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/JS基础-字符串基本及常用方法汇总.png
--------------------------------------------------------------------------------
/front-end/Javascript/JS基础-常基本用方法.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/JS基础-常基本用方法.png
--------------------------------------------------------------------------------
/front-end/Javascript/JS基础-操作符.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/JS基础-操作符.png
--------------------------------------------------------------------------------
/front-end/Javascript/JS基础-数组基本及常用方法.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/JS基础-数组基本及常用方法.png
--------------------------------------------------------------------------------
/front-end/Javascript/RN/React-native Android环境搭建.md:
--------------------------------------------------------------------------------
1 | React-native Android环境搭建.md
2 | ---
3 |
4 | ## 目录
5 |
6 | - [基础安装](#基础安装)
7 | - [安装Homebrew](#安装homebrew)
8 | - [安装Node.js](#安装nodejs)
9 | - [安装watchman](#安装watchman)
10 | - [安装flow](#安装flow)
11 | - [安装react-native-cli](#安装react-native-cli)
12 | - [iOS环境安装](#ios环境安装)
13 | - [Android环境安装](#android环境安装)
14 | - [基础软件安装](#基础软件安装)
15 | - [环境变量配置](#环境变量配置)
16 | - [测试服务端](#测试服务端)
17 | - [启动步骤](#启动步骤)
18 | - [各种报错](#各种报错)
19 | - [参考资料](#参考资料)
20 |
21 | ## 基础安装
22 |
23 | ### 安装Homebrew
24 |
25 | Homebrew是Mac OSX的包管理器,我们需要通过Homebrew安装开发React Native的相关软件包。
26 | 如果不知道怎样安装Homebrew可以点这里:[官网](http://brew.sh/index_zh-cn.html)。根据官网的介绍安装即可。
27 |
28 | ### 安装Node.js
29 |
30 | ```bash
31 | $ brew install node
32 | ```
33 |
34 | ### 安装watchman
35 |
36 | watchman是Facebook用于监视JavaScript文件改动的开源项目。
37 |
38 | ```bash
39 | $ brew install watchman
40 | ```
41 |
42 | ### 安装flow
43 |
44 | flow是Facebook开源的一个JavaScript静态类型检查器,用于发现JavaScript程序中的类型错误。
45 |
46 | ```bash
47 | $ brew install flow
48 | ```
49 |
50 | ### 安装react-native-cli
51 |
52 | react-native-cli是React Native的命令行工具,安装react-native-cli后我们就能够通过react-native相关命令管理ReactNative工程。
53 |
54 | ```bash
55 | $ npm install -g react-native-cli
56 | ```
57 |
58 | ## iOS环境安装
59 |
60 | 相对于Android环境搭建,iOS简单太多了,太easy了!在基础环境安装成功之后,只需去[Mac App Store](https://itunes.apple.com/us/app/xcode/id497799835?mt=12)下载Xcode,并安装Xcode即可,首次安装需要打开Xcode初始化。在初始化项目好之后,只需在项目根目录运行下面命令即可:
61 |
62 | ```bash
63 | $ react-native run-ios`
64 | ```
65 |
66 | ## Android环境安装
67 |
68 | 在Android环境,比较难搞,按照步骤安装即可,不要放过任何步骤哦。
69 |
70 | ### 基础软件安装
71 |
72 | 1. 安装JDK [jdk-8u101-macosx-x64.dmg](http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html)
73 | - 查看版本,命令行中运行`javac -version`
74 | 2. 安装Android Studio
75 | - 勾选`Performance`和`Android Virtual Device`
76 | - 安装相关`SDK Platforms `,记得勾选`Show Package Details`
77 | - 安装`SDK Tools` 必须是这个版本 `Android SDK Build-Tools 23.0.1`,记得勾选`Show Package Details`。
78 | - ANDROID_HOME环境变量设置。(见下面 环境变量配置)方法
79 | 3. 安装 [免费VirtualBox虚拟机](https://www.virtualbox.org/)
80 | 4. 安装模拟器[Genymotion](https://www.genymotion.com/)
81 | - 注册帐号
82 | - 下载Genymotion
83 | - 安装Genymotion
84 |
85 | ### 环境变量配置
86 |
87 | 你可以把`Android SDK`的`tools`和`platform-tools`目录添加到PATH变量中,以便在终端中运行一些Android工具,例如`android avd`或是`adb logcat`等。
88 |
89 | 在`~/.bash_profile`中添加(如果你安装的 ZSH 则在 `~/.zshrc`中添加):
90 |
91 | ```bash
92 | PATH="~/Library/Android/sdk/tools:~/Library/Android/sdk/platform-tools:${PATH}"
93 | export PATH=$HOME/bin:/usr/local/bin:$PATH
94 | export ANDROID_HOME=~/Library/Android/sdk
95 | export PATH=${PATH}:${ANDROID_HOME}/tools
96 | ```
97 |
98 | 改完需要运行`source ~/.bash_profile`
99 | (注意:你的SDK的具体路径可能不同)
100 |
101 | ### 测试服务端
102 |
103 | 这时候可以用浏览器访问
104 | http://localhost:8081/index.android.bundle?platform=android
105 | 如果可以访问表示服务器端已经可以了。
106 |
107 | ### 启动步骤
108 |
109 | #### 启动 Genymotion 设置
110 |
111 | 在应用中登录,点击按钮`Add`下载模拟器设备,在`Setting`中设置`ADB`选择`User custom Android SDK tools.`填写地址,一般在目录`/Users/用户名/Library/Android/sdk`中,点击按钮`Start`启动模拟器
112 |
113 | 
114 | 
115 |
116 | 在启动前需要设置ADB SDK,否则会报错 `error: could not install smartsocket listener: Address already in use`,解决方法:genymotion的adb设置Android sdk。如下图:
117 |
118 | 
119 | 
120 |
121 | #### 运行命令启动项目
122 |
123 | 进入项目的根目录,也就是有`package.json`文件的目录,运行`react-native run-android`启动项目,如下动图:
124 |
125 | 
126 |
127 | ## 各种报错
128 |
129 | #### 1. error: no devices/emulators found
130 |
131 | Could not run adb reverse: Command failed: ~/Library/Android/sdk/platform-tools/adb reverse tcp:8081 tcp:8081
132 |
133 | 在Android环境下运行,会报下面错误,原因是没有连接手机会报如下错,**开发阶段可忽视**
134 |
135 | #### 2. react-native run-android时出现Could not download imagepipeline.aar
136 |
137 | 解决方法:修改build.gradle的版本,com.android.tools.build:gradle:2.1.0,改为更高的,然后更改gradle/wrapper/gradle-wrapper.properties中相应的gradle-2.10-all.zip。
138 |
139 | #### 3. Undefined symbols for architecture x86_64: “std::terminate()”
140 |
141 | 解决方法:I ran in to this issue as well, and the solution @charpeni proposed solved the issue. To be clear for others, if you are upgrading to 0.26+ then you need to make the following changes.
142 |
143 | In ios/YourProject.xcodeproj/project.pbxproj, look for the two lines like OTHER_LDFLAGS = "-ObjC";. Replace them with the following:
144 |
145 | ```
146 | OTHER_LDFLAGS = (
147 | "-ObjC",
148 | "-lc++",
149 | );
150 | ```
151 |
152 | #### 4. react-native run-android时出现Could not download imagepipeline.aar
153 |
154 | 解决方法:修改build.gradle的版本,com.android.tools.build:gradle:2.1.0,改为更高的,然后更改gradle/wrapper/gradle-wrapper.properties中相应的gradle-2.10-all.zip。
155 |
156 | #### 5. error: unable to find utility "instruments", not a developer tool or in PATH
157 |
158 | ```bash
159 | ~/Learning/ReactNative/AwesomeProject: react-native run-ios
160 | Found Xcode project AwesomeProject.xcodeproj
161 | xcrun: error: unable to find utility "instruments", not a developer tool or in PATH
162 |
163 | Command failed: xcrun instruments -s
164 | xcrun: error: unable to find utility "instruments", not a developer tool or in PATH
165 | ```
166 |
167 | 输入sudo xcode-select -s /Applications/Xcode.app/Contents/Developer/然后就可以运行react-native run-ios了。
168 |
169 | #### 6. Property 'force' not found on object of type 'UITouch'
170 |
171 | 出现这种类似错误,只能升级Xcode咯。
172 |
173 | #### 7. Ignoring return value of function declared with warn_unused_result attribute
174 |
175 | 这个报错在此文件中有两处,代码
176 |
177 | ```objective-c
178 | SecRandomCopyBytes(kSecRandomDefault, sizeof(uint32_t), (uint8_t *)mask_key);
179 | ```
180 |
181 | 修改为
182 |
183 | ```objective-c
184 | (void)SecRandomCopyBytes(kSecRandomDefault, sizeof(uint32_t), (uint8_t *)mask_key);
185 | ```
186 |
187 | 前面加上`(void)`。
188 |
189 | #### 8. Use of undeclared identifier '_refreshControl'; did you mean 'refreshControl'?
190 |
191 | ```
192 | @implementation RCTCustomScrollView{
193 | __weak UIView *_dockedHeaderView;
194 | RCTRefreshControl *_refreshControl; // 加入此行
195 | }
196 | ```
197 |
198 | #### 9. Execution failed for task ':react-native-update:compileReleaseNdk'.NDK not configured.
199 |
200 | 错误信息
201 |
202 | ```
203 | * What went wrong:
204 | Execution failed for task ':react-native-update:compileReleaseNdk'.
205 | > NDK not configured.
206 | Download the NDK from http://developer.android.com/tools/sdk/ndk/.Then add ndk.dir=path/to/ndk in local.properties.
207 | (On Windows, make sure you escape backslashes, e.g. C:\\ndk rather than C:\ndk)
208 | ```
209 |
210 | 解决方法:[下载安装NDK和相关工具](https://developer.android.com/ndk/guides/index.html#download-ndk),菜单进入 **Tools > Android > SDK Manager** 在选项卡中选择 **SDK Tools**,选择 **LLDB**, **CMake**, 和 **NDK** 勾选,点击 **Apply** 进行下载安装。
211 |
212 | ## 参考资料
213 |
214 | - [官方搭建开发环境](https://facebook.github.io/react-native/docs/getting-started.html#content)
215 | - [reactnative.cn搭建开发环境](http://reactnative.cn/docs/0.35/getting-started.html)
216 | - [极客学院搭建开发环境](http://wiki.jikexueyuan.com/project/react-native/DevelopmentSetupAndroid.html)
217 | - [React Native开发过程中遇到的问题](https://github.com/haiyangjiajian/haiyangjiajian.github.io/blob/4bd765801712adf33b4d45280fb01e9aef21c1b1/_posts/2016-8-9-react%20native%20related%20problems%20and%20solutions.md)
218 |
--------------------------------------------------------------------------------
/front-end/Javascript/RN/img/Genymotion01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/RN/img/Genymotion01.jpg
--------------------------------------------------------------------------------
/front-end/Javascript/RN/img/Genymotion02.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/RN/img/Genymotion02.jpg
--------------------------------------------------------------------------------
/front-end/Javascript/RN/img/Genymotion03.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/RN/img/Genymotion03.jpg
--------------------------------------------------------------------------------
/front-end/Javascript/RN/img/Genymotion04.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/RN/img/Genymotion04.jpg
--------------------------------------------------------------------------------
/front-end/Javascript/RN/img/React-native-run.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/RN/img/React-native-run.gif
--------------------------------------------------------------------------------
/front-end/Javascript/函数基础.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/函数基础.gif
--------------------------------------------------------------------------------
/front-end/Javascript/变量.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/变量.gif
--------------------------------------------------------------------------------
/front-end/Javascript/基本dom操作.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/基本dom操作.gif
--------------------------------------------------------------------------------
/front-end/Javascript/字符串函数.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/字符串函数.gif
--------------------------------------------------------------------------------
/front-end/Javascript/数组.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/数组.gif
--------------------------------------------------------------------------------
/front-end/Javascript/正则表达式.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/正则表达式.gif
--------------------------------------------------------------------------------
/front-end/Javascript/正则表达式.md:
--------------------------------------------------------------------------------
1 | 一些正则表达式
2 | ---
3 |
4 | 通过一些例子来学习正则表达式摘录,js正则函数match、exec、test、search、replace、split
5 |
6 |
7 |
8 | - [一些匹配方法](#一些匹配方法)
9 | - [去除首尾的](#去除首尾的)
10 | - [javascript:; 、javascript:void(0)](#javascript-javascriptvoid0)
11 | - [匹配](#匹配)
12 | - [匹配一些字符](#匹配一些字符)
13 | - [关键字符替换](#关键字符替换)
14 | - [替换参数中的值](#替换参数中的值)
15 | - [匹配括号内容](#匹配括号内容)
16 | - [调换](#调换)
17 | - [字符串截取](#字符串截取)
18 | - [验证](#验证)
19 | - [小数点后几位验证](#小数点后几位验证)
20 | - [密码强度正则](#密码强度正则)
21 | - [校验中文](#校验中文)
22 | - [包含中文正则](#包含中文正则)
23 | - [由数字、26个英文字母或下划线组成的字符串](#由数字26个英文字母或下划线组成的字符串)
24 | - [身份证号正则](#身份证号正则)
25 | - [校验日期](#校验日期)
26 | - [校验文件后缀](#校验文件后缀)
27 | - [用户名正则](#用户名正则)
28 | - [整数正则](#整数正则)
29 | - [数字正则](#数字正则)
30 | - [Email正则](#email正则)
31 | - [传真号码](#传真号码)
32 | - [手机号码正则](#手机号码正则)
33 | - [URL正则](#url正则)
34 | - [IPv4地址正则](#ipv4地址正则)
35 | - [十六进制颜色正则](#十六进制颜色正则)
36 | - [QQ号码正则](#qq号码正则)
37 | - [微信号正则](#微信号正则)
38 | - [车牌号正则](#车牌号正则)
39 | - [颜色值校验](#颜色值校验)
40 |
41 |
42 |
43 | ## 一些匹配方法
44 |
45 | ### 去除首尾的
46 |
47 | ```js
48 | //去除首尾的‘/’
49 | input = input.replace(/^\/*|\/*$/g,'');
50 | ```
51 |
52 | ### javascript:; 、javascript:void(0)
53 |
54 | ```js
55 | 'javascript:;'.match(/^(javascript\s*\:|#)/);
56 | //["javascript:", "javascript:", index: 0, input: "javascript:;"]
57 | ```
58 |
59 | ### 匹配
60 |
61 | ```js
62 | var str = "access_token=dcb90862-29fb-4b03-93ff-5f0a8f546250; refresh_token=702f4815-a0ff-456c-82ce-24e4d7d619e6; account_uid=1361177947320160506170322436";
63 | str.match(/account_uid=([^\=]+(\;)|(.*))/ig);
64 | ```
65 |
66 | ### 匹配一些字符
67 |
68 | ```js
69 | var str = 'asdf html-webpack-plugin for "index/index.html" asdfasdf';
70 | str.match(/html-webpack-plugin for \"(.*)\"/ig);
71 | console.log(RegExp.$1) //=>index/index.html
72 | ```
73 |
74 | ### 关键字符替换
75 |
76 | ```js
77 | 'css/[hash:8].index-index.css'.replace(/\[(?:(\w+):)?(contenthash|hash)(?::([a-z]+\d*))?(?::(\d+))?\]/ig,'(.*)');
78 | //=> css/(.*).index-index.css
79 | ```
80 |
81 | ### 替换参数中的值
82 |
83 | ```js
84 | var str = '';
85 | str.replace(/]*manifest="([^"]*)"[^>]*>/,function(word){
86 | return word.replace(/manifest="([^"]*)"/,'manifest="'+url+'"');
87 | }).replace(/]*\>)/,function(word){
88 | if(word.indexOf('manifest')) return word;
89 | return word.replace('
92 | //替换成=>
93 | ```
94 |
95 | ### 匹配括号内容
96 |
97 | ```js
98 | 'max_length(12)'.match(/^(.+?)\((.+)\)$/)
99 | // ["max_length(12)", "max_length", "12", index: 0, input: "max_length(12)"]
100 | ```
101 |
102 | ### 调换
103 |
104 | ```js
105 | var name = "Doe, John";
106 | name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");
107 | //=> "John Doe"
108 | ```
109 |
110 | ### 字符串截取
111 |
112 | ```js
113 | var str = 'asfdf === sdfaf ##'
114 | str.match(/[^===]+(?=[===])/g) // 截取 ===之前的内容
115 |
116 | str.replace(/\n/g,'') // 替换字符串中的 \n 换行字符
117 | ```
118 |
119 | ## 验证
120 |
121 | ### 小数点后几位验证
122 |
123 | ```js
124 | // 精确到1位小数
125 | /^[1-9][0-9]*$|^[1-9][0-9]*\.[0-9]$|^0\.[0-9]$/.test(1.2);
126 |
127 | // 精确到2位小数
128 | /^[0-9]+(.[0-9]{2})?$/.test(1.221);
129 | ```
130 |
131 | ### 密码强度正则
132 |
133 |
134 | ```js
135 | // 必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。
136 | /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$/.test("weeeeeeeW2");
137 | //密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
138 | /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/.test("diaoD123#");
139 | //输出 true
140 | ```
141 |
142 | ### 校验中文
143 |
144 | ```js
145 | /^[\u4e00-\u9fa5]{0,}$/.test("但是d"); //false
146 | /^[\u4e00-\u9fa5]{0,}$/.test("但是"); //true
147 | /^[\u4e00-\u9fa5]{0,}$/.test("但是"); //true
148 | ```
149 |
150 | ### 包含中文正则
151 |
152 | ```js
153 | /[\u4E00-\u9FA5]/.test("但是d") //true
154 | ```
155 |
156 | ### 由数字、26个英文字母或下划线组成的字符串
157 |
158 | ```js
159 | /^\w+$/.test("ds2_@#"); // false
160 | ```
161 |
162 | ### 身份证号正则
163 |
164 | ```js
165 | //身份证号(18位)正则
166 | /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/.test("42112319870115371X");
167 | //输出 false
168 | ```
169 |
170 | ### 校验日期
171 |
172 | “yyyy-mm-dd“ 格式的日期校验,已考虑平闰年。
173 |
174 | ```js
175 | //日期正则,简单判定,未做月份及日期的判定
176 | var dP1 = /^\d{4}(\-)\d{1,2}\1\d{1,2}$/;
177 | //输出 true
178 | console.log(dP1.test("2017-05-11"));
179 | //输出 true
180 | console.log(dP1.test("2017-15-11"));
181 | //日期正则,复杂判定
182 | var dP2 = /^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/;
183 | //输出 true
184 | console.log(dP2.test("2017-02-11"));
185 | //输出 false
186 | console.log(dP2.test("2017-15-11"));
187 | //输出 false
188 | console.log(dP2.test("2017-02-29"));
189 | // true
190 | ```
191 |
192 |
193 | ### 校验文件后缀
194 |
195 | ```js
196 | var strRegex = "(.jpg|.gif|.txt)";
197 | var re=new RegExp(strRegex);
198 | if (re.test(str)){
199 |
200 | }
201 | /(.jpg|.gif)+(\?|\#|$)/.test('a/b/c.jpgsss'); //=> false
202 | /(.jpg|.gif)+(\?|\#|$)/.test('a/b/c.jpg?'); //=> true
203 | ```
204 |
205 | ### 用户名正则
206 |
207 | ```js
208 | //用户名正则,4到16位(字母,数字,下划线,减号)
209 | /^[a-zA-Z0-9_-]{4,16}$/.test("diaodiao");
210 | //输出 true
211 | ```
212 |
213 | ### 整数正则
214 |
215 | ```js
216 | /^\d+$/.test("42"); //正整数正则 -> 输出 true
217 | /^-\d+$/.test("-42"); //负整数正则 -> 输出 true
218 | /^-?\d+$/.test("-42"); //整数正则 -> 输出 true
219 |
220 | /^[0-9]+$/.test(25.5455) //正整数正则 -> 输出 false
221 | // 浮点数
222 | /^(?:[-+])?(?:[0-9]+)?(?:\.[0-9]*)?(?:[eE][\+\-]?(?:[0-9]+))?$/.test(0.2)
223 | ```
224 |
225 | ### 数字正则
226 |
227 | 可以是整数也可以是浮点数
228 |
229 | ```js
230 | /^\d*\.?\d+$/.test("42.2"); //正数正则 -> 输出 true
231 | /^-\d*\.?\d+$/.test("-42.2"); //负数正则 -> 输出 true
232 | /^-?\d*\.?\d+$/.test("-42.2"); //数字正则 -> 输出 true
233 | ```
234 |
235 | ### Email正则
236 |
237 | ```js
238 | //Email正则
239 | /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/.test("wowohoo@qq.com");
240 | //输出 true
241 |
242 | // 1.邮箱以a-z、A-Z、0-9开头,最小长度为1.
243 | // 2.如果左侧部分包含-、_、.则这些特殊符号的前面必须包一位数字或字母。
244 | // 3.@符号是必填项
245 | // 4.右则部分可分为两部分,第一部分为邮件提供商域名地址,第二部分为域名后缀,现已知的最短为2位。
246 | // 最长的为6为。
247 | // 5.邮件提供商域可以包含特殊字符-、_、.
248 | /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/.test("wowohoo@qq.com");
249 | ```
250 |
251 | ### 传真号码
252 |
253 | ```js
254 | // 国家代码(2到3位)-区号(2到3位)-电话号码(7到8位)-分机号(3位)
255 | /^(([0\+]\d{2,3}-)?(0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/.test('021-5055455')
256 | ```
257 |
258 | ### 手机号码正则
259 |
260 | ```js
261 | //手机号正则
262 | /^1[34578]\d{9}$/.test("13611778887");
263 | //输出 true
264 |
265 | //* 13段:130、131、132、133、134、135、136、137、138、139
266 | //* 14段:145、147
267 | //* 15段:150、151、152、153、155、156、157、158、159
268 | //* 17段:170、176、177、178
269 | //* 18段:180、181、182、183、184、185、186、187、188、189
270 | //* 国际码 如:中国(+86)
271 | /^((\+?[0-9]{1,4})|(\(\+86\)))?(13[0-9]|14[57]|15[012356789]|17[03678]|18[0-9])\d{8}$/.test("13611778887");
272 | ```
273 |
274 |
275 | ### URL正则
276 |
277 | ```js
278 | //URL正则
279 | /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/.test("http://wangchujiang.com");
280 | //输出 true
281 |
282 | //获取url中域名、协议正则 'http://xxx.xx/xxx','https://xxx.xx/xxx','//xxx.xx/xxx'
283 | /^(http(?:|s)\:)*\/\/([^\/]+)/.test("http://www.baidu.com");
284 |
285 | /^((http|https):\/\/(\w+:{0,1}\w*@)?(\S+)|)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/.test('https://www.baidu.com/s?wd=@#%$^&%$#')
286 |
287 | // 必须有协议
288 | /^[a-zA-Z]+:\/\//.test("http://www.baidu.com");
289 | ```
290 |
291 |
292 | ### IPv4地址正则
293 |
294 | ```js
295 | //ipv4地址正则
296 | /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test("192.168.130.199");
297 | //输出 true
298 | ```
299 |
300 | ### 十六进制颜色正则
301 |
302 | ```js
303 | //RGB Hex颜色正则
304 | /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/.test("#b8b8b8");
305 | //输出 true
306 | ```
307 |
308 | ### QQ号码正则
309 |
310 | ```js
311 | //QQ号正则,5至11位
312 | /^[1-9][0-9]{4,10}$/.test("398188661");//输出 true
313 | ```
314 |
315 | ### 微信号正则
316 |
317 | ```js
318 | //微信号正则,6至20位,以字母开头,字母,数字,减号,下划线
319 | /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/.test("jslite"); //输出 true
320 | ```
321 |
322 | ### 车牌号正则
323 |
324 | ```js
325 | //车牌号正则
326 | /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/.test("沪B99116") //输出 true
327 | ```
328 |
329 | ### 颜色值校验
330 |
331 | ```js
332 | // HEX 颜色正则
333 | /^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test("#ccb2b2")
334 | ```
335 |
--------------------------------------------------------------------------------
/front-end/Javascript/流程语句.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/流程语句.gif
--------------------------------------------------------------------------------
/front-end/Javascript/轻量高效的开源JavaScript插件和库.md:
--------------------------------------------------------------------------------
1 |
2 | 轻量高效的开源JavaScript插件和库
3 | ---
4 |
5 |
6 | - [图片](#图片)
7 | - [布局](#布局)
8 | - [轮播图](#轮播图)
9 | - [弹出层](#弹出层)
10 | - [音频视频](#音频视频)
11 | - [编辑器](#编辑器)
12 | - [字符串](#字符串)
13 | - [表单](#表单)
14 | - [存储](#存储)
15 | - [动画](#动画)
16 | - [时间](#时间)
17 | - [其它](#其它)
18 | - [加载器](#加载器)
19 | - [构建工具](#构建工具)
20 | - [测试](#测试)
21 | - [包管理器](#包管理器)
22 | - [CDN](#cdn)
23 |
24 |
25 |
26 | ## 图片
27 |
28 | - [baguetteBox.js](https://github.com/feimosi/baguetteBox.js) - 是一个简单易用的响应式图像灯箱效果脚本。[demo](https://feimosi.github.io/baguetteBox.js/)
29 | - [Lightgallery.js](https://github.com/sachinchoolur/lightgallery.js) - 是一个功能齐全的JavaScript图像灯箱插件。[demo](https://sachinchoolur.github.io/lightgallery.js/)
30 | - [viewerjs](https://github.com/fengyuanchen/viewerjs) - 是一个图像预览插件。[demo](https://fengyuanchen.github.io/viewerjs/)
31 | - [cropperjs](https://github.com/fengyuanchen/cropperjs) - 是一个图片编辑器插件。[demo](https://fengyuanchen.github.io/cropperjs/)
32 | - [photo-editor](https://github.com/fengyuanchen/photo-editor) - 是一个本地图片编辑器插件。[demo](https://fengyuanchen.github.io/photo-editor/)
33 | - [blazy.js](https://github.com/dinbror/blazy/) - 是一个懒惰加载插件。[demo](http://dinbror.dk/blazy/)
34 |
35 | ## 布局
36 |
37 | - [SuperEmbed.js](https://github.com/corbindavenport/superembed.js) - 是一个Javascript库,可检测出网页上的内嵌视频并使他们能够变成响应式元素。[demo](https://jsfiddle.net/h6x04LuL/)
38 | - [ScrollReveal](https://github.com/jlmakes/scrollreveal) - ScrollReveal插件使用户能够无比轻松地创建桌面和移动浏览器的网页滚动动画。[demo](https://scrollrevealjs.org/)
39 | - [Bricks.js](https://github.com/callmecavs/bricks.js) - 是一款超快的用于固定宽度元素的“砖石”布局生成器。[demo](http://callmecavs.com/bricks.js/)
40 |
41 | ## 轮播图
42 |
43 | - [Swipe](https://github.com/thebird/Swipe) - 准确的触摸滑块。[demo](http://thebird.github.io/Swipe/)
44 | - [Lory](https://github.com/meandmax/lory/) - 是一个由 Vanilla JavaScript 编写的拥有触摸功能的简约滑块。[demo](http://meandmax.github.io/lory/)
45 | - [baguetteBox.js](https://github.com/feimosi/baguetteBox.js) - 是一个简单、易用的响应式 Lightbox 图片库,它支持移动端上触滑动手势操作,无依赖。[demo](https://feimosi.github.io/baguetteBox.js/)
46 |
47 | ## 弹出层
48 |
49 | - [Popper.js](https://github.com/FezVrasta/popper.js) - 是一个轻量级的库用于管理工具提示和弹窗效果。[demo](https://popper.js.org/)
50 | - [SweetAlert2](https://github.com/limonte/sweetalert2) - 是一个颜值很高而且可以自定义的警告弹出窗口插件,可以代替Javascript的弹出窗口。[demo](https://limonte.github.io/sweetalert2/)
51 | - [artDialog](https://github.com/aui/artDialog) - 是一个经典、优雅的网页对话框控件。[demo](http://aui.github.io/artDialog/doc/index.html)
52 | - [layer](https://github.com/sentsin/layer) - 是一个web弹层组件。[demo](http://layer.layui.com)
53 |
54 | ## 音频视频
55 |
56 | - [Loud Links](https://github.com/mahdif/loud-links) - 是一个轻量级的JavaScript库用于添加交互声音到您的站点。[demo](http://loudlinks.rocks/#examples)
57 | - [flv.js](https://github.com/Bilibili/flv.js) - B 站 HTML5 播放器内核开源。
58 | - [Loud Links](https://github.com/mahdif/loud-links/) - 是一个轻量级 JavaScript 库,用于向您的网站添加交互音频。。[demo](https://loudlinks.rocks/)
59 |
60 | ## 编辑器
61 |
62 | - [MediumEditor](https://github.com/yabwe/medium-editor) - 仿Medium.com的所见即所得在线编辑器工具栏。[demo](https://yabwe.github.io/medium-editor/)
63 | - [Substance](https://github.com/yabwe/medium-editor) - 是一个基于Web的内容自定义编辑器。[demo](http://substance.io/examples/)
64 | - [flatpickr](https://github.com/chmln/flatpickr) - 是一个轻量级的代码高亮库,适用于任何编程语言。[demo](https://chmln.github.io/flatpickr)
65 | - [pen](https://github.com/sofish/pen) - 是一个Markdown编辑器工具。[demo](http://sofish.github.io/pen)
66 | - [aceAce](https://github.com/ajaxorg/ace)(Ajax.org Cloud9 Editor)。[demo](https://ace.c9.io/)
67 | - [CodeMirror](https://github.com/codemirror/CodeMirror)浏览器端的代码编辑器。[demo](http://codemirror.net/)
68 | - [esprima](https://github.com/ariya/esprima)用于综合分析的 ECMAScript 解析器。[demo](https://yabwe.github.io/medium-editor/)
69 | - [quill](https://github.com/quilljs/quill)一个带有 API 的跨浏览器富文本编辑器。([demo](http://quilljs.com/))
70 | - [ckeditor-releases](https://github.com/ckeditor/ckeditor-releases) 适用于每个人的 web 文本编辑器。[demo](http://ckeditor.com/demo)
71 | - [editor](https://github.com/lepture/editor) 一个 markdown 编辑器,但仍在开发中。[demo]( http://lab.lepture.com/editor/)
72 | - [EpicEditor](https://github.com/OscarGodson/EpicEditor) 一个可嵌入的 js Markdown的编辑器,拥有全屏编辑、即时预览、自动保存草稿和离线支持等功能。[demo](http://epiceditor.com)
73 | - [jsoneditor](https://github.com/josdejong/jsoneditor) 查看、编辑和格式化 JSON 的 web 工具。[demo](http://jsoneditoronline.org/)
74 | - [vim.js](https://github.com/coolwanglu/vim.js) 拥有持久化 ~/.vimrc 的 Vim 编辑器的 JavaScript 移植版本。[demo](http://coolwanglu.github.io/vim.js/emterpreter/vim.html)
75 | - [Squire](https://github.com/neilj/Squire) HTML5 富文本编辑器。[demo](http://neilj.github.io/Squire/)
76 | - [TinyMCE](https://github.com/tinymce/tinymce) JavaScript 富文本编辑器。[demo](https://www.tinymce.com/)
77 | - [trix](https://github.com/basecamp/trix) 由 Basecamp 制作,适用于每天写作的富文本编辑器。[demo](https://trix-editor.org/)
78 | - [Editor.md](https://github.com/pandao/editor.md) 由 Basecamp 制作,适用于每天写作的富文本编辑器。[demo](https://trix-editor.org/)
79 |
80 | ## 字符串
81 |
82 | - [selecting](https://github.com/EvandroLG/selecting) - 一个允许你获取用户选定文本的库。
83 | - [string.js](https://github.com/jprichardson/string.js) - 额外的 JavaScript 字符串方法。[demo](http://stringjs.com/)
84 | - [he](https://github.com/mathiasbynens/he) - 健壮的 HTML 实体编码/解码器。
85 | - [multiline](https://github.com/sindresorhus/multiline) - 多行字符串。
86 | - [query-string](https://github.com/sindresorhus/query-string) - 解析和字符串化 URL 查询字符串。
87 | - [URI.js](https://github.com/medialize/URI.js/) - URL 操作库。[demo](http://medialize.github.io/URI.js/)
88 | - [jsurl](https://github.com/Mikhus/jsurl) - 轻量的 URL 操作库。
89 | - [sprintf.js](https://github.com/alexei/sprintf.js) - 实现字符串格式化。
90 | - [url-pattern](https://github.com/snd/url-pattern) - 让 url 和其它字符串进行比正则表达式匹配更简单。字符串和数据可相互转化。
91 | - [Numeral.js](https://github.com/adamwdraper/Numeral-js) - 格式化和操作数字的 JS 库。 [demo](http://numeraljs.com/)
92 |
93 | ## 表单
94 |
95 | - [validator.js](https://github.com/jaywcjlove/validator.js) - 轻量级的JavaScript表单验证,字符串验证。[demo](http://jaywcjlove.github.io/validator.js)
96 | - [List.js](https://github.com/javve/list.js) - 是一个轻量级的为列表、表格或其他任何HTMLL标签增加了搜索,排序,过滤器和灵活性等元素。[demo](http://listjs.com/)
97 | - [Algolia Places](https://github.com/algolia/places/) - 是一个能让你在网页轻易实现搜索栏自动完成功能。[demo](https://community.algolia.com/places/)
98 | - [Cleave.js](https://github.com/nosir/cleave.js) - 是一个会在你输入时格式化你的``标签里面的内容。[demo](http://nosir.github.io/cleave.js/)
99 | - [validator.js](https://github.com/sofish/validator.js) - 是一个简单、轻量级,但功能强大的 Validator 组件。[demo](http://sofish.github.io/validator.js/)
100 | - [axios](https://github.com/mzabriskie/axios) - 是一个基于浏览器和node的HTTP请求库,绿色环保只有12kb。
101 |
102 | ## 存储
103 |
104 | - [store.js](https://github.com/jaywcjlove/store.js) - 本地存储localstorage的封装,提供简单的API。[demo](http://jaywcjlove.github.io/store.js)
105 | - [cookie.js](https://github.com/jaywcjlove/cookie.js) - 对操作cookie的封装,提供简单的AIP 兼容IE6。[demo](http://jaywcjlove.github.io/cookie.js)
106 | - [store.js](https://github.com/marcuswestin/store.js) - 为所有浏览器封装了LocalStorage,隐秘地使用localStorage、globalStorage和用户数据。
107 | - [localForage](https://github.com/mozilla/localForage) - 改善后的离线存储。封装了IndexedDB、WebSQL和localStorage。[demo](https://localforage.github.io/localForage)
108 | - [cross-storage](https://github.com/zendesk/cross-storage) - 获得权限后,能跨域名本地存储。
109 | - [basket.js](https://github.com/addyosmani/basket.js) - 用 localStorage 加载和缓存脚本的资源加载器。[demo](https://addyosmani.com/basket.js/)
110 | - [bag.js](https://github.com/nodeca/bag.js) - 可以缓存脚本和加载资源,增加了键值对接口和对localStorage/websql/indexedDB 的支持。
111 | - [basil.js](https://github.com/Wisembly/basil.js) - 智能的 JavaScript 数据持久层库。
112 | - [Cookies](https://github.com/ScottHamper/Cookies) - 客户端 Cookie 操作库。
113 | - [DB.js](https://github.com/aaronpowell/db.js/) - 基于 Promise 的、封装了 IndexedDB 的库。[demo](http://aaronpowell.github.io/db.js/)
114 | - [lawnchair.js](https://github.com/brianleroux/lawnchair/) - 简单的客户端 JSON 存储。[demo](http://brian.io/lawnchair/)
115 |
116 | ## 动画
117 |
118 | - [anime.js](https://github.com/juliangarnier/anime) - 是一个灵活轻便的JavaScript动画库。[demo](http://codepen.io/collection/XLebem/)
119 | - [three.js](https://github.com/mrdoob/three.js) - 是一个JS 3D库。[demo](https://threejs.org/)
120 | - [loaders.css](https://github.com/ConnorAtherton/loaders.css) - CSS 动画加载效果。[demo](https://connoratherton.com/loaders)
121 | - [Hover.css](https://github.com/IanLunn/Hover) - 一款基于 CSS3 的悬停特效合集。[demo](http://ianlunn.github.io/Hover/)
122 | - [Effeckt.css](https://github.com/h5bp/Effeckt.css) - 一个包含众多精妙的 CSS3 切换和动画效果库。[demo](http://h5bp.github.io/Effeckt.css/)
123 | - [Magic Animations](https://github.com/miniMAC/magic) - 一个独特的 CSS3 动画特效包。[demo](https://minimamente.com/example/magic_animations/)
124 | - [Transformicons](https://github.com/grayghostvisuals/transformicons) - 一个结合 SVG、CSS 和 HTML 技术,让图标、按钮和符号具有变种(特殊)动画效果的库。[demo](http://www.transformicons.com/)
125 | - [SpinKit](https://github.com/tobiasahlin/SpinKit) - 一款 CSS 加载动画合集,可高度自定义动画效果。[demo](http://tobiasahlin.com/spinkit/)
126 | - [d3-ease](https://github.com/d3/d3-ease) - 这是一个让动画更为平滑的 Easing 库。
127 | - [ScrollMagic](https://github.com/janpaepke/ScrollMagic) - 一个用来创建魔幻滚动交互的 JavaScript 库,可以像使用进度条一样使用滚动条。[demo](http://scrollmagic.io/)
128 | - [ScrollReveal](https://github.com/jlmakes/scrollreveal) - 一款页面滚动显示动画,可以播放一次也可以播放无限次,能让页面更加有趣,更吸引用户眼球。。[demo](https://scrollrevealjs.org/)
129 | - [RELLAX.js](https://github.com/dixonandmoe/rellax) - 是一款主打轻量级的纯 JavaScript 视差效果库。[demo](https://dixonandmoe.com/rellax/)
130 | - [CountUp.js](https://github.com/inorganik/CountUp.js) - 可以用来快速创建以一种更有趣的动画方式显示数值数据。[demo](https://inorganik.github.io/countUp.js/)
131 | - [Dynamics.js](http://dynamicsjs.com/) - 可以创建物理运动动画效果 JavaScript 库。[demo](https://github.com/michaelvillar/dynamics.js)
132 | - [Mojs](https://github.com/legomushroom/mojs) - 一个拥有极简的声明式 API ,能够轻松掌控运动轨迹,为运动图形而生的工具库。[demo](http://mojs.io/)
133 | - [React FLIP Move](https://github.com/joshwcomeau/react-flip-move) - 一个翻转移动的库,旨在解决当列表的顺序发生变化时,项目列表动画化的问题。[demo](http://joshwcomeau.github.io/react-flip-move/examples/#/shuffle?_k=og3e8m)
134 | - [tween.js](https://github.com/tweenjs/tween.js) - 是一个JS 平滑动画库。[demo](http://tweenjs.github.io/tween.js/examples/12_graphs_custom_functions.html)
135 | - [vivus](https://github.com/maxwellito/vivus) - JavaScript库,使SVG绘制动画。[demo](http://maxwellito.github.io/vivus/)
136 | - [Choreographer-js](https://github.com/christinecha/choreographer-js) - 是一个用于处理复杂动画的简单库。[demo](https://christinecha.github.io/choreographer-js/)
137 | - [minirefresh](https://github.com/minirefresh/minirefresh) - 优雅的H5下拉刷新。零依赖。[demo](https://minirefresh.github.io/minirefresh-doc/minirefresh-doc/guid/guid_effect.html)
138 |
139 | ## 时间
140 |
141 | - [moment](https://github.com/moment/moment) - 是一个日期处理类库,用于解析、检验、操作、以及显示日期。[demo](http://momentjs.com)
142 | - [date-fns](https://github.com/date-fns/date-fns) - 现代JavaScript日期实用程序库。[demo](https://date-fns.org/)
143 | - [luxon](https://github.com/moment/luxon) - 在JS中使用日期和时间的库。[demo](https://moment.github.io/luxon/)
144 | - [timesheet.js](https://github.com/sbstjn/timesheet.js) - 是一个时间展示片段插件。[demo](https://sbstjn.github.io/timesheet.js)
145 | - [date.js](https://github.com/jaywcjlove/date.js) - 是一个格式化时间、过去时间展示、解决因时区变更插件。
146 | - [timeago.js](https://github.com/hustcc/timeago.js) - 格式化时间显示多久以前的插件。 [demo](http://timeago.org/)
147 | - [rome](https://github.com/bevacqua/rome) - 可定制的日期(和时间)选择器。无依赖,可选 UI。 [demo](https://bevacqua.github.io/rome/)
148 | - [moment-timezone](https://github.com/moment/moment-timezone) - 基于 moment.js 的时区库。[demo](http://momentjs.com/timezone)
149 | - [date](https://github.com/MatthewMueller/date) - 拥有人性化的 Date() 方法。[demo](http://matthewmueller.github.io/date/)
150 | - [ms.js](https://github.com/rauchg/ms.js) - 小巧的毫秒转换工具。
151 |
152 | ## 其它
153 |
154 | - [hotkeys](https://github.com/jaywcjlove/hotkeys) - 是一个强健的 Javascript 库用于捕获键盘输入和输入的组合键。[demo](http://jaywcjlove.github.io/hotkeys/ )
155 | - [clipboard.js](https://github.com/zenorocha/clipboard.js) - 现代复制到剪贴板。没有Flash,gzip压缩只有3KB 。[demo](https://clipboardjs.com/)
156 | - [translater.js](https://github.com/jaywcjlove/onlinenetwork) - 这是一个利用HTML注释的页面翻译解决方案。[demo](https://jaywcjlove.github.io/translater.js/)
157 | - [scrollama](https://github.com/russellgoldenberg/scrollama) - 为 Scrollytelling 开发的现代、轻量级的 JavaScript 库。[demo](https://russellgoldenberg.github.io/scrollama/basic)
158 | - [Push.js](https://github.com/jaywcjlove/translater.js) - 是一个跨浏览器的Javascript桌面通知插件。[demo](http://nickersoft.github.io/push.js/)
159 | - [onlinenetwork](https://github.com/jaywcjlove/onlinenetwork) - js判断是否断网了。
160 | - [iNotify](https://github.com/jaywcjlove/iNotify) - 是一个实现浏览器的 title 闪烁、滚动、声音提示、chrome、等系统通知。[demo](http://jaywcjlove.github.io/iNotify)
161 | - [tesseract.js](https://github.com/naptha/tesseract.js) - 是一个文字识别转换,可以运行在浏览器和服务器NodeJS上。[demo](http://tesseract.projectnaptha.com/)
162 | - [Leaflet.js](http://github.com/Leaflet/Leaflet) - 是一个开源的移动友好交互式地图 JavaScript 库。体积仅有 33 KB。[demo](http://leafletjs.com/)
163 | - [CurrencyFormatter.js](https://github.com/osrec/currencyFormatter.js/) - 是一款简单纯JS格式化155种不同国家货币格式库,gzip压缩后仅7KB。[demo](https://osrec.github.io/currencyFormatter.js/)
164 | - [Feature.js](https://github.com/osrec/currencyFormatter.js/) - 是一个快速、简单、轻量级的浏览器功能检测库。它没有任何的依赖,并且 gzip 压缩后仅有1kb。[demo](hhttp://featurejs.com/)
165 | - [screenfull.js](https://github.com/sindresorhus/screenfull.js) - 极小、跨平台的 JavaScript 全屏插件。[demo](https://sindresorhus.com/screenfull.js/)
166 |
167 | ## 加载器
168 |
169 | - [requirejs](https://github.com/requirejs/requirejs) - JS模块化工具
170 | - [SeaJS](https://github.com/seajs/seajs) - JavaScript模块加载框架
171 | - [loadjs](https://github.com/muicss/loadjs) - JavaScript模块加载框架
172 | - [ESL](https://github.com/ecomfe/esl) - 浏览器端AMD标准加载器
173 |
174 | ## 构建工具
175 |
176 | - [webpack](https://github.com/webpack/webpack) - 前端构建工具
177 | - [Gulp](https://github.com/gulpjs/gulp) - 自动化构建工具
178 | - [Babel](https://github.com/babel/babel) - 下一代JavasScript语法编译器
179 | - [PostCSS](https://github.com/postcss/postcss) - 利用JS插件转换CSS样式的工具
180 | - [Grunt](https://github.com/gruntjs/grunt) - JavaScript世界的构建工具
181 | - [rollup.js](https://github.com/rollup/rollup) - JS模块打包器
182 | - [webpack-dashboard](https://github.com/FormidableLabs/webpack-dashboard) - webpack开发服务器的CLI仪表板
183 | - [traceur-compiler](https://github.com/google/traceur-compiler) - 支持ES6的JS编译器
184 | - [brunch](https://github.com/brunch/brunch) - 超快的HTML5构建工具
185 | - [Helium-css](https://github.com/geuis/helium-css) - 显示网站中未使用的CSS
186 |
187 | ## 测试
188 |
189 | - [mocha](https://github.com/mochajs/mocha) - JavaScript 测试框架
190 | - [ESLint](https://github.com/eslint/eslint) - JavaScript代码检查工具
191 | - [JSHint](https://github.com/jshint/jshint) - JavaScript语法和风格检查工具
192 | - [casperjs](https://github.com/casperjs/casperjs) - 开源的导航脚本处理和测试工具
193 | - [Nightwatch](https://github.com/nightwatchjs/nightwatch) - 用户界面自动化测试框架
194 | - [istanbul](https://github.com/gotwarlost/istanbul) - JS代码覆盖工具
195 | - [intern](https://github.com/theintern/intern) - JavaScript测试系统
196 | - [benchmark.js](https://github.com/bestiejs/benchmark.js) - 强大的JavaScript基准库
197 | - [loadtest](https://github.com/alexfernandez/loadtest) - HTTP或WebSockets URL的负载测试
198 | - [JSCover](https://github.com/tntim96/JSCover) - JavaScript代码覆盖测量工具
199 |
200 | ## 包管理器
201 |
202 | - [yarn](https://github.com/yarnpkg/yarn) - 新的 Hadoop 资源管理器
203 | - [bower](https://github.com/bower/bower) - web包管理器
204 | - [npm](https://github.com/npm/npm) - NodeJS包安装的管理模块
205 | - [ndm](https://github.com/720kb/ndm) - npm桌面管理器
206 |
207 | ## CDN
208 |
209 | - https://cdnjs.com
210 | - http://cdnjs.net
211 | - http://www.jsdelivr.com
212 | - http://unpkg.com
213 | - http://rawgit.com
214 | - http://staticfile.org
215 | - http://www.bootcdn.cn
216 | - http://cdn.baomitu.com
217 | - http://lib.sinaapp.com
218 | - http://cdn.code.baidu.com
219 | - http://jscdn.upai.com
220 | - https://www.asp.net/ajax/cdn
221 | - http://libs.sun0769.com
222 | - https://css.net
223 | - https://developers.google.com/speed/libraries/
--------------------------------------------------------------------------------
/front-end/Javascript/运算符.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poetries/handbook/f190fe22ae116414f9348f1a615ebb1b0dbe879b/front-end/Javascript/运算符.gif
--------------------------------------------------------------------------------