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. xorm - Update,乐观锁,更新时间updated,NoAutoTime()

    更新数据使用Update方法 Update方法的第一个参数为需要更新的内容,可以为一个结构体指针或者一个Map[string]interface{}类型. 当传入的为结构体指针时,只有非nil和非0的 ...

  2. 可能这些是你想要的H5软键盘兼容方案

    前言 最近一段时间在做 H5 聊天项目,踩过其中一大坑:输入框获取焦点,软键盘弹起,要求输入框吸附(或顶)在输入法框上.需求很明确,看似很简单,其实不然.从实验过一些机型上看,发现主要存在以下问题: ...

  3. JXOI2018

    发现自己不会T3可以退群了 排序问题(组合.模拟) 可以发现Gobo Sort相当于在所有排列中随机选择一个,所以当第\(i\)个数出现次数为\(a_i\)时,期望的Sort次数就是\(\frac{( ...

  4. Ubuntu18.04 GitLab仓库服务器搭建

    首先安装必须的一些服务 sudo apt-get update sudo apt-get install -y curl openssh-server ca-certificates sudo apt ...

  5. MonoSymbolFileException in CheckLineNumberTable

    Mono.CompilerServices.SymbolWriter.MonoSymbolFileException: Exception of type 'Mono.CompilerServices ...

  6. 【转载】C#使用Math.Floor方法来向下取整

    在C#的数值运算中,有时候需要对计算结果舍去小数位保留整数位向下取整即可,此时就可使用内置方法Math.Floor来实现向下取整操作,Math.Floor方法将舍去小数部分,保留整数.Math.Flo ...

  7. Swift枚举的全用法

    鉴于昨天开会部门会议讨论的时候,发现有些朋友对枚举的用法还是存在一些疑问,所以就写下这个文章,介绍下Swift下的枚举的用法. 基本的枚举类型 来,二话不说,我们先贴一个最基本的枚举: enum Mo ...

  8. Json序列化 总结

    案例总结:https://www.cnblogs.com/jsll/p/11855349.html public string Json_GetDepartment_Position(...)//st ...

  9. RabbitMQ java 原生代码

    rabbitMQ 的交换器有四种类型:direct.fanout.topic.headers 以下是具体的代码: direct:路由键只能全部匹配,才能进入到指定队列中.其他使用 direct生产者 ...

  10. 输入web网站点击之后发生的事情

    (1)用户在浏览器(客户端)里输入或者点击一个连接: (2)浏览器向服务器发送HTTP请求: (3)服务器处理请求,如果查询字符串或者请求体里含有参数,服务器也会把这些参数信息考虑进去: (4)服务器 ...