nginx常见问题

nginx优化
全局配置优化
[root@web2 nginx]# vim conf/nginx.conf
user nobody;
worker_processes 1;(与cpu核心数一致)
worker_rlimit_nofile 3000;(最大打开文件数量)
error_log /var/log/nginx.error_log info;(定义日志级别)

注意修改操作系统配置文件
[root@web2]# /etc/security/limits.conf(凡是涉及并发量的配置都要改,不改系统配置,每个worker最大并发连接数是不起作用的)
#<domain> <type> <item> <value>
#
* soft nofile 100000
* hard nofile 100000

注:
domain:可以是用户,也可以是组
type:可以是两个值 一个是soft(软限制)一个是hard(硬限制)
item:项目控制
value:值,默认值1024

item项目控制:
core -限制核心文件大小(KB)
data - 最大数据大小(KB)
fsize - 最大文件大小
memlock - 最大锁定在内存地址空间(KB)
nofile - 最大打开的文件描述符的数目
rss - 最大驻留集大小(KB)
stack - 叠最大堆栈大小(KB)
cpu -CPU最大的CPU时间(分钟)
nproc -c最大进程数
as - 地址空间的限制(KB)
maxlogins -用户登录的最大数量
maxsyslogins -最大登录系统
priority - 优先级来运行用户进程
locks - -最大数量的用户可以把文件锁
sigpending -最大数量的待处理的信号
msgqueue - 最大内存使用的POSIX消息队列(字节)
nice -优先级提高到最大值:[ 20, 19 ]
rtprio -最大实时优先级

event模块优化
max_clients=worker_processes * worker_connections

event{
worker_connections 65536;(每个worker最大并发连接数)
use epoll;
}

http模块优化
http{
server_tokens off;(不显示nginx具体版本号)
sendfile on;(提升nginx读文件性能)
tcp_nodelay on;(关闭tcp延迟发送数据)
keepalive_timeout 10;(保持连接的超时时间)
gzip on;(开压缩)
gzip_min_length 1000;(超过1000个字节以上的页面才压缩)
gizp_comp_level 4;(压缩比例,标准)
gzip_types text/plain text/css application/json application/x-javascript text/
xml application/xml application/xml+rss text/javascript;(对特定的类型压缩,次类型在/nginx/conf/mime.types里)
client_header_buffer_size 1k;(存客户端的头部信息)
large_client_header_buffers 4 4;(大请求包头部信息的缓存个数与容量,
先根据client_header_buffer分配,如果不够,再根据large值分配)
}

如果需要处理大量静态文件,
需要保持这些文件局柄为打开状态,避免后续再次打开
http{
open_file_cache max=2000 inactive=20s;(设置服务器最大缓存2000个句柄,关闭20秒内无请求的文件句柄)
open_file_cache_valid 60s;(文件句柄的有效时间是60秒,60秒后过期)
open_file_cache_min_user 5;(只有访问次数超过5次会被缓存)
open_file_cache_errors off;
}

客户端浏览器缓存数据
http{
location ~ \.(jpg|jpeg|gif|peng|css|ico|xml){
expires 30d;
}
}
[root@web2 html]# firefox http://192.168.2.200/a.jpg(测试访问)

防盗链语句:
location ~ \.(jpg|png|gif){
valid_referers none blocked www.xx.com;
if($invalid_refer){
rewrite ^/ http://www.xx.com/403.html;
}
}
none表示没有referer,也就是直接访问,比如直接在浏览器打开一个图片
blocked表示没有referer,但内容被防火墙或代理删除
server_name就是最后的域名,可以使用*.xx。com来表示二级域名

——————————————————————————————————————————————————————————

常用压力测试工具
ab:
ab -c 并发数 -n 总请求数 url

http_load:
http_load -p 并发数 -s 测试时间 url

webbench:
webbench -c 并发数 -t 测试时间 url

siege:
siege -c 并发数 -r 重复次数 url

——————————————————————————————————————————————————————————

tomcat服务器

tomcat是apache软件基金会的jakarta项目中的一个核心项目
由apache,sun和其他一些公司及个人共同开发而成
由于有了sun的参与和支持,最新的servlet和jsp规范
可以在tomcat中得到体现

java servlet
servlet是一种扩展web服务器功能的组件贵伐
为了避免这些局限性。java servlet技术产生,
他能够以一种可移植的方法来提供动态的,面向用户的内容
处理用户请求
当需要实现一个通用的服务时,可以使用或扩展有java servlet api
提供genericservlet类
httpservlet类提供额一些方法,诸如doget和dopost,
以用于处理特定于http的服务
web server本身没有计算能力不能处理动态资源请求
servl可以处理动态资源请求

常见的servl容器
IBM——》websphere
Oracle——》weblogic
apache——》tomcat
rehat——》jboos
xx——》resin
开发者一般主要开发的是servlet容器中的servlet代码

jsp
sun首先发展出servlet,其功能比较强劲,体系设计也很先进
但他输出html语句还是采用了老的cgi方式,一句一句输出
所以,编写和修改html非常不方便
后来sun推出了类似于asp的镶嵌式的jsp,把jsptag镶嵌到html语句中
简化和方便了网页的设计和修改

——————————————————————————————————————————————
安装tomcat(需要java环境)
[root@web2 ]# rpm -ivh jdk-8u77-linux-x64.rpm (java环境)
[root@web2 ]# tar apache-tomcat-8.0.30.tar.gz (解tomcat包)
[root@web2 ]# mv apache-tomcat-8.0.30 /usr/local/tomcat(移动到目录下)
[root@web2 bin]# ./configtest.sh start(启动脚本,端口为8080,不会和80端口冲突)

tomcat目录
lib:库文件目录
temp:临时目录
work:自动编译目录jsp代码转换为service
webapp:页面目录

测试访问:[root@web2 tomcat]# vim webapps/ROOT/test.jsp(在根页面下写一个jsp测试)
<html>
<body>
<center>
Now time is:<%=new java.util.Date()%>(java严格区分大小写)
</center>
</body>
</html>
[root@web2 ]# firefox http://127.0.0.1:8080/test.jsp(测试访问)

tomcat配置文件
[root@web2 tomcat]# ls conf/
server.xml:主配置文件
context.xml:每个webapp有专有的配置文件,这个为各webapp提供默认配置
web.xml:所有的webapp提供默认部署相关的配置
tomcat-users.xml:用户认证的账号和密码配置文件
catalina.properties:java属性的定义文件,用于设定类加载器路径等
logging.properties:日志相关配置文件

server.xml主配置文件框架
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
</Server>

server.xml框架解析
service是tomcat实例的顶层元素,一个tomcat实例
servlet是一个集合,他由一个或多个connector以及一个engine组成
connector是直接与用户交互的组件,负责接受用户请求和向客户返回响应结果
engine负责处理所有connector所获得的客户请求,
他处理同一个servlet中所有connector元素接收到的客户请求
它匹配请求和自己的虚拟主机,并将请求发送给对应的<Host>处理
默认的主机是localhost
一个<engine>元素可以包含多个<Host>元素,每个<Host>元素定义一个虚拟主机
它包含多个web应用

servlet.xml
port:指定服务器http端口号
address:指定连接器监听的地址,默认为所有地址
protocol:连接器使用的协议,支持http和ajp
enableLookups:是否查询客户端主机名,性能消耗严重
connectionTimeout:指定超市时间数
name:主机名
appbase:网站项目根目录
unpackWARS:是否自动解压war包
autoDeloy:tomcat启动时自动部署新项目
docBase:应用程序的路径或war包项目路径
path:web应用程序的url访问路径

测试:搭建基于域名的虚拟主机
[root@web2 tomcat]# echo "hail hydra!!" > hydra/ROOT/index.html(创建目录及页面)
[root@web2 tomcat]# vim conf/server.xml (配置文件)
<Host name="www.hydra.com" appBase="hydra" unpackWARs="true" autoDeploy="true">
</Host>
[root@web2 bin]# /usr/local/tomcat/bin/shutdown.sh stop(停止)
[root@web2 bin]# /usr/local/tomcat/bin/startup.sh start(启动)
[root@web2 bin]# firefox http://www.hydra.com:8080(重启后测试访问)

测试给host添加context(appbase定义基础(根)目录,,基础目录下游很多项目,docbase定义首页路径)
[root@web2 tomcat]# echo "hail hydra!!" > hydra/base/index.html(创建目录及页面)
[root@web2 tomcat]# vim conf/server.xml
<Host name="www.hydra.com" appBase="hydra" unpackWARs="true" autoDeploy="true">
<Context path=""docBase="base" reloadable="true"/>
</Host>
[root@web2 bin]# /usr/local/tomcat/bin/shutdown.sh stop(停止)
[root@web2 bin]# /usr/local/tomcat/bin/startup.sh start(启动)

测试给host添加context(appbase定义基础(根)目录,path指定用户访问的url,docbase指定页面存储位置)
[root@web2 tomcat]# mkdir -p /var/www/html(创建目录及页面)
[root@web2 tomcat]# echo "hail hydra!!" > /var/www/html/index.html
[root@web2 tomcat]# vim conf/server.xml
<Host name="www.hydra.com" appBase="hydra" unpackWARs="true" autoDeploy="true">
<Context path="/hydra" docBase="/var/www/html/"/>
</Host>
[root@web2 bin]# /usr/local/tomcat/bin/shutdown.sh stop(停止)
[root@web2 bin]# /usr/local/tomcat/bin/startup.sh start(启动)

————————————————————————————————————————————————————————————————————————————

加密站点
[root@web2 tomcat]# mkdir ssl
[root@web2 tomcat]# keytool -genkeypair -alias tomcat -keyalg RSA -keystore /usr/local/tomcat/ssl/keystore(生成RSA加密算法的密钥对,保存在路劲下)
输入密钥库口令: 123456

修改servlet.xml配置文件
[root@web2 tomcat]# keytool -help(获取所有可用命令)
[root@web2 tomcat]# vim conf/server.xml
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"(监听8443端口)
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"(最大150个进程,头部信息https,允许加密,走tls路线)
keystoreFile="/usr/local/tomcat/ssl/keystore" keystorePass=123456(密钥文件路径,密钥需要输入密码,写上生成时的密码就可以)
clientAuth="false" sslProtocol="TLS" />

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
[root@web2 bin]# /usr/local/tomcat/bin/shutdown.sh stop(停止)
[root@web2 bin]# /usr/local/tomcat/bin/startup.sh start(启动)

——————————————————————————————————————————————————————————————————————————————

tomca优化

jvm优化
[root@web2 tomcat]# vim bin/catalina.sh
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m"
server:服务器模式运行
Xms:java虚拟机初始化时的最小内存
Xmx:java虚拟机可使用的最大内存

并发量优化
修改connector属性
[root@web2 tomcat]#[root@web2 tomcat]# vim conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="1000"(客户请求最大线程)
minSpareThreads="100"(最小空闲进程)
maxSpareThreads="1000"(最大空闲线程)
enableLookups="false"
URIEncoding="utf-8"
acceptCount="1000"(监听端口队列最大数)
/>
[root@web2 bin]# /usr/local/tomcat/bin/shutdown.sh stop(停止)
[root@web2 bin]# /usr/local/tomcat/bin/startup.sh start(启动)

——————————————————————————————————————————————————————————————————————