初始Nginx,后面Ngxin优化参数,及Tomcat
1、当安装LNMP一体化环境时,MySQL数据库要装在Nginx所在的机器上。如果MySQL和 Nginx不在一台机器上,那么,Nginx服务器上的MySQL数据库软件包只要解压移动 到/usr/local/目录,改名为mysql就可以了,不需要进行后面的初始化配置。
2、在非一体的LNMP环境(Nginx和MySQL不在一台机器上),编译PHP环境时,也是需要 MySQL数据库环境的,但是高版本的PHP,例如5.3版本以上,内置了PHP需要的MySQL程序,因此,对于此类版本就不需要在Nginx服务器上安装MySQL软件了,只需要在编译PHP时 指定相关参数即可。
这个PHP的编译参数为--with-mysql=mysqld,表示PHP程序在编译时会 调用内置的MySQL的库。
可能会有问题:
error: Cannot find MySQL header files under mysqld. Note that the MySQL clie
第一修改:--with-mysql=/usr
error: Cannot find libmysqlclient under /usr. Note that the MySQL client library is not bundled anym
问题是64位系统中 libmysqlclient 默认安装到了 /usr/lib64/MySQL/ 目录下,而/usr/lib 目录下没有相应文件,但是PHP编译时,要去 /usr/lib目录下查找
解决方法:
ln -s /usr/lib64/mysql/libmysqlclient.so.15.0.0 /usr/lib/libmysqlclient.so
全局配置项说明:
user nobody : 运行用户未nobody
worker_processes 1 : 工作进程数量为1,若服务器有多块CPU或者使用多核处理器,可参考CPU核心总数来指定工作进程数
error_log logs/error.log : 错误日志文件的位置为: logs/error.log
# 错误级别: debug info notice warn error crit
pid logs/nginx.pid : PID文件的位置为:logs/nginx.pid
如果配置项已注视掉,表示采用默认设置。
I/O事件配置:
用 “events{}” 界定,指定Nginx进程的I/O响应模型,每个进程的连接数等。
2.6及以上版本的内核,建议使用epoll模型以提高性能;每个进程的连接数应根据实际需要来定,一般在10000以下,默认为1024.
events{
use epoll; //使用epoll模型
worker_connections 4096; //每个进程处理4096个连接
}
若工作进程数为8,每个进程处理4096个连接,则允许Nginx正常提供服务的连接数已超过3万个(4096*8=32768),具体的看服务器硬件,网络带宽等物理条件的性能表现。
HTTP配置:
用 “http{}” 界定,设置访问日志,HTTP端口、网页目录、默认字符集、连接保持,虚拟Web主机、PHP解析等,server{}配置段设置特定的网站
HTTP配置项说明:
access_log : 指定访问日志位置
sendfile : 是否保持文件发送(下载)
keepalive_timeout : 连接保持超时
listen 80 : 监听地址及端口
server_name : 设置网站名称(FQDN)
location : 根目录配置
root : 网站根目录的位置 /usr/local/nginx/html/ 相对于这个位置
index : 默认首页(索引页)
error_page : 内部错误的反馈页面
访问Nginx时候出现状态码 “403 forbidden” 的原因:
1、Nginx配置文件里没有配置默认首页参数,或首页文件在站点目录下没有如下内容:
index index.php index.html index.htm;
2、站点目录或内部的程序文件没有Nginx的访问权限。
3、Nginx配置文件中设置了 allow、deny 等权限控制,导致客户端没有访问权限。
修改Nginx的用户及用户组:
在主配置文件中,起始位置:
user nginx nginx;
#第一个指定的是:用户,第二个指定的是用户组。
构建静态网页步骤:
修改Nginx读取本地文件的个数:
修改Nginx读取本地文件的个数:
ulimit -n
# 查看允许打开的个数数量
ulimit -n 65350
# 设置打开的数量为:65350
查看系统日志分析:
查看系统日志:
Nginx内置了 HTTP_STUB_STATUS状态统计模块
修改nginx.conf配置文件,指定访问位置 /status并打开 stub_status 配置
在浏览器中访问 /status , 看统计信息。
日志分割:
#!/bin/bash
date=$(date -d "-1 day" "+%Y%m%d")
logs_path="/var/log/nginx"
pid_path="/usr/local/nginx/logs/nginx.pid"
[ -d $logs_path ] || mkdir -p $logs_path
mv /usr/local/nginx/logs/access.log ${logs_path}/kun.cc.access.log-$date
kill -USR1 $(cat $pid_path)
find $logs_path -mtime +30 | xargs rm -rf
设置日志分割:
kill -s USER1 Nginx进程号
# 分割Nginx日志信号
kill -s USER2 Nginx进程号
# 平滑升级Nginx
Nginx隐藏版本号:
1、配置文件中:server_tokens选项的值设置为 off , 如果没有该配置项,加上即可。
1-1、在http模块中添加。
1-2、便以前-修改源码:然后再编译安装。
nginx-1.12.1解压后的目录中,src/core中:nginx.h 文件中修改。
#defline NGINX_VERSION "1.12.1" //修改版本号信息
#defline NGINX_VER "nginx/" //软件类型也可以修改。
2、如果php配置文件中配置了 fastcgi_param SERVER_SOFTWARE 选项,则编辑 php-fpm配置文件,将fastcgi_param SERVER_SOFTWARE对应的值修改为:fastcgi_param SERVER_SOFTWARE ngxin
Nginx连接超时:
keepalive_timeout : 设置连接保持超时时间,一般可只设置参数,默认为75秒,可根据网站的情况设置,或者关闭,可在 http、server、或 location 段设置
client_header_timeout : 指定等待客户端发送请求头的超时时间
client_body_timeout : 设置请求体读 超时时间。
cat /proc/cpuinfo | grep -c "physical"
# 查看系统CPU核数。显示了多少行。
1、修改配置文件的 worker_processes 参数,一般设置为CPU的个数或核数,在高并发情况下可设置为CPU个数或核数的2倍。
2、运行进程数多一些,响应客户端访问请求时,Nginx就不会临时启动新的进程提供服务,减少了系统的开销,提升了服务速度。
3、修改完后,重启服务,使用 ps aux 查看运行进程数的变化情况。
在一台4核物理服务器,可进行配置,将进程分配在指定的CPU上,从而减少CPU之间的切换消耗。
worker_cpu_affinity 0001 0010 0100 1000;
Nginx网页压缩:
压缩参数:
gzip on : 开启gzip压缩输出
gzip_min_length 1k : 用于设置允许压缩的页面最小字节数;
低于1k的不压缩。
gzip_buffers 4 16k : 表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存来存储gzip压缩结果。
zip_http_version 1.0 : 用于设置识别http协议版本,默认是1.1,目前大部分浏览器已经支持gzip解压,但处理慢,也比较消耗服务器CPU资源。
指定http协议的版本号
gzip_comp_level 2 : 指定gzip压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理速度最慢,根据实际情况设置适当的值。
gzip_types text/plain : 压缩类型,对哪些网页文档启用压缩功能。
gzip_vary on : 可以让前端的缓存服务器缓存经过gzip压缩的页面。
Nginx防盗链:rewrite
location ~* \.(jpg|png|swf|jpeg)$ {
valid_referers none blocked *.kun.cc kun.cc;
if ($invalid_referer) {
rewrite ^/
http://www.kun.cc/error.html;
#return 403;
}
}
valid_referers none blocked *.kun.cc kun.cc;
详解:
valid_referers :设置信任的网站,即能引用相应图片的网站。
none : 浏览器中referer为空的情况,就是直接在浏览器访问图片
blocked : referer不为空的情况,但是值被代理或防火墙删除了,这些值不以 http:// 或 https:// 开头
后面的网址或域名 : referer中包含相关字符串的网址
if语句 : 如果连接的来源域名不在valid_referers所列出的列表中, $invalid_referer 为 1 ,则执行后面的操作,即进行重写或返回403页面。
rewrite跳转标记 flag 使用总结:
例如: rewrite ^/(.*) http://www.baidu.com/$1 permanent;
后面的:permanent就是flag标记。
flag标记符号 | 说明 |
last | 本条规则匹配完成后,继续向下匹配新的location URI规则 |
break | 本条规则匹配完成即终止,不再匹配后面的任何规则 |
redirect | 返回302临时重定向,浏览器地址栏会显示跳转后的RUL地址 |
permanent | 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址 |
1、在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏的URL地址不变,但在服务器端访问的程序及路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址。
2、last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条rewrite规则执行完毕后,会对其所在的server{...}标签重新发起请求,而break标记则会在本条规则匹配完成后,终止匹配,不再匹配后续的规则。
1、在根 location(即:location / {...})中 或 server {...} 标签中编写rewrite规则,建议使用last标记。
2、在普通的location(例:location /test/ {...}) 或 if{} 中编写rewrite规则,建议使用break标记。
Nginx的PHP解析功能:FPM模块参数优化:
FPM优化参数:
pm : 使用那种方式启动fpm进程,可以是static 和 dynamic,前者将产生固定数量的fpm进程,后者将以动态的方式产生fpm进程。
pm.max_children : static 方式下开启的fpm进程数。
pm.start_servers : 动态方式下初始的fpm进程数量。
pm.min_spare_servers : 动态方式下最小的fpm空闲进程数
pm.max_spare_servers : 动态方式下最大的fpm空闲进程数
FPM优化参数调整举例:
优化原因:服务器为晕服务器,运行个人论坛,内存为1.5G,fpm进程数为20,内存消耗为1G,处理比较慢。
优化参数调整:
pm=dynamic
pm.start_servers = 5
pm.min_spare_server = 2
pm.max_spare_servers = 8
Nginx优化
当前系统处理的什么业务,服务最大能支撑多少并发。
1、通过top命令查看CPU负荷,内存使用,进程使用,
2、通过系统工具判断系统性能。
3、分析日志查看请求的数量。
4、通过Nginx的stub_status模块查看Nginx处理的用户请求,连接情况等。
考虑点:
1、档期那系统结构瓶颈
2、了解业务模式
接口业务类型,系统层次化结构,(类似抢票)
3、性能与安全。
ab接口压力测试工具:
yum install httpd-tools
使用:
ab -n 2000 -c 200 http://127.0.0.1/
-n 总的请求书
-c 并发数
-k 是否开启长连接
##需要注意的使: 如果单纯的 RUL,后面必须跟 / 才可以。
Nginx优化-修改文件句柄
默认的使 1024 个: ulimit -a 查看。
全局修改配置文件:
/etc/security/limits.conf
格式:
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
## root设置用户打开的文件句柄个数,*代表所有。
nginx中设置打开的文件句柄数:
在http模块中设置:
worker_rlimit_nofile 65535;
开启keepalive_timeout 65;
tcp_nodeny on;结合与keepalive_timeout 65;结合使用。
如果作为静态资源服务器:tcp_nopush on;打开。
开启了gzip on;
如果对于IE6以下设置 :gzip_disable "MSIE [1-6]\.";
gzip_http_version 1.1;
这个值也可以设置成 auto 即可。
使用Nginx搭建虚拟主机服务器:
每个虚拟Web站点拥有独立的 “server{}” 配置段,各自监听的IP地址、端口号可以单独指定,当然网站名称也是不同的。
基于域名的虚拟主机
基于IP的虚拟主机
基于端口的虚拟主机
netstat -antup | grep nginx
编译安装需要的:
gcc gcc-c++ automake autoconf
动态数据能力取决于 PHP(Java)和后端数据库的服务能力。
一般PHP引擎支持的并发连接参考值:300~100
Java和数据库的并发连接数参考值:300~1500
Nginx与Apache:(WEB服务)
Nginx与tomcat:
Nginx与LVS:
Nginx与Squid(Memcached):(缓存功能)
Squid 和 Memcached 采用的是epoll模型。
Nginx与Haproxy:(反向代理)
Nginx可以通过自身的 proxy_cache 模块实现类似Squid等专业缓存软件功能。
Ningx与Lighttpd:
什么是Nginx?
具有高并发(特别是静态资源),占用系统资源少,可以做HTTP反向代理及加速缓存,即:负载均衡
是一种服务器软件,最基本的功能是可以与服务器硬件集合,让程序可以在Nginx服务器上发不出去,让用户浏览。Nginx也是一种高性能HTTP和反向代理服务器。也是一个代理邮件服务器。也就是:Nginx上可以发布网站,也可以实现负载均衡的功能,还可以作为邮件服务器实现手法邮件功能等。
负载均衡:
通过Nginx反向代理的性能,从而实现Nginx负载均衡。
反向代理:负载均衡。
Tomcat服务器面向的是Java语言,是一种重量级的服务器,而Nginx是轻量级服务器,Tomcat与Nginx不具备可比性,
Apache优点:
稳定、开源、跨平台等等。但是不支持高并发。
网站服务器在单位时间内能够处理的最大连接数。
Nginx优点:
可以实现高并发、部署简单、内存消耗少、成本低等等。
内置对RS节点服务器健康检查功能。
可以通过自身的proxy_cache模块实现类似Squid等专业缓存软件的功能。
缺点:
rewrite功能不够强大,模块没有Apache的多。
gcc、gcc-c++、make 编译,
需要依赖库:pcre pcre-devel ; zlib zlib-devel
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
--with-http_stub_status_module
pcre-devel :为了Nginx支持http的rewrite,网页重写机制,
--with-http_stub_status_module:网页访问的状态记录统计。
编译后Nginx启动:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
停止:(根据Nginx主进程号)
从容停止:
ps -ef | grep nginx
kill -QUIT 2043
# QUIT 3)SIGQUIT
快速停止:
kill -TERM 2041
# TERM 15)SIGTERM
kill -INT 2044
# INT 2)SIGINT
强制停止:
kill -9 2045
# 按进程号强杀
检测配置文件是否正确:
方法一:
cd /usr/loca/nginx/sbin/ 然后执行: ./nginx -t 即可。
方法二:
/usr/loca/nginx/sbin/nginx -t -c /usr/loca/nginx/conf/nginx.conf
重启Nginx服务:
方法一:
cd /usr/local/nginx/sbin/ 然后执行:./nginx -s reload
# 如果没有开启Nginx服务会报错
方法二:
kill -HUP 主进程号
# HUP 1)SIGHUP
Nginx的反向代理与负载均衡:
正向代理:明确知道要访问的网站。
反向代理:有集群中提供相同服务的RS节点提供服务,并不知道具体是哪一个服务器主机。
Nginx配置文件:
user
# 设置使用的用户
worker_processes
# 工作衍生进程,同时可以处理多少个进程。CPU核数或核数2倍
error_log logs/error.logs
# 错误日志文件存放路径
pid logs/nginx.pid
# 设置PID存放路径-控制文件。
events{
worker_connections 1024;
}
# 设置最大连接数
http{
gzip on;
# 如果不压缩off,用户访问时按文件原有大小传输,如果on开启,则访问的时压缩
server{
charset koi8-r;
# 设置nginx字符编码, gb2312
}
}
worker_processes 1;
events{
worker_connections 1024;
}
http{
upstream mypro {
ip_hash;
server 192.168.88.11 weight=2;
server 192.168.88.12 weight=1;
}
server{
}
server{
}
}
./configure --help
#查看支持的模块。
nginx -V
# 查看已经支持的模块
nginx启动:sbin目录下:
./nginx 启动
./nginx -s stop 停止
查看进程: ps aux | grep nginx
重启服务:./nginx -s reload
Nginx优化:
top命令中 按数字 1 查看CPU核心数。
如果是4核CPU则,每组数字都4位数字组成。有多少个进程就设置多少组数字。则表示:进程绑定在CPU的哪个位置。从而避免进程在CPU之间切换造成性能的开销。CPU有多少核就多少个0组成。
这个值也可以设置成 auto 即可。
文件描述符:
在Linux上,当打开一个网络端口,或使用一个设备,或是读取一个磁盘文件的时候,都会返回一个文件描述符的东西。在系统上,每一个进程打开的最大数量是由限制的,一旦超过这个限制就会产生错误,请求会被拒绝,
如果在Nginx上,如果发起一个连接请求,但是当前系统可使用的文件描述符已经达到了上限,一般会收到一个502的错误。导致访问被拒绝。为了避免这个情况的发生,需要给工作进程,可以打开的最大文件设置一个值,应该让Ningx使用系统最大可打开文件的最大数值,这样的一个限制。
这个值不会因为,文件描述符打开文件的限制,而导致拒绝连接,
每个进程的最大可用连接数。:指定每一个工作进程,最多可以接收多少个用户的连接,直接影响到Nginx负载量的一个设置,
为什么做为反向代理时候连接数更少,因为浏览器向服务器发起时候会同时开俩条连接,而作为反向代理服务到后排服务器每条连接还需要代理,又会占用2条连接。这么一来,一个用户就占用了4条连接。
因为在压力测试的时候,发现设置的最大连接数,已经达到的2千,但实际压力测试的时候,最多可能只有500个用户可以访问,超过500就不能并发访问了。这就是Ngin为什么作为反向代理服务时,与设置的连接数相差较大的原因。
BSD上使用的模型是:kquene;
其实在安装的时候Nginx会识别系统,自动使用合理的模型使用。为什么还手动指定呢?这是能更准确的使用。
在高并发服务时,用户请求时候,日志记录也会产生很大的IO开销,
错误日志也会产生IO的压力,或则将错误级别提高,只记录错误比较严重的,从而减少IO的开销。
sendfile on :启用内核复制的选项,默认就是开启的。
一个磁盘文件,通过Nginx从网络上发送出去,在这个过程中,如果采用普通的模式,会从磁盘上读取到内存里(在内存上有:系统及的内存,用户级的内存,还有网络的内存),会在这些内存中经过一系列的复制,才会发送出去,会造成一定性能的开销。
如果开启,就是直接内核复制模式,直接从磁盘最低层的,磁盘IO级别,复制到了网络IO的级别。不经过用户这个层次,减少了几次复制过程,加大了整个响应的速度。
keepalive_teimeout 30s : 设置连接的超时时间。
连接超时的概念: 在http1.0版本的协议中,当访问一个网页的时候,每次发起请求,获取结果之后,连接都直接被关闭。
每次建立连接都是性能开销比较大的。1.1http协议后,支持了持久化的连接,支持一个存活的连接,后续大量的请求,复用一个连接,避免了大量创建连接这样的开销。
但是每个连接的连接时间过长,会导致其他的连接无法进来,
如果是图片等,资源比较大设置的连接超时 大一些。
gzip 默认是关闭的,生产中打开on。
作用:将请求返回的内容进行压缩,压缩后返回内容的总体的字节量减少,可以提高网络使用的效率。
gzip_min_length 1000; 设置启用压缩的最小长度。
作用:只有长度超过指定的值才会压缩,
gzip_comp_level 4; 设置压缩级别。
gzip_types text/plain text/css application/json
对压缩类别的设定。哪些内容压缩,哪些内容不压缩,
如果用户在进行文件下载,图片下载,这些二进制的东西,再压缩也压缩不了多少的。但是对一些文本,html页面,json等,可以达到一个很好的压缩效果。
这个默认是没有打开的,需要通过配置打开,
静态文件缓存作用:
如果经常访问一个网页文件的话,每次都从磁盘读取,显然要消耗大量的IO。性能不会太高,所以对一些经常访问的静态文件,把它放在内存中,然后用户请求的时候,直接从内存取出返回给用户,从而提高服务器的响应能力,也会提高服务器的负载量。
缓存存放数量是由限的,当超过这个数量的时候,会采用一定的算法,把不经常使用的排除掉,经常使用的放进来,提高缓存的命中率。
命中率:通过第一个存活时间:inactive=20s; 第二个:open_file_cache_min_uses 2;使用次数,2个数值结合起来,一个文件被加载到缓存中时候,在单位时间内,达到了访问次数,才算是命中率有效的文件,如果没有达到就是命中率低的文件。
检查:open_file_cache_valid 30s; 通过这个参数来查缓存的有效性。这个就是每30秒验证一次,在验证的时候,如果一个文件在20秒时间内,使用的次数低于2次,那么就释放掉缓存中的这个文件。
Tomcat的运行需要Java的支持,在服务器上为了获得更全的功能,一般安装JDK版本。
对Tomcat的优化一般做2个事情:
1、内存使用配置。
因为JVM在默认启动的时候,使用的内存都不大,为了充分的利用系统内存,所以需要配置JVM所使用的内存大小。
设置启动内存,也就是设置JVM启动参数。在 bin目录下,有个catalina.sh 的脚本文件,有设置JVM启动参数的部分, 大概在中间的位置,默认是注释的 :JAVA_OPTS=
JAVA_OPTS=$JAVA_OPTS -server -Xms2048m -Xmx2048m -XX:PermSize=256m
-server : 以server模式启动,启动较慢,运行还是较高的。所以指定-server模式来提升性能。
堆内存,最小堆内存,最大堆内存。
-Xms2048m :
-Xmx2048m :
错误提示:OutOfMemoryError:PermGen 错误的提示,用于存放类定义的相关信息,占用之后会释放的,当项目使用的jar包比较多的时候,或则使用了一些框架能够自动生成类,因为默认分配的很小,就有可能会出现这个错误提示的信息。所以可以适当加大这个值的空间大小。
一个是默认启动时候的大小,另一个是可以使用的最大值。
如果是1.8以后的,这项配置就无效了,因为JDK1.8已经修改了内存模型,已经不存在Perm内存这么个概念,取而代之的是:MetaspaceSize代替。原空间与堆内存共享的,
-XX:PermSize=256m
-XX:MaxPermSize=512m
跟Linux相关的参数,在使用一些绘图操作的时候,设置当前的显示模式,是一种headless,表示:无图形显示器,这么个模式、。
作用:
当程序中使用一些跟绘图有关的API的时候,如果正确声明了这个模式,才能正确的调用API。否则会抛出一些异常信息。
作用就是宣布,当前的Java是运行在一种,无图形显示这样的模式下, 才能保证绘图API,正确执行,一般在Linxu系统上需要加上这一项。
-Djava.awt.headless=true
2、最大连接数配置。
因为默认的值也是比较小的。所以需要适当加大。
在server.xml中配置
Connector 标签,就是设置端口的位置,
protocol="org.apache.coyote.httpll.HttpllNioProtocol"
设置Tomcat的网络模型,
支持3种,
1、传统的BIO阻塞模型,
2、新的模型,nio的模型,基于异步轮询,
3、使用系统级IO的,apr网络模型。arp网络模型因为是利用系统级的,所以在进行一些大文件处理的时候,有异性比较明显,
大多数情况使用 nio 模型。也可以获得很好的性能。
设置并发量参数:
正在工作的线程数:
maxThreads="500" #最大线程数,Tomcat可以同时工作的线程数量,也就是当前可以处理的用户请求的数量
让线程池保持一个有效的线程数量,从而快速响应用户的请求。
minSpareThreads="100" #配置线程池,准备就绪的线程,最小空闲数量
maxSpareThreads="200" #配置线程池。最大空闲数量。
当所有线程都启用之后,还允许一部分用户连接进来,当前没有线程为其服务,就处于等待状态,一旦前面有某个用户释放了某个线程,就迅速接收过来,来完成工作。
也就是等待工作的线程数。
acceptCount="200"
前面正在工作的线程数,后面等待工作的线程数,加起来就是总的可连接的线程数。如果超过了这个数量,新的连接就不会被接受,就会产生一个http错误。,
是否允许DNS反查。
作用:
当在应用中使用,获取远程主机名这样的操作时,Tomcat会自动将客户端连接的IP,进行一个DNS反查,查出所对应的主机名,因为在服务端没必要知道客户端的主机名,所以可以把这个功能关闭。避免DNS的反查,从而在一定程度上提高Tomcat的响应性能。
enableLookups="false"