KayChen

记录技术生活的点点滴滴

0%

1.安装certbot

1
sudo yum install certbot

2.生成域名证书

1
certbot certonly --standalone -d youdomain.com -d www.youdomain.com

or

1
certbot certonly  -d *.kaychen.cn --preferred-challenges dns --manual --server https://acme-v02.api.letsencrypt.org/directory

3.配置Nginx SSL站点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name www.youdomain.com youdomain.com;
return 301 https://$server_name$request_uri;
}

server{
listen 443 ssl;
server_name www.youdomain.com youdomain.com;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/www.youdomain.com;
ssl on;
ssl_certificate /etc/letsencrypt/live/youdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/youdomain.com/privkey.pem;

……
}

其中return 301 https://$server_name$request_uri;是用来实现80端口到443端口的流量跳转的.
重启Ningx即可

4.查看证书

可使用下列命令:

1
certbot certificates

就可以看到当前机器所有域名的证书情况,包括域名、 到期日、证书路径、私钥路径四条信息。

5.更新证书

因Let’s Encrypt提供的免费证书有效期为90天,所以我们通过以下语句通过续期

1
certbot renew --quiet 

更新所有站点证书

参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python
#coding:utf-8
import re
import sys
import time
import urllib2

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support import ui

#设置user-agent
dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0 ")

#设置参数
service_args = ['--proxy=192.168.1.201:7070','--proxy-type=socks5','--ignore-ssl-errors=true']
driver = webdriver.PhantomJS(executable_path='/root/phantomjs2.1.1/bin/phantomjs', desired_capabilities=dcap,service_args=[])
driver.maximize_window()
wait = ui.WebDriverWait(driver, 10)

#登录alivv
url = "http://www.alivv.com"
driver.get(url)
wait.until(lambda dr: dr.find_element_by_css_selector(".login_login").is_displayed())
driver.find_element_by_css_selector(".login_login").click()
driver.find_element_by_css_selector("#email").send_keys("kaychen")
driver.find_element_by_css_selector("#pass").send_keys("0516*****")
driver.find_element_by_css_selector("#jzpass").click()
driver.find_element_by_css_selector("#submitFormBtn").click()
#进入会员中心
driver.find_element_by_css_selector("#sname a").click()
#输出页面源码
print driver.page_source
time.sleep(3)
driver.save_screenshot('/tmp/screen.png')
driver.quit()

一.升级nodejs

  1. 安装n
    1
    sudo npm install -g n
  2. 使用n来管理版本
    1
    2
    3
    4
    sudo n lts 长期支持
    sudo n stable 稳定版
    sudo n latest 最新版
    sudo n 8.4.0 直接指定版本下载
  3. 查看node版本 node -v

二.升级npm

1
sudo npm install -g npm

Why?(使用ES目标)

解决根据progress和账号获取订单列表Mysql性能瓶颈

How?

将每个订单的查询条件都存储到ES,进行索引,所有订单支持搜索的条件都添加到索引Mapping字段中去,(如何解决延迟问题?)

一、安装

  1. 依赖
  • Java
  • Node
  1. 下载
  1. 部署ES

    1. 主节点配置文件elasticsearch-master/config/elasticsearch.yml添加

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # 允许ElasticSearch-Head访问
      http.cors.enabled: true
      http.cors.allow-origin: "*"
      # 设置集群名称
      cluster.name: order
      # 设置节点名称
      node.name: master
      # 设置为主节点
      node.master: true
      # 指定主机IP
      network.host: 127.0.0.1
    2. 从节点配置文件elasticsearch-slave/config/elasticsearch.yml添加

      1
      2
      3
      4
      5
      6
      7
      8
      # 设置集群名称
      cluster.name: order
      # 设置节点名称
      node.name: slave01
      # 指定端口
      http.port: 9201
      # 指定集群主节点IP
      discovery.zen.ping.unicast.hosts: ["127.0.0.1"]
    3. 启动./bin/elasticsearch -d

  2. 部署ES-HEAD

    1
    2
    3
    cd elasticsearch-head
    npm install
    npm run start

    访问http://localhost:9100/

二、使用

1.创建索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
PUT http://127.0.0.1:9200/chengdan
{
"settings":{
"number_of_shards" : 1
},
"mappings":{
"order":{
"properties":{
"order_id":{
"type":"integer"
},
"toh_account_id":{
"type":"integer"
},
"tob_account_id":{
"type":"integer"
},
"progress":{
"type":"integer"
},
"updated_at":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
}
}
}
}
}
2.创建文档
1
2
3
4
5
6
7
8
POST http://127.0.0.1:9200/chengdan/order/34756359
{
"order_id":34756359,
"toh_account_id":10000002,
"tob_account_id":1226,
"progress":10,
"updated_at":"2018-03-10 12:10:10"
}
3.查询文档
1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST http://127.0.0.1:9200/chengdan/order/_search
{
"query":{
"bool":{
"must":[
{"terms":{"toh_account_id":[10000001,10000001]}},
{"terms":{"progress":[10,11,20]}}
]
}
},
"sort":[
{"updated_at":{"order":"desc"}}
]
}
4.修改文档
1
2
3
4
5
6
7
POST http://127.0.0.1:9200/chengdan/order/34756359/_update
{
"doc":{
"progress":20,
"updated_at":"2018-03-12 20:00:00"
}
}

一.Server部署

  1. 更新源 sudo apt-get update

  2. 安装python-pip sudo apt-get install python-pip

  3. 安装shadowsocks sudo pip install shadowsocks

  4. 编写配置文件sudo vim /etc/shadowsocks.json

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
    "server": "0.0.0.0",
    "server_port": 9999,
    "local_address": "127.0.0.1",
    "local_port": 5555,
    "password": "******",
    "method": "aes-256-cfb",
    "fast_open": true,
    "timeout":300
    }
  5. 启动服务 sudo ssserver -c /etc/shadowsocks.json -d start

二.客户端下载

Client下载

三.备注

  • Ubuntu18.04需修正openssl版本问题,替换EVP_CIPHER_CTX_cleanupEVP_CIPHER_CTX_reset

    sudo sed -i 's/EVP_CIPHER_CTX_cleanup/EVP_CIPHER_CTX_reset/g' /usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py

对于Python开发用户来讲,PIP安装软件包是家常便饭。但国外的源下载速度实在太慢,浪费时间。而且经常出现下载后安装出错问题。所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安装成功率。

国内源

这样就会从清华这边的镜像去安装pyspider库

永久修改,一劳永逸

Linux下,修改 ~/.pip/pip.conf (没有就创建一个文件夹及文件。文件夹要加“.”,表示是隐藏文件夹)

1
2
3
4
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com

windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini。内容同上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
iptables -P INPUT ACCEPT/DROP
iptables -P OUTPUT ACCEPT/DROP
iptables -P FORWARD ACCEPT/DROP

iptables -F #清除预设表filter中的所有规则链的规则
iptables -X #清除预设表filter中使用者自定链中的规则
iptables -Z #清除预设表filter中使用者自定链中的规则
iptables -L -n #查看
iptables-save #预览规则内容
service iptables save #保存到默认文件
service iptables restart #重启


#接纳属於现存及相关连接的压缩
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允许icmp包通过,也就是允许ping
iptables -A INPUT -p icmp -j ACCEPT
#允许loopback(不然会导致DNS无法正常关闭等问题)
iptables -A INPUT -i lo -j ACCEPT
#添加必要端口
iptables -A INPUT -s 192.168.0.0/16 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -j REJECT #拒绝其他
iptables -A FORWARD -j REJECT #拒绝转发


iptables -L --line-numbers #显示行号
iptables -D INPUT 8 #删除INPUT的第8条规则

LVM扩展根目录空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
df -h #查看挂载 /dev/mapper/前缀的表示支持LVM扩展
yum install lvm2* part* #必要工具
fdisk -l #查看新硬盘
fdisk /dev/sdb #硬盘分区 需手动输入指令
#输入n进行分区
#输入p为主分区
#输入1(一个主分区)
#输入回车(起始磁盘数默认)
#输入回车(磁盘大小默认全部)
#输入t修改分区格式
#输入8e(LVM必须为此格式)
#输入p查看分区
#输入w写入分区

mkfs.ext4 /dev/sdb1 #格式化分区
partprobe #重新读取分区表 无需重启
pvcreate /dev/sdb1 #创建物理卷(physical volume)
pvscan #查看物理卷
pvdisplay #查看物理卷详情
vgscan #查看卷组(Volume Group)
vgdisplay #查看卷组详情
vgextend VolGroup00 /dev/sdb1 #扩展VolGroup00
lvscan #查看逻辑卷(logical volume)
lvdisplay #查看逻辑卷详情 以lv_root为例
lvextend -L +100G /dev/VolGroup00/lv_root #扩展lv_root 精确扩展可用-l指定PE扩展
resize2fs /dev/VolGroup00/lv_root #重设lv_root大小
df -h #查看挂载情况,已经扩容

#非LVM扩展空间
fdisk -l #查看硬盘
fdisk /dev/sdb #硬盘分区 需手动输入指令
#输入n进行分区
#输入p为主分区
#输入1(一个主分区)
#输入回车(起始磁盘数默认)
#输入回车(磁盘大小默认全部)
#输入p查看分区
#输入w写入分区

mkfs.ext4 /dev/sdb1 #格式化分区
mv /var/lib/redis /backup #先备份
mkdir /var/lib/redis
mount /dev/sdb1 /var/lib/redis
mv /backup/redis/* /var/lib/redis
echo "/dev/sdb1 /var/lib/redis ext4 defaults 0 0" >> /etc/fstab
#修改/etc/fstab 加入启动挂载

BUG1

Laravel Class log does not exist
在一个Laravel的项目下执行composer update,或者php artisan就是不成功,提示Uncaught ReflectionException: Class log does not exist,而根据提示的错误找不出原因。
报错内容如下:

1
2
3
4
5
6
7
8
9
PHP Fatal error:  Uncaught ReflectionException: Class log does not exist in /usr/share/nginx/html/tanteng.me/vendor/illuminate/container/Container.php:738
Stack trace:
#0 /usr/share/nginx/html/tanteng.me/vendor/illuminate/container/Container.php(738): ReflectionClass->__construct('log')
#1 /usr/share/nginx/html/tanteng.me/vendor/illuminate/container/Container.php(633): Illuminate\Container\Container->build('log', Array)
#2 /usr/share/nginx/html/tanteng.me/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(687): Illuminate\Container\Container->make('log', Array)
#3 /usr/share/nginx/html/tanteng.me/vendor/illuminate/container/Container.php(853): Illuminate\Foundation\Application->make('log')
#4 /usr/share/nginx/html/tanteng.me/vendor/illuminate/container/Container.php(808): Illuminate\Container\Container->resolveClass(Object(ReflectionParameter))
#5 /usr/share/nginx/html/tanteng.me/vendor/illuminate/container/Container.php(777): Illuminate\Container\Container->getDependencies(Array, Array)
#6 /usr/share/nginx/htm in /usr/share/nginx/html/tanteng.me/vendor/illuminate/container/Container.php on line 738

后来解决办法是安装mysqld的扩展,是因为缺少这个扩展导致的异常。网上也有很多网友遇到类似的问题,但是其他原因导致的,如没有开启shor_open_tag,.env包含空格等。

参考链接:http://stackoverflow.com/questions/34978828/uncaught-reflectionexception-class-log-does-not-exist-laravel-5-2

laravel项目目录权限改成755 -R
且storeage目录权限改成777 -R

BUG2

laravel-wechat

1
composer require "overtrue/laravel-wechat"

安装参考:laravel-wechat

csrf排除wechat

vim Http/Middleware/VerifyCsrfToken :

1
2
3
4
protected $except = [
'wechat'
];

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
upstream server-api{
# api 代理服务地址
server 127.0.0.1:3110;
}
upstream server-resource{
# 静态资源 代理服务地址
server 127.0.0.1:3120;
}
server {
listen 3111;
server_name localhost; # 这里指定域名
root /home/www/server-statics;
# 匹配 api 路由的反向代理到API服务
location ^~/api/ {
rewrite ^/(.*)$ /$1 break;
proxy_pass http://server-api;
}
# 假设这里验证码也在API服务中
location ^~/captcha {
rewrite ^/(.*)$ /$1 break;
proxy_pass http://server-api;
}
# 假设你的图片资源全部在另外一个服务上面
location ^~/img/ {
rewrite ^/(.*)$ /$1 break;
proxy_pass http://server-resource;
}
# 路由在前端,后端没有真实路由,在路由不存在的 404状态的页面返回 /index.html
# 这个方式使用场景,你在写React或者Vue项目的时候,没有真实路由
location / {
try_files $uri $uri/ /index.html =404;
}
}