- nginx常用模块
http_proxy 这个模块实现的是nginx作为反向代理服务器的功能
nginx-http-footer-filter 在响应请求文件底部追加内容
http_ssl_module 配置https
ngx_lua 支持Lua语言
ngx_http_log_module 定义访问日志格式
ngx_http_referer_module 防盗链
- nginx常用配置
upstream backend 设定负载均衡后台服务器列表
client_max_body_size 允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值
server 虚拟主机配置
worker_processes 定义了nginx对外提供web服务时的worker进程数,不确定时,可设置为可用的CPU内核数
worker_rlimit_nofile 表示worker进程最多能打开的文件句柄数,设置等同于liunx系统ulimit设置为优
location 配置nginx自己处理的静态文件,不请求后台的tomcat
worker_connections 每一个worker进程能并发处理(发起)的最大连接数
allow/deny 允许或禁止某个ip或ip段访问,依次满足任何一个规则就停止往下匹配
- nginx最大连接数与cpu的关系
worker_processes:表示开启nginx的worker进程的个数,nginx启动会开两种进程,master进程用来管理调度,worker进程用来处理请求;
上面表示两种设置方法,比如
方法一:worker_processes auto;
表示设置服务器cpu核数匹配开启nginx开启的worker进程数
查看cpu核数:lscpu、cat /proc/cpuinfo
方法二:nginx设置cpu亲和力
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
00000001表示启用第一个CPU内核,00000010表示启用第二个CPU内核,以此类推
worker_cpu_affinity:表示开启八个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核,以此类推。
这种设置方法更高效,因将每个cpu核提供给固定的worker进程服务,减少cpu上下午切换带来的资源浪费
如果服务器cpu有限
比如:2核CPU,开启2个进程,设置如下
worker_processes 2;
worker_cpu_affinity 01 10;
比如:2核CPU,开启4个进程,设置如下
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
worker_rlimit_nofile 65535;
这个参数表示worker进程最多能打开的文件句柄数,基于liunx系统ulimit设置
查看系统文件句柄数最大值:ulimit -n
注意:Linux一切皆文件,所有请求过来最终目的访问文件,所以该参数值设置等同于liunx系统ulimit设置为优
- nginx如何配置https
详见:http://blog.csdn.net/weixin_35884835/article/details/52588157
使用ssl模块配置同时支持http和https并存:
一,生成证书
二,配置nginx
三、受浏览器信任的StartSSL免费SSL证书
四、项目需要,将访问目录 \services\ 由http访问 重定向到 https (解决方法:nginx rewrite 加上 location 方式实现)
五,配置结束上传以后用nginx -t 测试下配置无误 就reload一下nginx服务 检查443端口是否在监听
- linux 如何查看cpu占用最高的的进程
- 编写sql的良好实践
- 禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。
- 数据订正时,删除和修改记录时,要先select,避免出现误删除,确认无误才能执行更新语句。
- 在代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句。
- in操作能避免则避免,若实在避免不了,需要仔细评估in后边的集合元素数量,控制在1000个之内。
- 不要使用count(列名)或count(常量)来替代count(*),因为count(*)会统计值为NULL的行,而count(列名)不会统计此列为NULL值的行。
- 使用ISNULL()来判断是否为NULL值,因为ULL与任何值的直接比较都为NULL。
- 不得使用外键与级联,一切外键概念必须在应用层解决。
- 在生产上查询DB时,尽量限定好查询范围,尽量不要使用count(*)、sum(*),若确实要用,请带好查询条件
- 查询条件尽量命中索引
- 避免不恰当的使用“SELECT *”,因为若表字段较多,则可能在执行时性能较差
- 避免在本地谓词的列上使用复杂表达式,如不要用YEAR(Date) > 2004,改为Date > ‘ 2004-12-31 ’
- http长连接、短连接的优缺点
- mysql的常用配置参数(mysql配置文件)
- union 和 union all 的相同点与区别点
相同点:都是对两个结果集进行并集操作
区别:
- Union:不包括重复行,同时进行默认规则的排序;
- Union All:包括重复行,不进行排序;
- MyBatis的$与#的区别?
#相当于对数据 加上 双引号,$相当于直接显示数据
1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.
3. #方式能够很大程度防止sql注入。
4.$方式无法防止Sql注入。
5.$方式一般用于传入数据库对象,例如传入表名.
6.一般能用#的就别用$.
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
- 常用的Linux命令:查网络连接、查CPU、查内存、查磁盘空间
查看系统文件句柄数最大值:ulimit -n
查看网络连接:netstat
查内存:free
查磁盘空间:df -h
- HashMap的数据结构
- ConcurrentHashMap的锁机制 ;
ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。
ConcurrentHashMap没有将每个方法都在同一个锁上同步并使得每次只能有一个线程访问容器,而是使用一种粒度更细的加锁机制实现更大程度的共享。这种细粒度的加锁机制体现在ConcurrentHashMap划分的Segment数组,Segment数组上各Segment元素代表了粒度更细的锁,Segment继承自ReentrantLock可重入锁。
ConcurrentHashMap这种基于分组Segment并加锁的策略可在高并发的环境下获得更高的吞吐量。
- JDK1.7 、JDK1.8 新特性
- 泛型实例的创建可以通过类型推断来简化
- try-with-resources 语句自动关闭相关的资源
- Lambda
- 流API:新的java.util.stream包提供了“支持在流上的函数式风格的值操作”
- 反射和annotation的改动
- lambda表达式使用示例
实现Runnable接口是匿名类的最好示例。用() -> {}代码块替代了整个匿名类,比如:
// Java 8之前:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Before Java8, too much code for too little to do");
}
}).start();
//Java 8方式:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();
2、使用lambda表达式对列表进行迭代
// Java 8之前:
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
for (String feature : features) {
System.out.println(feature);
}
// Java 8之后:
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
features.forEach(n -> System.out.println(n));
// 使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示,
// 看起来像C++的作用域解析运算符
features.forEach(System.out::println);
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Before Java8, too much code for too little to do");
}
}).start();
//Java 8方式:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
for (String feature : features) {
System.out.println(feature);
}
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
features.forEach(n -> System.out.println(n));
// 使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示,
// 看起来像C++的作用域解析运算符
features.forEach(System.out::println);