目录
Nginx 特性
- NGINX 使用可扩展的事件驱动架构,而不是更传统的过程驱动架构。这需要更低的内存占用,并且当并发连接扩大时,使内存使用更可预测。
- NGINX 开发的目标是实现 10 倍以上的性能,优化服务器资源的使用,同时也能够扩展和支持网站的动态增长。 因此,NGINX 成为最知名的模块化,事件驱动,异步,单线程 Web 服务器和 Web 代理之一。
nginx的三大主要功能
- 静态web服务器
- 反向代理
- 负载均衡
Nginx配置文件解析
#user nobody;
user root;
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 {
# configuration of connection processing
worker_connections 1024;
}
#TCP 协议流量
stream {
}
#Mail 协议流量
mail {
}
# HTTP 协议流量
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;
#置将错误消息的最小严重性级别更改为从错误记录到警告
error_log logs/error.log warn;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
charset utf-8;
#gzip on;
server {
#监听端口 8080
listen 8080;
#所有请求映射到本地文件系统上的/data/up1 目录
# 请注意,root 指令位于server 块上下文中。 当选择用于服务请求的 location 块不包含自己的 root指令时,将使用此 root 指令。
root /data/up1;
location / {
# 代理服务器配置
proxy_pass http://localhost:8080;
}
#该参数是一个正则表达式,匹配所有以.gif,.jpg 或.png 结尾的 URI。正则表达式之前应该是~字符。
#相应的请求将映射到/data/images 目录。
#当 nginx 选择一个 location 块来提供请求时,它首先检查指定前缀的location 指令,记住具有最长前缀的 location,然后检查正则表达式。
#如果与正则表达式匹配,nginx 会选择此 location,否则选择之前记住的那一个。
#正则表达式之前是区分大小写匹配的波形符号(~),或者不区分大小写匹配的波形符号(~*)。
#使用^~修饰符对正则表达式给予更高的优先级
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#选择处理请求的位置的确切逻辑:
#1. 测试所有 URI 的前缀字符串。
#2. =(等号)修饰符定义了 URI 和前缀字符串完全匹配。如果找到完全匹配,则搜索停止。
#3. 如果^~(插入符号)修饰符预先添加最长匹配前缀字符串,则不会检查正则表达式。
#4. 存储最长匹配的前缀字符串。
#5. 根据正则表达式测试 URI。 断开第一个匹配的正则表达式并使用相应的位置。
#6. 如果没有正则表达式匹配,则使用与存储的前缀字符串相对应的位置。
# 对于匹配请求,URI 将被添加到root指令中指定的路径,以形成本地文件系统上所请求文件的路径。
# 如果有几个匹配的 location 块,nginx 将选择具有最长前缀来匹配 location 块。
# 提供静态内容服务(静态网站)
# 访问 /usr/local/nginx/html/www路径下的内容
location / {
root /usr/local/nginx/html/www;
}
#重写 HTTP 响应
location /test {
sub_filter /blog/ /blog-staging/;
#sub_filter_once 指令告诉 NGINX 在一个位置(location)内连续应用 sub_filter 伪指令
sub_filter_once off;
}
# 访问/usr/local/nginx/html/images路径下的资源
location /images/ {
root /usr/local/nginx/html/images;
}
location /permanently/moved/url {
#返回特定状态码
# 返回的第一个参数是响应代码。可选的第二个参数可以是重定向的 URL(代码 301,302,303和 307)或在响应体中返回文本。
return 301 http://www.example.com/moved/here;
}
location /users/ {
#重写 URI 请求
#该指令具有一个可选参数和两个必需参数
#第一个(必需)参数是请求 URI 必须匹配的正则表达式
#第二个参数是用于替换匹配 URI 的 URI。
#可选的第三个参数是可以停止进一步重写指令的处理或发送重定向(代码 301 或 302)的标志。
#last - 停止执行当前服务器或位置上下文中的重写指令,但是 NGINX 会搜索与重写的URI 匹配的位置,并且应用新位置中的任何重写指令(URI 可以再次更改,往下继续匹配)。
#break - 像 break 指令一样,在当前上下文中停止处理重写指令,并取消搜索与新 URI匹配的位置。新位置(location)块中的 rewrite 指令不执行。
rewrite ^/users/(.*)$ /show?user=$1 break;
}
location /login {
fastcgi_pass 127.0.0.1:10000;
include fastcgi.conf;
}
location /reg {
fastcgi_pass 127.0.0.1:10001;
include fastcgi.conf;
}
location /upload {
fastcgi_pass 127.0.0.1:10002;
include fastcgi.conf;
}
location /md5 {
fastcgi_pass 127.0.0.1:10003;
include fastcgi.conf;
}
location /myfiles {
fastcgi_pass 127.0.0.1:10004;
include fastcgi.conf;
}
location /dealfile {
fastcgi_pass 127.0.0.1:10005;
include fastcgi.conf;
}
location /sharefiles {
fastcgi_pass 127.0.0.1:10006;
include fastcgi.conf;
}
location /dealsharefile {
fastcgi_pass 127.0.0.1:10007;
include fastcgi.conf;
}
location /group1/M00 {
root /root/datas/fastdfs/storage/fastdfs0/data;
ngx_fastdfs_module;
}
location /test {
fastcgi_pass 127.0.0.1:8001;
fastcgi_index test;
include fastcgi.conf;
}
location /static/ {
alias /var/www/static/;
}
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;
# }
#}
include /usr/local/nginx/conf/conf.d/*.conf;
}
指令:
- root 指令指定将用于搜索文件的根目录。
- index 指令定义索引文件的名称(默认值为 index.html)。可以在索引指令中列出多个文件名。 NGINX 以指定的顺序搜索文件,并返回它找到的第一个文件。
- 要配置 NGINX 以返回自动生成的目录列表,请将 on 参数添加到 autoindex 指令中
location / {
index index.$geo.html index.html index.html;
}
这里使用的$geo 变量是通过 geo 指令设置的自定义变量。 变量的值取决于客户端的 IP 地址。
- try_files 指令可用于检查指定的文件或目录是否存在并进行内部重定向,如果没有指定的文件或目录,则返回特定的状态代码。
- 启用sendfile 指令将消除将数据复制到缓冲区中的步骤,并允许将数据从一个文件描述符直接复制到另一个文件描述符。
- sendfile_max_chunk 指令来限制在单个 sendfile()调用中传输的数据量,防止一个快速连接完全占用工作进程
- tcp_nopush: 与 sendfile 一起使用。 该选项将使 NGINX 能够通过 sendfile 获取数据块之后,在一个数据包中发送 HTTP 响应头
- tcp_nodelay 选项可以覆盖 Nagle 的算法,最初是为了解决慢网络中的小数据包问题而设计的。 该算法将大量小数据包整合到较大的数据包中,并以 200 ms 的延迟发送数据包。默认情况下,tcp_nodelay 指令设置为 on,表示 Nagle 的算法被禁用。 该选项仅用于 Keepalive 连接
- 在一个 location 块内指定 proxy_pass 指令, 将请求传递给 HTTP 代理服务器
- proxy_set_header: 修改请求标头
- proxy_buffering:负责启用和禁用缓冲, 默认情况下,它被设置为开启且缓冲已启用
- proxy_buffers 指令控制分配给请求的缓冲区的大小和数量
- 来自代理服务器的响应的第一部分存储在单独的缓冲区中,其大小由 proxy_buffer_size 指令设置。 这部分通常包含一个比较小的响应头,并且可以比其余的响应的缓冲区小
- proxy_bind:配置代理服务器的出口地址,然后配置内部机器只接收来自该出口地址的请求
- gzip on;启用压缩
- 默认情况下,NGINX 仅使用 MIME 类型 text/html 压缩响应。要使用其他 MIME 类型压缩
响应,请包含 gzip_types 指令并列出其他类型。
gzip_types text/plain application/xml; - 要指定要压缩的响应的最小长度,请使用 gzip_min_length 指令。 默认值为 20 字节(可将此
处调整为 1000): - Nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含"Via"的 header头。
- gunzip :启用运行时解压缩
- gzip_static:将文件的压缩版本发送到客户端而不是常规文件
- 要启用缓存,请在顶层的 http 上下文中包含 proxy_cache_path 指令。 强制的第一个参数是缓存内容的本地文件系统路径,强制 keys_zone 参数定义用于存储有关缓存项目的元数据的共享内存区域的名称和大小:
http {
...
proxy_cache_path /data/nginx/cache keys_zone=one:10m;
}
参数:
loader_threshold - 迭代的持续时间,以毫秒为单位(默认为 200)
loader_files - 在一次迭代期间加载的最大项目数(默认为 100)
loader_sleeps - 迭代之间的延迟(以毫秒为单位)(默认为 50)
proxy_cache_path /data/nginx/cache keys_zone=one:10m
loader_threshold=300 loader_files=200;
- 然后在要缓存服务器响应的上下文(协议类型,虚拟服务器或位置)中包含 proxy_cache 指令,将由 keys_zone 参数定义的区域名称指定为 proxy_cache_path 指令
http {
...
proxy_cache_path /data/nginx/cache keys_zone=one:10m;
server {
proxy_cache one;
location / {
proxy_pass http://localhost:8000;
}
} }
- proxy_cache_min_uses :定 义 在 缓 存 响 应 之 前 必 须 进 行 具 有 相 同 密 钥 的 请 求 的 最 小 次 数
- proxy_cache_methods :使用除 GET 和 HEAD 之外的方法来缓存对请求的响应,请将它们与 GET 和 HEAD 一起列为proxy_cache_methods 伪指令的参数
proxy_cache_methods GET HEAD POST;
- proxy_cache_valid :要限制缓存响应与特定状态代码被认为有效的时间
- proxy_cache_bypass:定义 NGINX 不会向客户端发送缓存响应的条件
- proxy_no_cache:定义 NGINX 根 本 不 缓 存 响 应 的 条 件
- slice:字节范围缓存
命令
- 查看当前的侦听队列:netstat -Lan
- 调整操作系统 将 net.core.somaxconn 键的值从其默认值(128)增加到足够高的值以能够处理高突发流量:
打开文件:/etc/sysctl.conf,将下面一行添加到文件并保存文件:
net.core.somaxconn = 4096 - 调整 NGINX
如果将 somaxconn 键设置为大于 512 的值,请更改 NGINX listen 指令的 backlog 参数以
匹配:
server {
listen 80 backlog 4096;
# The rest of server configuration
}
负载均衡方法
- 循环算法的负载均衡
使用循环方案,将根据您在nginx.conf 文件中设置的顺序轮流选择每个服务器。这平衡了短期操作的请求数量。
#定义要包含在负载均衡方案中的服务器。
#最好使用服务器的私有IP以获得更好的性能和安全性。
http {
upstream backend {
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}
#该服务器接受到端口80的所有流量并将其传递给上游upstream 。
#请注意,upstream名称和proxy_pass需要匹配。
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
- 最少连接的负载均衡
此方法将请求定向到当时具有最少活动连接的服务器。对于请求有时可能需要更长时间才能完成的应用程序,它比循环法更有效。
upstream backend {
least_conn;
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}
- IPhash
IPhash使用访问者IP地址作为密钥来确定应选择哪个主机来为请求提供服务。这允许访问者每次被定向到同一服务器。
upstream backend {
ip_hash;
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}
- 权重
upstream backend {
server 10.1.0.101 weight=4;
server 10.1.0.102 weight=2;
server 10.1.0.103;
}
- fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend {
fair;
server localhost:8080;
server localhost:8081;
}
- url_hash(第三方)
按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,后端服务器为缓存时比较有效。 在 upstream 中加入 hash 语句,server 语句中不能写入 weight 等其他的参数,hash_method 是使用的 hash 算法
upstream backend {
hash $request_uri;
hash_method crc32;
server localhost:8080;
server localhost:8081;
}