nginx优化

# 普通用户启动 (useradd nginx -s /sbin/nologin -M)
user nginx; # 配置nginx worker进程个数
#worker_processes ;
#worker_cpu_affinity ;
#worker_cpu_affinity ; worker_processes ;
worker_cpu_affinity ; #worker_processes ;
#worker_cpu_affinity ; # 配置日志存放路径
access_log logs/access.log warn;
error_log logs/error.log main;
pid logs/nginx.pid; # nginx事件处理模型优化
events {
worker_connections ; # 当个进程允许的客户端最大连接数
use epoll;
} # 配置nginx worker进程最大打开文件数
work_rlimit_nofile ; http { # 隐藏版本号
server_tokens off; # 设置日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; # 开启高效文件传输模式
include mime.types; # 媒体类型
default_type application/octet-stream; # 默认媒体类型
charset utf-; # 默认字符集
sendfile on;
tcp_nopush on; # 只有在sendfile开启模式下有效 # 设置连接超时时间
keepalive_timeout ; # 设置客户端连接保持会话的超时时间,超过则服务器会关闭该连接
tcp_nodelay on; # 打开tcp_nodelay,在包含了keepalive参数才有效果
client_header_timout ; # 设置客户端请求有超时时间,该时间内客户端未发送数据,nginx将返回‘Request time out()’错误
client_body_timeout ; # 设置客户端请求体超时时间,同上
send_timeout ; # 设置相应客户端的超时时间,超时nginx将会关闭连接 # 上传文件大小设置(动态引用)
client_max_body_size 10m; # 数据包头部缓存大小
client_header_buffer_size 1k; #默认请求包头信息的缓存
large_client_header_buffers 4k; #大请求包头部信息的缓存个数与容量 # 压缩处理
gzip on; #开启压缩
gzip_min_length 1k; #小文件不压缩
gzip_comp_level ; #压缩比率
gzip_buffers 16k; #压缩缓冲区大小,申请4个单位为16K的内存作为亚索结果流缓存
gzip_http_version 1.1 # 默认压缩版本
#对特定文件压缩,类型参考mime.types
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on;
gzip_disable "MSIE[1-6]\."; # 设置fastcgi
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=:
keys_zone=TEST:10m
inactive=5m; # 为FastCGI缓存指定一个路径,目录结构等级,关键字区域存储时间和非活动删除时间
fastcgi_connect_timeout ; # 指定连接到后端FastCGI的超时时间
fastcgi_send_timeout ; # 向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间
fastcgi_read_timeout ; # 接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间
fastcgi_buffer_size 16k; # 缓冲区大小
fastcgi_buffers 16k;
fastcgi_busy_buffers_size 16k;
fastcgi_temp_file_write_size 16k; # 在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍
fastcgi_cache TEST; # 开启FastCGI缓存并且为其制定一个名称
fastcgi_cache_valid 1h;
fastcgi_cache_valid 1d;
fastcgi_cache_valid any 1m; # 为指定的应答代码指定缓存时间,上例中将200,302应答缓存一小时,301应答缓存1天,其他为1分钟
fastcgi_cache_min_uses ; # 5分钟内某文件1次也没有被使用,那么这个文件将被移除
fastcgi_cache_use_stale error timeout invalid_header http_500; # 内存缓存
open_file_cache max= inactive=20s; #设置服务器最大缓存文件数量,关闭20秒内无请求的文件
open_file_cache_valid 60s; #文件句柄的有效时间是60秒,60秒后过期
open_file_cache_min_uses ; #只有访问次数超过5次会被缓存
open_file_cache_errors off;
}

# 引入子配置文件
include vhost/*.conf # 限制客户端请求的http方法
#if ($request_method !~ ^(GET|HEAD|POST)$ ) {
# return 501;
#} # 防止N多爬虫代理访问网站
if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot") {
return 403;
}
}
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
expires 30d; #定义客户端缓存时间为30天
}

nginx的upstream的负载均衡 目前支持的几种方式

1.轮询(默认)----每个请求按时间顺序逐一分配到不同的后端服务器(down掉的服务器会被自动剔除)

upstream bakend {
server 192.168.1.1;
server 192.168.1.2;
}

2.weight----指定轮询几率,weight与访问成正比,可将性能好的服务器配置较大的weight(down掉的服务器会自动剔除)

upstream bakend {
server 192.168.1.1 weight=;
server 192.168.1.2 weight=;
}

3.ip_hash----按请求的ip hash结果分配,这样每个访客固定访问一个后端服务器,可解决session共享问题(down掉的服务器要手工处理)

upstream real_server{
ip_hash;
server 192.168.1.1:8080 max_fails=3 fail_timeout=15s;
server 192.168.1.2:8080 max_fails=3 fail_timeout=15s;
}

4.fire(第3方插件)---按后端服务器的响应时间来分配请求,响应时间短的优先分配

upstream real_server{
server 192.168.1.1:;
server 192.168.1.2:;
fair;
}

5.url_hash(第三方插件)---按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器时有效

upstream real_server{
server 192.168.1.1:;
server 192.168.1.2:;
hash $request_uri;
hash_method crc32;
}

示例

client_body_buffer_size    128k;                        //允许客户端请求缓存大小
client_max_body_size 100m; //允许请求的最大文件容量
large-client_header_buffers 8k; //
proxy_buffering on; //开启代理缓冲功能
proxy_buffer_size 8k; //第一部分响应数据的缓存大小
proxy_buffers 128k; //响应数据的缓存个数和容量
proxy_cache_path /usr/local/nginx/cache levels=: keys_zone=one:100m inactive=1d max_size=2G; //设置缓存目录,levels设置缓存个数,keys_zone定义缓存名字和容量,inactive定义缓存存活时间,max_size定义硬盘的缓存容量
proxy_connect_timeout 60s; //与后端服务器建立TCP连接握手超时时间
upstream servers { //ip_hash;ip_hash确保相同客户端ip使用相同的后端服务器,不适用就默认轮询
server 192.168.1.3: max_fails= fail_timeout=30s weight=;
server 192.168.1.4: max_fails= fail_timeout=30s weight=;
server 192.168.1.5: max_fails= fail_timeout=30s weight=;
} server {
listen ;
server_name web.test.com;
access_log logs/host.access.log main;
# location ~* \.(mp3|mp4)$ { //匹配URL以MP3或者MP4结尾的请求
# proxy_pass http://localhost:8080 //转发到本机8080端口
# } # location / { //匹配任意URL
# proxy_pass http://localhost:8080 //转发到本机8080端口
# proxy_set_header X-Forwarded-For $remote_addr //保留用户真实IP
# } location / {
proxy_pass http://servers;
proxy_cache one;
proxy_set_header X-Forwarded-For $remote_addr;
}
}

nginx的rewrite规则

1.根据浏览器标识,访问资源重定向到指定文件目录(以下为IE)

if ($http_user_agent ~ MSIE ) {
   rewrite ^(.*)$ /msie/$1 break;
}

2.将移动客户端的请求重定向到其他服务器

if    ($http_user_agent ~* '(iphone|ipod)' )  { 
    rewrite ^.+    http://mobile.site.com$uri;
}

3.用户使用POST方式请求数据时候,返回405:

if ($request_method = POST ) {
return ;
}

4.访问xxxx时重定向到xxxx目录

location /xxxx {
rewrite ^/xxxx/.*$ /xxxx permanent;
}

Nginx Rewrite的基本标记

last       基本上都用这个Flag。相当于Apache里的[L]标记,表示完成rewrite,不再匹配后面的规则
break 中止 Rewirte,不再继续匹配
redirect 返回临时重定向的HTTP状态302
permanent 返回永久重定向的HTTP状态301。原有的url支持正则,重写的url不支持正则

正则表达式匹配

* ~       区分大小写匹配
* ~*      不区分大小写匹配
* !~和!~*   区分大小写不匹配及不区分大小写不匹配

文件及目录匹配

* -f 和!-f    用来判断是否存在文件
* -d 和!-d 用来判断是否存在目录
* -e 和!-e 用来判断是否存在文件或目录
* -x 和!-x 用来判断文件是否可执行

Nginx的一些可用的全局变量,可用做条件判断:

$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri

if指令

)一个变量名;false如果这个变量是空字符串或者以0开始的字符串;
)使用= ,!= 比较的一个变量和字符串
)是用~, ~*与正则表达式匹配的变量,如果这个正则表达式中包含},;则整个表达式需要用" 或' 包围
)使用-f ,!-f 检查一个文件是否存在
)使用-d, !-d 检查一个目录是否存在
)使用-e ,!-e 检查一个文件、目录、符号链接是否存在
)使用-x , !-x 检查一个文件是否可执行
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$ break;
} if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $;
} if ($request_method = POST) {
return ;
} if ($slow) {
limit_rate 10k;
} if ($invalid_referer) {
return ;
} location ~*  \.(js|css|jpg|jpeg|gif|png|swf)$ {
  if (-f $request_filename) {
     root /data/www/wwwroot/bbs;
     expires 1d;
     break;
  }
} ocation ~  ^/(images|JavaScript|js|css|flash|media|static)/ {
   root /data/www/wwwroot/down;
   expires 30d;
}

nginx优化、负载均衡、rewrite的更多相关文章

  1. nginx+tomcat负载均衡

    最近练习nginx+tomcat负载均衡.根据一些资料整理了大体思路,最终实现了1个nginx+2个tomcat负载均衡. 安装JDK 1>进入安装目录,给所有用户添加可执行的权限 #chmod ...

  2. [转载] nginx的负载均衡

    原文:http://www.srhang.me/blog/2014/08/27/nginx-loabbalance/ Nginx负载均衡 一.特点 1.1 应用情况 Nginx做为一个强大的Web服务 ...

  3. nginx+tomcat负载均衡策略

    測试环境均为本地,測试软件为: nginx-1.6.0,apache-tomcat-7.0.42-1.apache-tomcat-7.0.42-2.apache-tomcat-7.0.42-3 利用n ...

  4. Nginx实现负载均衡&Nginx缓存功能

    一.Nginx是什么 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambl ...

  5. 利用nginx实现负载均衡和动静分离

    1.Nginx介绍 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器 . Nginx 是由 ...

  6. Nginx实现负载均衡功能

    一.什么是Nginx? Nginx是一款轻量级的Web 服务器.反向代理服务器.电子邮件(IMAP/POP3)代理服务器. 二.Nginx的优点: 高并发连接:官方测试Nginx能够支撑5万并发连接, ...

  7. Nginx+DNS负载均衡实现

    负载均衡有多种实现方法,nginx.apache.LVS.F5硬件.DNS等. DNS的负载均衡就是一个域名指向多个ip地址,客户访问的时候进行轮询解析 操作方法,在域名服务商解析的DNS也可以是第三 ...

  8. Nginx的负载均衡

    什么是负载均衡 负载均衡主要通过专门的硬件设备或者通过软件算法实现.通过硬件设备实现的负载均衡效果好.效率高.性能稳定,但是成本比较高.通过软件实现的负载均衡主要依赖于均衡算法的选择和程序的健壮性.均 ...

  9. 死磕nginx系列--使用nginx做负载均衡

    使用nginx做负载均衡的两大模块: upstream 定义负载节点池. location 模块 进行URL匹配. proxy模块 发送请求给upstream定义的节点池. upstream模块解读 ...

  10. nginx搭建负载均衡

    负载均衡:针对web负载均衡简单的说就是将请求通过负债均衡软件或者负载均衡器将流量分摊到其它服务器. 负载均衡的分类如下图: 今天分享一下nginx实现负载均衡的实现,操作很简单就是利用了nginx的 ...

随机推荐

  1. nRF24L01P数据传输速率

    项目要用nRF24L01P做语音的传输,数据量可想而知. 发送端按照8KHz/s采样率,每次采样双声道,16位深度(2Bytes). 数据量算一下就是8000x2x2=32000(Bytes) nRF ...

  2. Microsoft的考验――查找第二大的数

    #include<stdio.h> int main() { int n,m,t,max,max1; scanf("%d",&n); while(n--) { ...

  3. kubernetes 实践三:使用kubeadm安装k8s1.16.0

    环境版本说明: 三台vmware虚拟机,系统版本CentOS7.6. Kubernetes 1.16.0,当前最新版. flannel v0.11 docker 18.09 使用kubeadm可以简单 ...

  4. Java开发环境的搭建02——IntelliJ IDEA篇(Windows)

    1.IntelliJ IDEA的下载与安装 IntelliJ IDEA简称IDEA,由JetBrains公司开发,是java语言开发的集成环境,也是目前业界被公认的最好的java开发工具之一.尤其在智 ...

  5. 【LEETCODE】46、999. Available Captures for Rook

    package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...

  6. JVM运行参数优化详细教程

    获取设置的参数str的值:  常用的-X参数有以下这些: 手动调用GC执行垃圾回收操作:(-XX:+DisableExplicitGC 手动调用将会失效) 查看tomcat的进程ID: 或者:

  7. 成员函数内定义static变量(不安全,各对象之间共享)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u012317833/article/de ...

  8. LOJ3120 CTS2019 珍珠 生成函数、二项式反演、NTT

    传送门 题目大意:给出一个长度为\(n\)的序列\(a_i\),序列中每一个数可以取\(1\)到\(D\)中的所有数.问共有多少个序列满足:设\(p_i\)表示第\(i\)个数在序列中出现的次数,\( ...

  9. Java Web 深入分析(11) JVM(1)

    前言 Java启动后作为一个进程运行在操作系统中,该进程要分配的内存有以下几个: 1.Java堆: 存储java内存区域,堆大小是在jvm启动时就像操作系统申请完成,其中 -Xmx和-Xms 分别表示 ...

  10. Spring Boot 集成 Swagger 生成 RESTful API 文档

    原文链接: Spring Boot 集成 Swagger 生成 RESTful API 文档 简介 Swagger 官网是这么描述它的:The Best APIs are Built with Swa ...