The server of Nginx(三)——Nginx企业级优化
相信看过我之前apache文章的朋友们,对服务优化也有了一个大概的了解,相比较而言,Nginx企业中应用的更多一些,因此今天也会详细阐述Nginx的优化,有人说,服务器不需要优化,开虚拟化,分分钟成倍增加并发量,但是网站服务器优化不仅仅是为了高并发而做,有些优化也涉及到了安全和控制,请大家耐心往下看,如果有哪里写的不明白你们可以评论,我基本每天都上线,会仔细思考大家的问题。
首先提供Nginx主配置文件,大家可先参考了解一下
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
一、隐藏版本号
(1)查看信息:由下列语句看到了nginx的版本号,我们的目的就是要隐藏它
[root@localhost ~]# curl -I http://127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.6.0 #隐藏后此项变为Server: nginx
Date: Thu, 10 Nov 2016 12:51:37 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Thu, 10 Nov 2016 08:08:43 GMT
Connection: keep-alive
ETag: "58242b0b-264"
Accept-Ranges: bytes
(2)有两种方式隐藏版本号:第一种是修改主配置文件;第二种是在编译安装之前就修改源码;
第一种方法:在http { 下添加server_tokens off;
http {
server_tokens off;
如果php配置文件/usr/local/php5/etc/下的fastcgi的配置文件中配置了fastcgi_param SERVER_SOFTWARE选项,则编辑php-fpm配置文件,将fastcgi_param SERVER_SOFTWARE对应的值nginx-1.6.0修改为nginx;
第二种方法:
将下载完成Nginx源码包解压后,到源码目录/usr/src/nginx-1.6.0/src/core中找到nginx.h将版本信息修改后再编译安装
修改前
#define NGINX_VERSION "1.6.0"
#define NGINX_VER "nginx/" NGINX_VERSION
修改后(修改为IIS服务器版本,做伪装)
#define NGINX_VERSION "1.1.1"
#define NGINX_VER "IIS/" NGINX_VERSION
二、修改Nginx用户和组
Nginx进程运行时需要用户和组的支持,默认下使用nobody(所有人),为了防止攻击者拿到权限修改nginx,就要修改用户和组。
修改方法:在编译安装时指定用户与组(--user=nginx --group=nginx),并修改主配置文件指定用户和组,在第一行#user nobody;修改为user nginx nginx;然后ps aux | grep nginx查看,master和worker两个进程中的其中一个worker进程(接收用户请求包的这个进程)的用户变为了nginx
三、配置Nginx网页缓存时间
当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,以避免重复请求,加快了访问的速度,一般针对静态网页进行设置,对动态网页不用设置缓存时间,可在windows客户端中使用抓包工具fiddler查看网页缓存时间,配置后可在header里找到cache参数得到缓存时间
设置方法:可根据特定需要在主配置文件的http段或者server段或者location段加入对特定内容的过期参数,例:
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
expires 1d; #缓存一天
};
四、日志切割
随着Nginx运行时间的增加,产生的日志也会增加,为了方便掌握Nginx的运行状态,需要时刻关注Nginx日志文件,太大的日志文件对监控是一个大灾难,所以要定期进行日志文件的切割。Nginx没有类似Apache的cronlog日志分割处理的功能,但是,可以通过Nginx的信号控制功能的脚本来实现日志的自动切割,并将脚本加入到Linux的计划任务中,让脚本在每天的固定时间执行,比如每天晚上1点半执行脚本,这时我们老的日志文件就会被更名,然后生成一份新的日志文件来承载新的数据,便可实现日志分割功能。
日志分割脚本
#!/bin/bash
# Filename: fenge.sh
d=$(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}/test.com-access.log-$d #把原来的日志改名后放在了新目录下
kill -USER1 $(cat $pid_path) #在/usr/local/nginx/logs/下产生一个新的access.log文件
find $logs_path -mtime +30 | xargs rm -rf #检测下日志的修改时间是30天前的文件并删除掉
加入计划任务
~]#crontab -e
30 1 * * * source /opt/fenge.sh
五、设置连接超时
在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间,但是这个连接超时时间还要根据实际情况设定,比如一个大文件传输需要30分钟,但是连接超时时间设定10分钟,这样这个文件就永远不能传送完。设置后可以使用fiddler工具查看connection参数。
设置方法:
根据需求可在http {}段,server{}段,location{}段中设置参数,以在http{}段设置为例:
修改
keepalive_timeout 65 ; #超时时间65秒
keepalive_timeout 65 180 ; #这个意思是超时时间180秒,以后面的为准
添加
Client_header_timeout 80; #指定等待客户端发送请求头的超时时间,超时提示408错误
Client_body_timeout 80; #设置请求体读超时时间,超时提示408错误
六、更改Nginx运行进程数
Nginx默认只有两个进程,master和worker
配置方法:
在全局配置中更改worker_processes参数,一般设为CPU的个数或者核数,在高并发情况下可设置为CPU个数或者核数的2倍,比如2芯4核(2个物理cpu,每个cpu4核)CPU,一般情况给参数8,高并发就给16,运行进程数多一些,相应客户端访问请求时,Nginx就不会临时启动新的进程提供服务,减少了系统的开销,提升了服务速度。使用cat /proc/cpuinfo来查看cpu信息,其中processor是核数,如果开虚拟机,这个数值是0,其实是1核的意思,physical是cpu个数,使用cat /proc/cpuinfo | grep -c "phycical"语句查看,如果显示为2,那么我们就叫做2路cpu另外使用uname -r可以看cpu版本。设置完可以ps -aux | grep worker看一下,发现worker进程数变多。
默认情况,Nginx的多个进程可能更多的跑在一颗cpu上,可以分配不同的进程给不同的cpu处理,充分利用硬件多核多cpu,例如在一台4核物理服务器,可进行以下配置,将进程进行分配
全局配置中添加:
Worker_cpu_affinity 0001 0010 0100 1000
七、网页压缩
基本上现在所有浏览器都支持解压缩网页的功能,当压缩的网页传到浏览器,浏览器会识别压缩文件,进行解压缩,只有一小部分浏览器不支持解压缩功能,因此配置网页压缩成为可能。
Nginx的ngx_http_gzip_module压缩模块提供了对文件内容压缩的功能,允许nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装,如果不想安装,在预配置的时候还要添加without加这个模块,具体卸载方式可以./configure --help时仔细查看。
可在配置文件中加入相应的压缩功能参数对压缩性能进行优化
配置方法:http{}段
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #用于设置允许压缩的网页最小字节数,意思是低于1k的网页就不需要压缩了
gzip_buffers 4 16k; #表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果,如果不设置的话,默认值是申请与原始数据大小相同的内存空间,这个功能的用法大致是这样的,作为管理员的你,观察你的网页压缩文件都是多大的,然后对这个值进行除以4的处理,把结果写在参数后面,这样就可以快速的相应客户请求了
zip_http_version 1.1; #用于设置识别http协议版本,默认是1.1,目前大部分浏览器已经支持gzip解压,但处理最慢,也比较消耗服务器cpu资源
gzip_comp_level 2; #用来指定gzip压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理速度最慢,使用默认即可
gzip_types test/plain test/javascript test/css test/xml application/x-javascript application/xml application/xml+rss; #压缩类型,是就对哪些网页文档启用压缩功能,也可以写多个,用空格隔开
gzip_vary on; #可以让前端的缓存服务器缓存经过gzip压缩的页面
八、配置防盗链
location ~* \.(jpg|gif|png|swf)$ {
valid_referers none blocked *.test.com test.com;
if ($invalid_referer) {
rewrite ^/ http://www.test.com/img/error.gif;
#return 403;
}
}
配置说明:
valid_referers :设置信任的网站,即能引用相应图片的网站
none :浏览器中referer为空的情况,就是直接在浏览器访问图片
blocked:referer不为空的情况,但是值被代理或防火墙删除了,这些值不以http://或者https://开头
后面的网址或者域名:referer中包含相关字符串的网址
if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为1,则执行后面的操作,即进行重写或返回403页面
九、fpm参数优化
Nginx的PHP解析功能实现如果是交由FPM处理的,为了提高PHP的处理速度,可对FPM模块进行参数的调整,配置文件php-fpm.conf
FPM优化参数讲解
pm : 使用哪种方式启动fpm进程,可以使static和dynamic,前者将产生固定数量的fpm进程,后者将以动态的方式产生fpm进程
pm.max_children : 静态方式下开启的fpm进程数
pm.start_servers : 动态方式下初始的fpm进程数量
pm.min_spare_servers : 动态方式下最小的fpm空闲进程数
pm.max_spare_servers : 动态方式下最大的fpm空闲进程数
注意:以上动静参数要根据服务器的内存与服务负载进行调整。
实际举例:(只需修改参数即可,不需手动添加)
pm = dynamic
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
The server of Nginx(三)——Nginx企业级优化的更多相关文章
- 快速掌握Nginx(三) —— Nginx+Systemd托管netcore应用
以前dotnet web应用程序开发完成后,我们都是使用IIS部署在Windows Server上,如今netcore技术发展迅速,因为其跨平台的特性,将dotnet web应用程序部署在更方便部署和 ...
- Nginx企业级优化
Nginx企业级优化 一.隐藏版本号信息 安装软件前修改,源码包中的版本信息 #切换到源码包目录[root@localhost ~]# cd /usr/src/nginx-1.15.9/[root@l ...
- 【夯实Nginx基础】Nginx工作原理和优化、漏洞
本文地址 原文地址 本文提纲: 1. Nginx的模块与工作原理 2. Nginx的进程模型 3 . NginxFastCGI运行原理 3.1 什么是 FastCGI ...
- Nginx架构的企业级应用
Nginx架构的企业级应用 ==================================================== 实现HA高可用集群 实现LB负载均衡集群 Nginx实现反向代理 ...
- Nginx工作原理和优化、漏洞
1. Nginx的模块与工作原理 第三方模块:HTTP Upstream Request Hash模块.Notice模块和HTTP Access Key模块. 图1-1展示了Nginx模块常规的HT ...
- Nginx 工作原理和优化、漏洞
1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(locat ...
- Nginx工作原理和优化、漏洞(转)
查看安装了哪些模块命令: [root@RG-PowerCache-X xcache]# nginx/sbin/nginx -Vnginx version: nginx/1.2.3built by gc ...
- nginx指令中的优化(配置文件)
nginx指令中的优化(配置文件)worker_processes 8; nginx进程数,建议按照cpu数目来指定,一般为它的倍数.worker_cpu_affinity 00000001 0000 ...
- Nginx基本的安全优化
为了防止nginx出现软件漏洞,我们要对nginx软件服务加强一些安全性,下面就介绍一下基本的安全优化 1.隐藏nginx版本号: 想要隐藏,首先我们要了解所使用软件的版本号,我们可以在Linux中查 ...
随机推荐
- 实现SwipeRefreshLayout首次进入自动刷新
看到了Android版知乎实现了这种效果,就自己也实现了一下. 先来一张效果图 实现方式: 方法一. ①在onWindowFocusChanged()方法中,设置为刷新状态为true @Overrid ...
- 03.什么是Lucene全文检索的原理01
全文检索的原理:查询速度快,精准度高,可以根据相关度进行排序.它的原理是:先把内容分词,分词之后建索引. Lucene是apache下的一个开放源代码的全文检索引擎工具包. 提供了完整的查询引擎和索引 ...
- 【总结整理】UGC内容
除了内容了产品,还有什么适合引入UGC? :引发讨论,诱导参与,然后促成销售. User Generated Content,也就是用户生成内容的意思. 购买类产品,内容催生购买 1.为用户购买提供思 ...
- C++ 模板 与 泛型编程
C++ 模板 与 泛型编程 前言 模板有两种:类模板和函数模板 .模板是泛型编程的基础. 什么叫:泛型编程? 使用独立于特定类型的方式进行编程.也就是我们在编程的时候不明确的写上类型,而是使用一个模板 ...
- sqlserver全备份,差异备份和日志备份
差异备份是以上一个全备为基点,这个期间所有差异数据的备份. 日志备份是基于前一个全备+日志备份为基点,这个期间的事务日志的备份.(日志备份用于确保还原数据库到某个时间点) 在利用全备+日志备份 ...
- maven filter插件只替换了部分变量问题
maven filter简介 maven的resources插件,有一个filter的作用,能够在打包的时候,从特定文件里读取key-value对,替换配置文件中的占位符变量.很多线上线下有不同环境的 ...
- [模板]KMP字符串匹配
洛谷P3375 注意:两次过程大致相同,故要熟读熟记,切勿搞混 可以看看其他的教程:http://www.cnblogs.com/c-cloud/p/3224788.html 本来就不太熟,若是在记不 ...
- pcl point merge
http://pointclouds.org/documentation/tutorials/pairwise_incremental_registration.php#pairwise-increm ...
- Web测试实践--Rec 3
累计完成任务情况: 阶段内容 参与人 根据功能性分析得出结论 小梁 对被测系统进行功能性分析 小龙.小黄 进行用户调研 小熊 开会学习作业要求,取得共识 全体 注: 1."阶段内容" ...
- Ubuntu14.04-LTS 从系统安装到配置可用
1.安装Ubuntu14.04LTS-64bit 使用U盘安装很方便快捷,可以使用老毛桃使用iso模式制作一个U盘启动盘,然后分区安装. 如果使用硬盘安装的话需要注意的问题是: 如果电脑上以前有Lin ...