nginx配置
Nginx配置文件主要分为:全局设置、http块配置。全局配置用于配置进程、日志、工作模式、连接数等公共配置;http块配置用于配置日志格式、连接超时时间、gzip、缓冲等设置,通常包含1个或多个sever块。
http块通常包含:server
(主机设置)、upstream
(上游服务器设置,主要为反向代理、负载均衡相关配置)。server
又包含location
。
server部分
的指令主要用于指定虚拟主机域名、IP和端口;upstream
的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;location部分
用于匹配网页位置(比如,根目录"/","/images",等等)。
他们之间的关系式:server继承全局设置,location继承server;upstream既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。
可以有多个server,location属于server子集。
nginx配置详解
nginx.conf
配置详解:
# 运行用户user nginx;# worker角色的工作进程个数,简单可设置为CPU核数worker_processes 2; # CPU亲和性设置# 如果是2核,则是01 10# 如果是4核,则是0001 0010 0100 1000#worker_cpu_affinity 01 10;# 全局错误日志#error_log logs/error.log;#error_log logs/error.log crit;error_log logs/error.log notice;#error_log logs/error.log info;# PID文件pid logs/nginx.pid;# worker进程可以允许打开的最大文件数worker_rlimit_nofile 65535;# 工作模式及连接数上限events { # epoll是多路复用IO(I/O Multiplexing)中的一种方式, # 仅用于linux2.6以上内核,可以大大提高nginx的性能 use epoll; # 单个后台worker process进程的最大并发链接数 worker_connections 65535;}# http设置http { # 设定mime类型,类型由mime.type文件定义 include mime.types; default_type application/octet-stream; # log格式设置 # log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; # 设置日志路径,使用定义的main格式 access_log logs/access.log main; # 设置是否显示目录 #autoindex on; #autoindex_exact_size off; # 人性化方式显示文件大小否则以byte显示 #autoindex_localtime on; # 按服务器时间显示,否则以gmt时间显示 # 解决虚拟主机名字过长 http://www.jb51.net/article/26412.htm server_names_hash_bucket_size 128; # sendfile指令设置 #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件, #对于普通应用,必须设为 on, #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime sendfile on; #tcp_nopush on; # 开启gzip压缩,减少网络传输,建议开启 gzip on; gzip_min_length 200; # 最小长度为多少才开启 gzip_buffers 4 32k; gzip_comp_level 6; gzip_types text/plain application/x-javascript application/javascript text/css application/xml text/javascript; gzip_vary on; # 客户端设置 keepalive_timeout 65; # 连接超时时间 tcp_nodelay on; send_timeout 20; # 指定响应客户端的超时时间 # 设定客户端请求缓冲 large_client_header_buffers 4 128k; client_header_buffer_size 128k; client_max_body_size 10m;# 允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; # 缓冲区代理缓冲用户端请求的最大字节数 # FastCGI设置 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; # ignore Client Closed Request fastcgi_ignore_client_abort on; # nginx带宽限制 #limit_zone crawler $binary_remote_addr 10m; # http_proxy设置,按需设置 #proxy_connect_timeout 75; # 代理连接超时 #proxy_send_timeout 75; # 代理发送超时 #proxy_read_timeout 75; # 代理接收超时 #proxy_buffer_size 4k; #proxy_buffers 4 32k; #proxy_busy_buffers_size 64k; #proxy_temp_file_write_size 64k; #proxy_temp_path /www/server/nginx/proxy_temp 1 2; # 设定负载均衡后台服务器列表,按需设置,一般不需要 upstream backend { server 192.168.10.100:8080 max_fails=2 fail_timeout=30s ; server 192.168.10.101:8080 max_fails=2 fail_timeout=30s ; } # 虚拟主机配置,server 指令开始 #include /usr/local/nginx/conf.d/*.conf; # server块必须在http块里,可以放在conf.d目录里面,每个虚拟主机一个,例如mysite.com.conf server{ listen 80; server_name localhost; location /{ root /usr/share/nginx/html; index index.html index.htm; } }}
虚拟主机配置示例
/usr/local/nginx/conf.d/me.52fhy.com.conf
# 虚拟主机配置server { listen 80; server_name me.52fhy.com; index index.php index.html index.htm; root /52fhy.com/wordpress/; # WordPress Rewrite location / { if (-f $request_filename/index.html){ rewrite (.*) $1/index.html break; } if (-f $request_filename/index.php){ rewrite (.*) $1/index.php; } if (!-f $request_filename){ rewrite (.*) /index.php; } } # 解析php|php5后缀 location ~ .*\.(php|php5)?$ { #fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } # 设置gif|jpg|jpeg|png|bmp|swf文件缓存时间 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; # 缓存30天 } # 设置js|css文件缓存时间 location ~ .*\.(js|css)?$ { expires 1h; # 缓存1小时 } # 访问日志 access_log /www/log/me.52fhy.com.log;}
简单的nginx配置示例
nginx.conf,仅用于测试:
user nginx;worker_processes 1;error_log /var/log/nginx/error.log warn;pid /var/run/nginx.pid;events { worker_connections 1024;}http { include /etc/nginx/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 /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; #include /etc/nginx/conf.d/*.conf; server{ listen 80; server_name localhost; location /{ root /usr/share/nginx/html; index index.html index.htm; } }}
nginx优化
优化思路:增加nginx进程可以打开的文件数,增加子进程最大并发连接数;同时进行系统内核优化。系统内核优化也是从单个进程可以打开的文件数、子进程可以打开的连接数等入手。
常见优化参数:
# 内核优化ulimit -n 65535net.core.somaxconn = 262144net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_syncookies = 1# nginx优化worker_rlimit_nofile 65535;use epoll;worker_connections 65535;keepalive_timeout 60;
内核优化如何修改:
1、ulimit参数直接运行ulimit -SHn 65535
即可,可以使用ulimit -n
查看; 2、其它参数优化示例:net.core.somaxconn
对应文件/proc/sys/net/core/somaxconn
: # 查看cat /proc/sys/net/core/somaxconn# 修改echo 65535 > /proc/sys/net/core/somaxconn
net.ipv4.tcp_tw_recycle
对应文件/proc/sys/net/ipv4/tcp_tw_recycle
:
# 查看cat /proc/sys/net/ipv4/tcp_tw_recycle# 修改echo 65535 > /proc/sys/net/ipv4/tcp_tw_recycle
3、也可以修改/etc/sysctl.conf
文件:
# 调高系统的 IP 以及端口数据限制,从可以接受更多的连接net.ipv4.ip_local_port_range = 2000 65000 net.ipv4.tcp_window_scaling = 1 # 设置协议栈可以缓存的报文数阀值,超过阀值的报文将被内核丢弃net.ipv4.tcp_max_syn_backlog = 3240000 # 调高 socket 侦听数阀值net.core.somaxconn = 3240000net.ipv4.tcp_max_tw_buckets = 1440000 # 调大 TCP 存储大小net.core.rmem_default = 8388608net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.ipv4.tcp_rmem = 4096 87380 16777216net.ipv4.tcp_wmem = 4096 65536 16777216net.ipv4.tcp_congestion_control = cubic# tcp重新回收net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_tw_reuse = 1
修改配置之后需要执行以下命令使之生效:
sysctl -p /etc/sysctl.conf
反向代理示例
反向代理配置示例:
location / { #设置主机头和客户端真实地址,以便服务器获取客户端真实IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #禁用缓存 proxy_buffering off; #设置反向代理的地址 proxy_pass http://192.168.1.1;}
代理地址根据实际情况修改。
注意:反向代理必须配置在
server
块里。
负载均衡示例
upstream site { server 192.168.3.82:8040; server 192.168.3.82:8041;} server { listen 8039; server_name 192.168.3.82; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; proxy_pass http://site; }}
访问192.168.3.82:8080的时候,会来回访问192.168.3.82:8040和192.168.3.82:8041。
注意:负载均衡必须配置在
http
块里。
负载均衡分配方式
Nginx的upstream支持5种分配方式,下面将会详细介绍,其中,前三种为Nginx原生支持的分配方式,后两种为第三方支持的分配方式:
1、轮询 轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器down掉后,能自动剔除。upstream backend { server 192.168.1.101:8888; server 192.168.1.102:8888; server 192.168.1.103:8888;}
2、weight
轮询的加强版,即可以指定轮询比率,weight和访问几率成正比,主要应用于后端服务器异质的场景下。upstream backend { server 192.168.1.101 weight=1; server 192.168.1.102 weight=2; server 192.168.1.103 weight=3;}
3、ip_hash
每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题。upstream backend { ip_hash; server 192.168.1.101:7777; server 192.168.1.102:8888; server 192.168.1.103:9999;}
4、fair
fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。upstream backend { server 192.168.1.101; server 192.168.1.102; server 192.168.1.103; fair;}
5、url_hash
与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。upstream backend { server 192.168.1.101; server 192.168.1.102; server 192.168.1.103; hash $request_uri; hash_method crc32;}
其中,hash_method为使用的hash算法,需要注意的是:此时,server语句中不能加weight等参数。
参考:
1、Nginx 服务器安装及配置文件详解 2、nginx配置location总结及rewrite规则写法 | Sean's Notes 3、Nginx 图片 js文件缓存配置方法-nginx-操作系统-壹聚教程网 4、nginx利用proxy_cache来缓存文件 5、Nginx负载均衡 - 小刚qq - 博客园 6、Nginx深入详解之upstream分配方式-scq2099yt-ChinaUnix博客