nginx 优化
nginx是什么
nginx是一个轻量级高性能的http和反向代理服务器,具有正向代理、反向代理、负载均衡、动静分离、高可用集群,支持平滑升级、
nginx的工作原理
nginx优化
1、添加用户认证
auth_basic “password”;
auth_basic_user_file “ /usr/local/nginx/pass”; #pass文件名随意,网站用户信息的存放的路径。
Yum -y install httpd-tools 安装可以生成认证文件的工具
Htpasswd -c /usr/local/nginx/pass tom #创建认证文件并创建tom账户,-c不能重复使用。
2、开启加密功能
Openssl genrsa > cert.key #生成私钥
Openssl req -x509 -key cert.key > cert.pem #根据私钥生成公钥
在实际的生成环境中,公钥和私钥是花钱购买的,会得到一个证书,证书包含公钥和私钥;不是自己生成的。
3、开启nginx主机状态信息
active connections – 活跃的连接数量
server accepts handled requests — 总共处理了11989个连接 , 成功创建11989次握手, 总共处理了11991个请求
reading — 读取客户端的连接数.
writing — 响应数据到客户端的数量
waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接.
4、修改连接数量和worker数量
根据cpu 个数和内核数修改worker的数量
根据系统所能打开的最大打开文件数修改worker_connections的数量
cat /proc/sys/fs/file-max 查看系统的最大文件打开数量
vim /etc/sexurity/limits.conf 永久修改文件打开数量,不能超过系统所允许 值
临时修改为ulimit -n 10000
5、修改地址栏过长导致的报错
Client_header_ buffer_size 100k;#客户端请求的包头数据url长度,包括地址栏的信息
Large_client_header_buffers 4 100k; #如果上述的容量不够,则再开启四个100k
6、定义客户端缓存nginx网页数据
定义对静态页面的缓存时间
7、开配置Nginx支持PHP动态网站,因为有大量PHP脚本需要执行,因此还需要开启Nginx的各种fastcgi缓存,加速PHP脚本的执行速度。
fastcgi_buffers 8 16k; #缓存php生成的页面内容,8个16k
fastcgi_buffer_size 32k; #缓存php生产的头部信息,32k
fastcgi_connect_timeout 300; #连接PHP的超时时间,300秒
fastcgi_send_timeout 300; #发送请求的超时时间,300秒
fastcgi_read_timeout 300; #读取请求的超时时间,300秒启支持php动态解析
8、利用memcached解决重复登录问题
需要安装php-pcel-memcache 将memcached与php关联起来
安装memcache
在php 文件中修改配置文件
9、使用varnish加速网站服务
安装varnish pcer-devel readline python-docutils
解压安装varnish
创建varnish用户
cp /etc/example.vcl/ /usr/local/etc/default.vcl
vim /etc/usr/local/etc/default.vcl
Varnish -f /usr/local/etc/default.vcl 启动varnish
10、删除不要的模块—without
--without-http_autoindex_module
--without-http_ssimodule 删除自动索引文件目录模块
11、隐藏版本信息
server_tokens off; 隐藏具体的版本号
12、限制用户访问频率
DDOS攻击者会发送大量的并发连接,占用服务器资源(包括连接数、带宽等),这样会导致正常用户处于等待或无法访问服务器的状态
nginx_http_limit_req_module模块 可以有效降低ddos攻击的风险
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name localhost;
limit_req zone=one burst=5;}
限制并发数量
Nginx中的ngx_http_limit_conn_module模块提供了限制并发连接数的功能,可以使用limit_conn_zone指令以及limit_conn执行进行配置。接下来我们可以通过一个简单的例子来看下:
http {
limit_conn_zone $binary_remote_addr zone=myip:10m;
limit_conn_zone $server_name zone=myServerName:10m;
}
server {
location / {
limit_conn myip 10;
limit_conn myServerName 100;
rewrite / http://www.lijie.net permanent;
}
}
13、拒绝非法请求
#如果用户使用非GET或POST方法访问网站,则retrun返回错误信息
if ($request_method !~ ^(GET|POST)$ ) {
return 444;
}
14、防止buffer溢出
当客户端连接服务器时,服务器会启用各种缓存,用来存放连接的状态信息。
如果攻击者发送大量的连接请求,而服务器不对缓存做限制的话,内存数据就有可能溢出(空间不足)
client_body_buffer_size 1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
15、隐藏版本信息和头部信息
在配置文件中添加server_tokens off;治标不治本,php探针还可以看到
1,修改src/core/nginx.h(Nginx内部名称的)
#define NGINX_VERSION "1.12.0"
#define NGINX_VER "nginx/" NGINX_VERSION
2,修改src/http/ngx_http_header_filter_module.c(HTTP ResponseHeader)
static u_char ngx_http_server_string[] = "Server: nginx" CRLF
3,修改src/http/ngx_http_special_response.c(修改错误页的底部Footer)
static u_char ngx_http_error_tail[] = 下的nginx信息
15、 页面出错了如何排查
先看页面,看具体哪个页面出错,是否复现,不复现需要考虑是否偶发现象,复现则查看f12信息,包括路由跳转是否正确(request url拼接正确),状态码,console报错信息,如果未能定位到根因,查看对应组件应用日志,定位具体原因,包括连接超时(如关联组件挂了无法连接),网络问题,代码问题,数据写入格式问题等,如果非平台性问题,联系开发人员去解决,是平台性问题则去依次排查各组件及配置
15、Rewrite全局变量是什么?
|
变量 |
含义 |
|
$args |
这个变量等于请求行中的参数,同$query_string |
|
$content length |
请求头中的Content-length字段。 |
|
$content_type |
请求头中的Content-Type字段。 |
|
$document_root |
当前请求在root指令中指定的值。 |
|
$host |
请求主机头字段,否则为服务器名称。 |
|
$http_user_agent |
客户端agent信息 |
|
$http_cookie |
客户端cookie信息 |
|
$limit_rate |
这个变量可以限制连接速率。 |
|
$request_method |
客户端请求的动作,通常为GET或POST。 |
|
$remote_addr |
客户端的IP地址。 |
|
$remote_port |
客户端的端口。 |
|
$remote_user |
已经经过Auth Basic Module验证的用户名。 |
|
$request_filename |
当前请求的文件路径,由root或alias指令与URI请求生成。 |
|
$scheme |
HTTP方法(如http,https)。 |
|
$server_protocol |
请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 |
|
$server_addr |
服务器地址,在完成一次系统调用后可以确定这个值。 |
|
$server_name |
服务器名称。 |
|
$server_port |
请求到达服务器的端口号。 |
|
$request_uri |
包含请求参数的原始URI,不包含主机名,如”/foo/bar.php?arg=baz”。 |
|
$uri |
不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。 |
|
$document_uri |
与$uri相同。 |
16、nginx访问常用脚本
1.根据访问IP统计UV
awk '{print $1}' access.log|sort | uniq -c |wc -l
2.统计访问URL统计PV
awk '{print $7}' access.log|wc -l
3.查询访问最频繁的URL
awk '{print $7}' access.log|sort | uniq -c |sort -n -k 1 -r|more
4.查询访问最频繁的IP
awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|more
5.根据时间段统计查看日志
cat access.log| sed -n '/14\/Mar\/2015:21/,/14\/Mar\/2015:22/p'|more
6.查看nginx的并发量
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
浙公网安备 33010602011771号