JMeter在MacOS上安装

前言

Apache JMeter是 Apache 组织开发的基于 Java 的压力测试工具。用于对软件做压力测试,它最初被设计用于 Web 应用测试,但后来扩展到其他测试领域。

下载

本文选用 JMeter 5.4.1 版本安装,注意需要 JDK 1.8 + 版本环境。

输入以下命令可用于检查本机是否准备就绪

1
2
java -version # 检查JDK版本
/usr/libexec/java_home -V # 列出所有JDK版本的JAVA_HOME

Jmeter 5.3 下载

配置环境变量

解压下载的文件,放在合适的目录,然后开始配置  bash_profile  文件。

如执行 open ~/.bash_profile 反馈 .bash_profile does not exist. 需考虑 vim .bash_profile 此文件。

添加如下:

1
2
3
4
export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home
export JAVA_HOME=$JAVA_8_HOME
export JMETER_HOME=/Users/user/Documents/apache-jmeter-5.4.1
export PATH=$PATH:$JMETER_HOME/bin:

成功后执行 source ~/.bash_profile 然后控制台直接执行 <font style="color:#3A3A3A;">jmeter</font> 即可启动

开始使用 Jmeter

一、本地化

使用前可以在 Jmeter 的根目录下的 bin 文件夹配置 jmeter.properties 文件进行切换中文,重启生效。

或者启动后,点击 Option - Chose Language - Chinese 切换中文即可

二、简单使用

创建线程组 - 设置线程组 - 创建 HTTP 请求 - 配置 HTTP 请求 - 添加运行结果分析监听器 - 聚合报告 - 汇出图形结果即可。

转载:https://blog.csdn.net/Liu_KH/article/details/88820334

定时任务计划crontab

何为 crontab

crontab 是用来定期执行程序的命令,当安装完成操作系统后,默认便会启动此任务调度命令,crond 命令每分钟会定期检查是否要执行。

查看 crontab 服务

systemctl status crond

任务计划格式

(分)(时)(日)(月)*(周) 周期执行的程序

#最长是每年,最短是每分

查看 cron 任务计划

crontab -l

编辑 cron 任务计划

crontab -e

删除所有 cron 任务计划

crontab -r

解析CRON 表达式

crontab 执行时间计算

使用Vue嵌Cordova开发总结

1. build 下无法调用 cordova

需要监听 deviceready 事件完成后再加载 vue 页面:

2. dev 下无法调用 cordova

注意 cordova 下各 plugin 是否完全加载,正常 cordova_plugins.json 应该为 404

1
2
'/cordova_plugins.json': { target: 'http://127.0.0.1:' + PORT + '/mock',
changeOrigin: true }

unofficial API for xiami

千言万语

晚安 xiami.fm

直接食用

  1. 获取专辑相关信息

[https://xplaylist.leanapp.cn/album/:id](https://xplaylist.leanapp.cn/album/:id)

id: 专辑的 StringId

  1. 获取歌单相关信息

[https://xplaylist.leanapp.cn/collect/:id?page=&pageSize=](https://xplaylist.leanapp.cn/collect/:id?page=&pageSize=)

id: 歌单的 StringId

page: 页码

pageSize: 每页条目数

  1. 获取艺人的热门歌曲信息

[https://xplaylist.leanapp.cn/artist/:id?page=&pageSize=](https://xplaylist.leanapp.cn/artist/:id?page=&pageSize=)

id: 艺人的 StringId

page: 页码

pageSize: 每页条目数

  1. 获取歌曲相关信息

[https://xplaylist.leanapp.cn/song/:id/info](https://xplaylist.leanapp.cn/song/:id/info)

id: 歌曲 id

  1. 获取歌曲相关信息

[https://xplaylist.leanapp.cn/songs/:ids/info](https://xplaylist.leanapp.cn/songs/:ids/info)

ids: 歌曲 id 列表,支持多个逗号分隔

  1. 获取歌曲音乐文件相关信息

[https://xplaylist.leanapp.cn/song/:id](https://xplaylist.leanapp.cn/song/:id)

id: 歌曲 id

  1. 获取歌曲音乐文件相关信息

[https://xplaylist.leanapp.cn/songs/:ids](https://xplaylist.leanapp.cn/songs/:ids)

ids: 歌曲 id 列表,支持多个逗号分隔

  1. 搜索

[https://xplaylist.leanapp.cn/search?key=](https://xplaylist.leanapp.cn/search?key=)

key: 关键词

备注:

请勿商业用途。

vue中修改props传进来的值浅析

众所周知,vue 是单向数据流,一般我们也不会在子组件里面修改父组件传进来的值,但总有需要修改的时候。不过值得注意的是,vue 官方不推荐直接在子组件中修改父组件传来的 props 的值。

[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop’s value. Prop being mutated: “result” (found in component )

在子组件修改 props 的方法:

1.子组件 data 中拷贝一份,注意引用类型需要深拷贝,根据需求可以 watch 监听

1
2
data() { return { newList: this.list.slice() } }, watch: { list(newVal) {
this.newList = newVal } }

2.通过计算属性修改

1
2
computed: { nList() { return this.list.filter(item => { return item.isChecked })
} }

3.sync 修饰符

1
2
3
4
// 父组件
<todo-list :list.sync="list" />

// 子组件 methodName(index) { this.$emit('update:list', this.newList) }

npm start 持久化运行

  • 直接键入 which nohup

复制这个地址,默认是 /usr/bin/nohup

  • 编辑用户环境变量 vi ~/.bash_profile

于 PATH=$PATH:$HOME/bin

后面添加

PATH=$PATH:$HOME/bin:/usr/bin/nohup

  • 加载环境变量:source ~/.bash_profile

  • 执行启动命令:nohup npm start &

执行成功会看到进程 PID 提醒

[1] 17073

nohup: 忽略输入并把输出追加到”nohup.out”

原程序的的标准输出被自动改向到当前目录下的 nohup.out 文件,起到了 log 的作用

  • 停止进程:
1
2
3
ps -ef | grep npm
ps -ef | grep node
kill -9 17073

Discuz!报错问题汇总

1、解决 X3.2 全局 HTTPS 问题思路

购买 SSL 证书

购买适合自己论坛的 SSL 证书,证书大致上分为标准型 DV SSL 证书、企业型 OV SSL 证书以及增强型 EV SSL 证书。

在服务端 WEB 服务器配置

参考文档:点击具体查看各种 WEB 服务器配置

在后台配置全局 HTTPS

进入 admin.php 后台,点击全局 - 站点信息 - 网站 URL 填写 https://yourdomain.com/admin.php

修成 Discuz 适配 https

如果你的 Web 服务是 Apache,请忽略这一步,Nginx 请继续看

Discuz 判断网站是否启动 SSL 是采用 $_SERVER[‘HTTPS’] 的方式,此方法不支持 Nginx(nginx+php-fpm),需要先做一些修改,让 Discuz 使用 $_SERVER[‘SERVER_PORT’]来判断网站是否启用 SSL

进入安装 DIscuz 根目录右键修改 public_html/source/class/discuz/discuz_application.php

1
$_G['isHTTPS'] = ($_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false;

修改为:

1
$_G['isHTTPS'] = ($_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false;

进入安装 DIscuz 根目录继续修改 public_html/uc_server/avatar.php

1
define('UC_API', strtolower(($_SERVER['HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));

修改为:

1
define('UC_API', strtolower(($_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));

后台 Ucenter 通信使用 https 方式

若不更改亦可以,这一步可以忽略

进入 admin.php 后台,点击站长 - UCenter 设置 - UCenter 访问地址将 http 改为 https 其后将头像调用方式改为使用静态地址调用头像。

后台 Ucenter 无法通信

审查元素,观察 return error 然后去官方找到相应的解决方法。

修成 Discuz 文章 https

进入安装 DIscuz 根目录继续修改 public_html/source/function/function_core.php

于<font style="color:#F5222D;">$content = output_replace($content);</font>代码下方处添加

<font style="color:#F5222D;">$content = str_replace('http://www.xxx.com','https://www.xxx.com',$content);</font>

如果你有二级目录请这样添加

<font style="color:#F5222D;">$content = preg_replace('http://(.*?)xxx.com','https://\1xxx.com',$content);</font>


2、X3.2 升级至最新 X3.4 总结

准备前置条件:

DiscuzX 程序版本:Discuz! X3.2 Release 20141225 DiscuzX

后台版本:UCenter 1.6.0 DiscuzX

最新版本下载地址:https://gitee.com/3dming/DiscuzL/attach_files

操作步骤:

1)备份数据库,导出转储 SQL 文件结构和数据;

2)备份服务端网站目录;

3)创建 old 新文件夹,除了 data , config , uc_client , uc_server 目录以外的文件夹均移动进入 old 新文件夹内,注意 old 文件夹为小写字母;

4)通过 ftp 上传最新的服务端文件,注意分清下载的最新版本编码对应服务器正在使用的编码;

5)关闭站点,关闭服务端 web 服务;

6)将上传完毕解压后的 upload 文件夹内所有文件复制并替换服务端网站目录。

7)上传 utility 目录中的 update.php 文件到 install 目录中,删除 install.php 文件,并确保 install/data 中的 sql 文件完整。

8)执行 https://yourwebsite/install/update.php 按步骤完成升级。

最后尝试访问网站是否有异常,使用管理员登录站点后台,更新缓存。步骤为:后台=>工具=>更新缓存,完成升级。

升级过程中遇到的问题:

1.如果选择“是”您的站点将恢复站点默认风格,则你原网站风格、SEO 和 logo 全部还原为原始模版风格,注意升级选择。

2.在升级后无法登录后台

先确定你的账号在数据库内是否为管理员或者被清空,如无问题再找到根目录下的 uc_server/model 目录里的 admin.php 文件,并搜索代码 <font style="color:#F5222D;">$this->cookie_status = 0;</font> 修改为 <font style="color:#F5222D;">$this->cookie_status = isset($_COOKIE['sid']) ? 1 : 0;</font> 即可。

3.在升级时候遇到错误 【SELECT skey FROM common_setting WHERE skey=’strongpw’ LIMIT 1】

遇到 SQL 问题可以尝试 SQL 语句执行一下,很明显可以确定到 1146 问题,没有该表。尝试 creat common_setting 表即可,遇到这个问题的,后续也可能会遇到 common_syscache 表缺少 和 common_member 缺失 realname 字段,这里建议核对一下。这里我创建字段时候,选择 varchar(25)

4.在升级的时候遇到错误【请手工执行以下升级语句 XXX】

遇到又是 SQL 问题,先确定是否 SQL 语句执行正常。然后判断逻辑,这里 update.php 其实是官方升级程序,通过改表的方式升级的一个 bug.多年未改,只干了改表的事和新建表的事,改完表后,原来不存在了,但程序里却在对该表进行查询操作,所以会报“表不存在”的错误,导致升级程序终止,不能继续升级。

解决方法,即注释 <font style="color:#F5222D;">if(!empty($oldcols[$key]))</font> 至 <font style="color:#F5222D;">... ADO PRIMARY KEY ...</font> 代码,刷新页面重新升级即可。

5.第一个步骤提示验证失败,无法进行升级

跳过第一个升级步骤,直接访问 https://yourwebsite/install/update.php?step=prepare 即可。

6.升级后发现许多地方乱码了

请核对字符编码为 UTF-8 简繁 还是 GBK


3、Discuz 开启 Redis

Windows 系统操作

参考 CentOS 操作步骤

CentOS 系统操作

1.查看 php 版本

1
2
3
[root@VM_0_2_centos ~]# php -v
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/redis.so' - /usr/lib64/php/modules/redis.so: undefined symbol: igbinary_unserialize in Unknown on line 0 PHP 5.6.40 (cli) (built: Jan 12 2019 09:19:57) Copyright (c) 1997-2016 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
[root@VM_0_2_centos ~]#

2. 查看 php-redis 扩展包全名

<font style="color:#F5222D;">yum list | grep php56w*</font>

如果是其它版本就将修改“56”修改为其正确本版

3. 通过 yum 安装 redis 扩展

<font style="color:#F5222D;">yum -y install php56w-pecl-redis.x86_64</font>

4. 重启 httpd 服务

<font style="color:#F5222D;">service httpd restart</font>

5. Discuz 需要编译 Config/config_global.php 配置才可以开启,默认是不打开的。

<font style="color:#F5222D;">$_config['memory']['redis']['server'] = '127.0.0.1';</font>


4、Discuz 迁移数据至Flarum

参考以下方法

https://github.com/KeKe12030/DiscuzToFlarum

https://github.com/branchzero/discuz-flarum-adapter

https://github.com/samyex6/discuz-flarum-migration


5、Discuz 迁移数据至XenForo

DZ 和 XF 均是 BB 代码,存在可迁移可能性

于Nuxt中使用Vuex

1、何为 Vuex

Vuex  是一个专为  Vue.js  应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

但是在 Nuxt.js  内置引用了  vuex  模块,所以不需要额外安装。

Nuxt.js  会尝试找到应用根目录下的  store  目录,无需配置 nuxt.config.js,如果该目录存在,它将做以下的事情:

引用  vuex  模块 将  vuex  模块 加到  vendors  构建配置中去 设置  Vue  根实例的  store  配置项

2、引用 Vuex

Nuxt.js  支持两种使用  store  的方式,你可以择一使用:

普通方式: store/index.js  返回一个  Vuex.Store  实例 模块方式: store  目录下的每个  .js  文件会被转换成为状态树指定命名的子模块 (当然,index  是根模块)

2.1 普通方式

使用普通方式的状态树,需要添加  store/index.js  文件,并对外暴露一个  Vuex.Store  实例:

1
2
3
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = ()
=> new Vuex.Store({ state: { count: 1 }, mutations: { add(state) { state.count
++; } } }) export default store;

在组件中就可以直接调用:<font style="color:#DD1144;background-color:#F6F6F6;"><span>{{$store.state.count}}</span><button </font>``[@click](https://github.com/click)``<font style="color:#DD1144;background-color:#F6F6F6;">="$store.commit('add')">+1</button></font>

2.2 模块方式

状态树还可以拆分成为模块,store  目录下的每个  .js  文件会被转换成为状态树指定命名的子模块

使用状态树模块化的方式,store/index.js  不需要返回  Vuex.Store  实例,而应该直接将  state、mutations  和  actions  暴露出来:

1
2
export const state = () => ({ scount: 0 }) export const mutations = {
addScount(state) { state.scount += 2 } } // 模块模式状态树

在页面组件调用:

<font style="color:#DD1144;background-color:#F6F6F6;"><span>{{$store.state.index2.scount}}</span> <button @click="$store.commit('index2/addScount')">+2</button></font>

3、规范案例

在 Nuxt 项目的 store 目录下新建一个 index.js 文件作为主入口,这样项目就启用了 vuex

1
2
3
4
import Vue from 'vue'; import Vuex from 'vuex'; import counter_add from
'./counter_add'; import filter from './filter'; Vue.use(Vuex); const store = ()
=> new Vuex.Store({ state: {}, mutations: {}, modules: { counter_add, filter }
}) export default store

其他的业务代码分模块来写,在 store 文件夹里再新建一个 filter.js 文件,在 index.js 中引入一下。

1
2
3
4
5
const state = ({ value: 'Hello World', list: [1, 2, 3, 4, 5] }); const getters =
{ include: (state) => (val) => { return state.list.indexOf(val) > -1; } } ;
const mutations = { SET_VALUE(state, value) { state.value = value; } }; const
actions = { async getInfo({state, commit}, val) { commit('SET_VALUE', val); } };
export default { namespaced: true, state, getters, actions, mutations };

这个文件中输出时候的 namespaced 属性,如果为 true 时,使用这个文件的方法时,需要标注 namespace,不写或为 false 时,则可以直接使用,这里建议使用 namespaced,因为大型项目可能有很多复杂的业务,可能命名冲突,使用 namespaced 可以把方法区分开,避免很多问题

__

现在,我们在 vue 文件中使用 vuex

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
<template>
<section class="p-10">
<h1>{{ value }}</h1>
<h1>{{ result }}</h1>
<el-button type="danger" @click="change">点击</el-button>
</section>
</template>
<script>
import { mapState, mapMutations, mapActions, mapGetters } from "vuex";
export default {
data() {
return {
result: false,
};
},
computed: {
...mapGetters("filter", ["include"]),
...mapState({
value: (state) => state.filter.value,
}),
},
methods: {
...mapMutations("filter", ["SET_VALUE"]),
...mapActions("filter", ["getInfo"]),
change() {
this.result = this.include(1);
this.getInfo("你好");
this.SET_VALUE("HELLO");
},
},
mounted() {},
beforeDestroy() {},
};
</script>

在 vue 文件中,首先通过 import { mapState, mapMutations, mapActions, mapGetters } from ‘vuex’ 来引入我们需要的模块,按需引用,只需要引入本页面用到的模块即可

mapGetters 和 mapState 需要在页面的计算属性 computed 中引入, mapMutations 和 mapActions 需要在 methods 中引入,此时要注意模块的命名空间,如果 vuex 文件导出时标注了 namespaced,我们使用时也需要写出才可以找到,反之则不需要

首先是 mapState,使用 mapState 时,我有两种方法来取,两种方式都可以,这个方法是从 store 中取出这个变量,然后显示在此页面上,store 变动的话,此页面也会跟着动态改变

1.1 实例

1
...mapState({ value: state => state.filter.value })

1.2 实例

1
...mapState('filter', { value: state => state.value })

MapMutation 是更改 store 中状态的唯一方法,Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数

mapAction 类似于 mutation, 但是 Action 提交的是 mutation,而不是直接变更状态,Action 可以包含任意异步操作,我们一般把异步获取数据的方法都放在这里,然后在回调函数里使用 mutation 里的方法把异步获取的数据保存在 store 里,然后把 store 里的数据传到页面

4、使用 QS 库

axios 默认的 content-type 是 application/json  也就是 java 后端经常让你把参数放在 body 中的那种格式 传输的样式是  requestbody

1
{ name:xxx, age:xxx }

如果使用的 qs 进行序列化

那么 content-type 就是 application/x-www-form-urlencoded

也就是常说的表单提交

传输的样式是  formdata

1
name:xxx, age:xxx

总结,实际上 urlencoding 后是  <font style="color:#DD1144;background-color:#F6F6F6;">name=xxx&age=xxx</font>

ajax 请求的 get 请求是通过 URL 传参的(以?和&符连接),而 post 大多是通过 json 传参的。 qs 是一个库。里面的 stringify 方法可以将一个 json 对象直接转为(以?和&符连接的形式)。

5、FAQ

Q:Cannot assign to read only property ‘exports’ of object

请检查您的项目是否存在  module.exports = xyz  表达,因为 webpack 2 中不允许混用 import 和 module.exports

Window下phpstudy使用nginx配置https

1、自生成私钥和私有证书

在 Windows 环境下搭建 Web 服务器跑 php 应用,难免大家都会想起 WAMP  和  PHPSTUDY 这些集成一键部署软件,以下分享下 Window 下 phpstudy 使用 nginx 配置 SSL 证书

首先保证有一个可以正常访问到网页的域名在手。

安装 OpenSSL (点击跳转下载地址)

⚠️ 下载完整 MSI 版

安装完成后开始配置环境变量

变量名:OPENSSL_HOME  变量值: OpenSSL 的安装目录\bin (变量值为 OPENSSL 安装位置下的 bin 目录)

在 Path 变量结尾添加一条: %OPENSSL_HOME%

打开  phpstudy  安装目录下找到  nginx 文件夹 新建  openssl  文件夹

在文件夹路径栏敲击进入 CMD

创建 Key 私钥

创建 2048 bit 级别 Key 私钥

<font style="color:#F5222D;">openssl genrsa -des3 -out google_test.key 2048</font>

创建并配置 CSR 证书

继续创建 2048 bit 级别 CSR 证书

openssl req -new -nodes -newkey rsa:2048 -keyout google_test.key -out google_test.csr

⚠️ 这里的 google_test.key 文件为同一目录下的文件

1
2
3
4
5
6
7
8
9
10
11
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Guangdong
Locality Name (eg, city) []:ZhuHai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:google_test.cn Team
Organizational Unit Name (eg, section) []:BiNoL Project
Common Name (e.g. server FQDN or YOUR name) []:google_test.cn
Email Address []:postmaster@google_test.cn
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

⚠️ A challenge password 不需要填写,不然日后在 Nginx 需要再次去除

至此,在 CMD 的根目录就生成了私有 CSR 证书。

2、NGINX  配置  SSL

本文档指导您在  NGINX HTTP  服务器上安装并配置  SSL  证书,关于  NGINX  在各个平台上的安装不再涉及。

配置  SSL  证书

1.  最正规的且完整的  SSL  证书分为四个部分:

CA 根证书  (root CA)  中级证书  (Intermediate Certificate)  域名证书 证书密钥  (仅由您持有)

以  COMODO PositiveSSL  证书为例,您将收到四份文件:

根证书  - AddTrustExternalCARoot.crt  中级证书  - COMODORSAAddTrustCA.crt  中级证书  - COMODORSADomainValidationSecureServerCA.crt  您的域名证书  - example_com.crt

2.  一般地,证书签发中心签发的 SSL 证书只有两个:

CA __证书串  - example_com.ca-bundle  您的域名证书  - example_com.crt

3.  最简单的只有一个 PEM 证书:

CA__证书  - full_chain.pem

接着需要要依照  域名证书  ->  中间证书  ->  根证书  的顺序串联为证书链,才能被绝大多数浏览器信任。提议在 Liunx 系统上使用  cat  命令串联证书,以下列举第一种情况:

<font style="color:#F5222D;">cat example_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > example_com.bundle.crt</font>

而第二种情况如下:

<font style="color:#F5222D;">cat example_com.crt example_com.ca-bundle > example_com.bundle.crt</font>

而第三种则不需要处理!

得到的新文件(example_com.bundle.crt)或(full_chain.pem)后,和私钥文件  xxx.key  一同上传至服务器并保存在安全的位置。

修改  NGINX  站点配置

下面是一份针对较新版本的  NGINX  的  SSL  部分配置,请将其添加到站点配置文件中  server  的部分,并根据注释和您的需求修改。

1
2
3
4
5
6
7
8
9
10
11
listen 443 ssl;    # 侦听端口
# listen [::]:443 ssl ipv6only=on; # 如果您希望同时侦听 IPv6,请取消此行注释
server_name example.com; # 请改为您的域名
ssl_certificate /etc/ssl/private/example_com.bundle.crt; # 证书链
ssl_certificate_key /etc/ssl/private/example_com.key; # 密钥
ssl_protocols TLSv1.2 TLSv1.1 TLSv1; # 支持的协议,Windows XP 不支持
ssl_prefer_server_ciphers on; # 启用 Forward Secrecy
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
keepalive_timeout 70;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

如果您希望至少支持一些老式浏览器,并且在能够使用  ECDHE  时尽可能使用此算法,您可以使用下面的配置:

1
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS +RC4 RC4";

能够最低支持到  Android 2.3 (不支持  IE6)  的方案:

1
2
ssl_ciphers "CHACHA20:ECDH+AESGCM:ECDH+AES256:RSA+AESGCM:RSA+AES:DH+AESGCM:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+3DES:!aNULL:!eNULL:!EXPORT:!CAMLLIA:!DES:!MD5:!PSK:!RC4";

或者使用最简单的方案:

1
ssl_ciphers "EECDH+aRSA+AES";

当然你也可以使用您可能需要使用  LibreSSL  以支持  CHACHA20  算法,以下不再枚举。

生成  DHE  参数

为了避免使用  OpenSSL  默认的  1024bit DHE  参数,我们需要生成一份更强的参数文件:

<font style="color:#F5222D;">openssl dhparam -out dhparam.pem 4096</font>

建议您使用性能强劲的平台生成此文件,例如最新版的至强物理机。如果您只有一台小型  VPS,请使用以下命令生成  2048bit  的参数文件。

<font style="color:#F5222D;">openssl dhparam -out dhparam.pem 2048</font>

完成后,在  SSL  配置下添加一行:

<font style="color:#F5222D;">ssl_dhparam /etc/ssl/certs/dhparam.pem;</font>

启用  HSTS

HTTP Strict Transport Security (HSTS)  可以使浏览器第一次访问您的站点后即记住仅通过  HTTPS  与您的站点通信,可以大大提升安全性。

在  SSL  配置下添加:

1
2
3
add_header Strict-Transport-Security max-age=63072000;
# add_header X-Frame-Options DENY; # 如果不需要引用 iframe 则可以加上
add_header X-Content-Type-Options nosniff;

强制定向到  HTTPS

这里提供三种方法,使到访问域名的使用不约而同的使用 https 通道。

1.  侦听  HTTP 80  端口

1
2
3
4
5
6
7
8
server {
listen 80;
# listen [::]:80; # 如果您需要同时侦听 IPv6,请取消此行注释
server_name example.com; # 您的域名
location / {
return 301 https://example.com$request_uri; # 要重定向的地址,请将 example.com 改为您的域名
}
}

2.  使用重写

1
rewrite ^ https://example.com$request_uri? permanent;    # 请将 example.com 改为您的域名

3.  使用解析 301 跳转

示例,这里是基于  NGINX 1.15.11  的一份完整配置样例,结合实际,仅供参考。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen 80 ;
listen 443 ssl;
ssl_certificate "C:\phpstudy_pro\Extensions\Nginx1.15.11\conf\ssl\52cxw_cn.bundle.crt"; # 证书链
# ssl_certificate "C:\phpstudy_pro\Extensions\Nginx1.15.11\conf\ssl\full_chain.pem"; # 证书链
ssl_certificate_key "C:\phpstudy_pro\Extensions\Nginx1.15.11\conf\ssl\fecmall.key"; # 密钥
ssl_prefer_server_ciphers on;
ssl_dhparam "C:\phpstudy_pro\Extensions\Nginx1.15.11\conf\ssl\dhparam.pem";
ssl_protocols TLSv1.2 TLSv1.1 TLSv1; # 支持的协议,Windows XP 不支持
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
keepalive_timeout 70;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security max-age=63072000;
# add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
server_name appfront.52cxw.cn www.xxx.cn xxx.cn;
root "D:\wwwroot\fecshop\appfront\web";
server_tokens off;
include none.conf;
index index.php index.html index.htm;
}

3、常见问题

Q:Nginx  部署 ssl 证书出现[emerg] PEM_read_bio_X509_AUX failed

****问题在于证书合并出现了异常“—–END CERTIFICATE———-BEGIN CERTIFICATE—–”粘在了一起,分开即可。

Centos 7.5 nginx+web 集群配置 https 报错 报错信息: [root@lb01 conf.d]# nginx -t nginx: [emerg] BIO_new_file(“/etc/nginx/ssl_key/server.crt”) failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen(‘/etc/nginx/ssl_key/server.crt’,’r’) error:2006D080:BIO routines:BIO_new_file:no such file) nginx: configuration file /etc/nginx/nginx.conf test failed

没有证书,解决方法:/etc/nginx/ssl_key 里面放置证书

解决Python编译问题小插曲

起因

一切的一切都因为这个。

诚然,SyntaxError: Non-ASCII character '\xe5' in file就是问题所在,出现这个问题的缘由是已经摆在面前,python 的默认编码文件是用的 ASCII 码,而你的 python 文件中使用了中文等非英语字符。解决方法是直接在报错的文件最开头加上# -*- coding:UTF-8 -*-或者# coding=UTF-8即可。但是也不要不排除它是因为 python2 的原因,因为在 python2 的 py 文件里面写中文,则必须要添加一行声明文件编码的注释,否则 python2 会默认使用 ASCII 编码,所以这里考虑前任开发使用的环境是 python3

安装双 Python 版本

具体要求是实现:在 centos 上安装 python3,并且自由切换 python2 和 python3

1.1 在当前目录下载源文件

1
wget https://www.python.org/ftp/python/3.8.6/Python-3.8.6.tgz

1.2 解压并开始安装

1
2
3
4
5
tar zxvf Python-3.8.6.tgz
cd Python-3.8.6
./configure
make
make altinstall

1.3 设置系统默认使用 python3

1
2
3
cd /usr/bin
mv python python.bak
ln -s /usr/local/bin/python3.8 /usr/bin/python

1.4 设置自由切换

设置前请检查是否安装 update-alternatives 工具,键入update-alternatives --display python

若无则不显示任何信息,则准备就绪

将 python2 和 python3 分别添加为可选项

1
2
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
sudo update-alternatives --install /usr/bin/python python /usr/local/bin/python3.8 2

/usr/bin/python 链接文件相同,/usr/local/bin/python3.8 则根据自己具体安装目录来设定,1、2 分别代表优先级

__

1.5 检查

键入python --version即可查看当前版本,如果显示Python 3.8.6则正常,否则需要进行切换操作。

1
2
3
4
5
6
7
8
9
sudo update-alternatives --config python
There are 2 programs which provide 'python'.

Selection Command
-----------------------------------------------
+ 1 /usr/bin/python2.7
* 2 /usr/local/bin/python3.8

Enter to keep the current selection[+], or type selection number(按 Enter 保留当前选项[+],或者键入选项编号:): 2

输入 2 即可成功切换。

倘若想删除附加,也可以进行管理。

1
2
sudo update-alternatives --remove python /usr/bin/python2.7 (删除2.7)
sudo update-alternatives --remove python /usr/local/bin/python3.8 (删除3.8)

1.6 升级 pip

键入cd /usr/bin 查询当前 pip 指令ll pip*

如果存在多少个 pip 就代表有多少个已经存在的命令,输入pip --version即可

现操作为删除当前的 pip 或者 pip3 软连接到最新的 pip 去。

1
2
3
4
5
6
7
8
9
10
11
# 删除pip文件
rm pip

# 查询pip3文件地址
whereis pip3

# 重新设置pip文件
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip

# 可以再补加一个pip3命令
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

回到一开始的问题,重新 run 即可成功跑起,注意结束刚开始运行的程序:ps ef | gref python 然后通过-9 或者 killall 杀掉进程。