Nginx配置文件详解
Nginx配置文件详解
1、主配置文件大致结构:
Nginx配置文件(/usr/local/nginx/conf/nginx.conf)
[root@nginx-4 nginx]# vim /usr/local/nginx/conf/nginx.conf ## 主要结构如下图
配置 文件主要由四部分组成:
main(全区设置),HTTP(设置负载均衡服务器组),
server(虚拟主机配置),和location(URL匹配特定位置设置)。
访问一个web 页面,发起N个HTTP请求
产生一次TCP连接 ,完成多个 HTTP 请求
2、简易示例 :
user nginx nginx; worker_processes 1; events { worker_connections 1024; use epoll; } http{ include mime.types; charset utf-8; keepalive_timeout 65; server { ServerName N1 location{ } location{ } } server { ServerName N2 location{ } location{ } } server { ServerName N3 location{ } location{ } } }
3、主配置文件解析:
1)全局变量 部分:
#user nobody nobody; #Nginx的worker进程运行用户以及用户组 worker_processes 1; #Nginx开启的进程数,建议设置为等于CPU总核心数。 #worker_processes auto; ## 多核心CPU设置。 ## [root@server-21 ~]# cat /proc/cpuinfo 查看当前CPU 的信息。 #worker_processes 4 # 4核CPU #worker_cpu_affinity 0001 0010 0100 1000; #亲核 ##CPU亲核,设置工作进程与 CPU 绑定。 #指定了哪个cpu分配给哪个进程,一般来说不用特殊指定。如果一定要设的话,用0和1指定分配方式. #这样设就是给1-4个进程分配单独的核来运行,出现第5个进程是就是随机分配了。 #error_log logs/error.log info; #定义全局错误日志定义类型,[debug|info|notice|warn|crit] #pid logs/nginx.pid; #指定进程ID存储文件位置 worker_rlimit_nofile 65535; #一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除, 但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。 ulimit -a 查看所有 ulimit -n 查看 最大文件数量 ulimit -u 查看最大进程数量 每个用户打开的 文件数量 nofile 打开的进程数量 nprco #vim /etc/security/limits.conf * soft nproc 65535 * hard nproc 65535 * soft nofile 65535 * hard nofile 65535
注意:设置了这个后,修改worker_connections值时,是不能超过worker_rlimit_nofile的这个值。
修改后,不需要重启, 退出当前会话,重新 登录即可读取新的配置值
2)事件驱动模型配置 部分:
events { use epoll; #use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; ## epoll模型是 Linux 2.6以上版本内核中的高性能网络I/O模型, 如果跑在 FreeBSD 上面,就用kqueue模型。 worker_connections 65535; #每个进程可以处理的最大连接数,理论上每台nginx服务器的最大连接数为 worker_processes X worker_connections。 理论值:worker_rlimit_nofile / worker_processes #注意:最大客户数也由系统的可用socket连接数限制(~ 64K),所以设置不切实际的高没什么好处 }
很多人会误解 worker_connections 这个参数的意思,认为这个值就是nginx所能建立连接的最大值。
其实不然,这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个nginx能建立的最大连接数,应该是worker_connections X worker_processes。
当然,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes
而如果是HTTP作为反向代理来说,最大并发数量应该是 worker_connections X worker_processes /2。
因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
3)设定 http 的部分:
http { include /etc/nginx/mime.types; #文件扩展名与文件类型映射表,设定mime类型,类型由mime.type文件定义 default_type application/octet-stream; #默认文件类型 #charset utf-8; #服务器 默认编码 #include /etc/nginx/proxy.conf; #反向代理配置,可以打开proxy.conf看看 #include /etc/nginx/fastcgi.conf; #fastcgi配置,可以打开fastcgi.conf看看 #生成日志的格式定义 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #定义日志的格式。后面定义要输出的内容。 #1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址; #2.$remote_user 用来记录客户端用户名称; #3.$time_local 用来记录访问时间与时区; #4.$request 用来记录请求的url与http协议; #5.$status 用来记录请求状态; #6.$body_bytes_sent 记录发送给客户端文件主体内容大小; #7.$http_referer 用来记录从那个页面链接访问过来的; #8.$http_user_agent 记录客户端浏览器的相关信息 #访问日志 access_log /var/log/nginx/access.log main; sendfile on; # sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用, # 必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime. # sendfile: 设置为on表示启动高效传输文件的模式。 #sendfile可以让Nginx在传输文件时直接在磁盘和tcp socket之间传输数据。 #如果这个参数不开启,会先在用户空间(Nginx进程空间)申请一个buffer,用read函数把数据从磁盘读到内核cache, #再从内核 cache读取到用户空间nginx 的buffer,再用write函数把数据从用户空间的buffer写入到内核的buffer,最后到tcp socket。 #开启这个参数后可以让数据不用经过用户buffer。 #可加速web服务器在传输文件方面的效率。 #autoindex on; #开启目录列表访问(网站以树目录展示),合适下载服务器,默认关闭。 #tcp_nopush on; #tcp_nopush:在linux的实现里,其实就是tcp_cork 。 #tcp_nodelay 最多不过是在等等,看能不能再搞点数据,如果实在是没数据了,小包它也发(200ms)。 #而这个tcp_cork直接就禁止了小包的发送。 #也就是说,如果你开着这个选项,你的nginx发送的包都是满的。 #包都是满的,那ACK就少,网络利用率就起来了 #默认 :off keepalive_timeout 65; #连接超时时间,单位是秒 tcp_nodelay on; #启动TCP_NODELAY,就意味着禁用了 Nagle 算法,允许小包的发送。可降低延迟,但是会增加网络的负担 #关闭TCP_NODELAY,则是应用了 Nagle 算法。 数据只有在写缓存中累积到一定量之后, #才会被发送出去,这样明显提高了 网络利用率(实际传输数据payload与协议头的比例大大提高)。 #但是这由不可避免地增加了延时。 #默认: on #server_names_hash_bucket_size 128; #服务器名字的hash表大小 #client_header_buffer_size 32k; #客户端请求头部的缓冲区大小,一般一个请求的头部大小不会超过1k #large_client_header_buffers 4 64k; #header过大,它会使用large_client_header_buffers来读取 #client_max_body_size 8m; #接收 客户端 主体 的最大体积,可以限制用户上传单个文件的大小。 #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;
4)gzip模块设置 :
#gzip on; #开启gzip压缩输出 #gzip_min_length 1k; #最小压缩文件大小 #gzip_buffers 4 16k; #压缩缓冲区 #gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0) #gzip_comp_level 2; #压缩等级 #gzip_types text/plain application/x-javascript text/css application/xml; #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。 #gzip_vary on; #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用 include /etc/nginx/conf.d/*.conf; #附加配置文件 #include /etc/nginx/sites-enabled/*;
5)设定负载均衡的服务器列表 :(nginx 作为web 代理角色 )--------------------------------------------
#upstream tomcat1 { # #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。 # server 127.0.0.1:8080 weight=1; # server 192.168.1.116:8081 weight=1; #} #设定负载均衡的服务器列表,可以配置多个负载均衡的服务器列表 #upstream tomcat2 { # #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。 # server 127.0.0.1:8080 weight=1; # server 192.168.1.11:8081 weight=1; #}
6)虚拟主机的配置 :--------------------------------------------
server { listen 80; #监听端口 server_name 192.168.1.11; #域名可以有多个,用空格隔开, 多个虚拟主机主要依靠这一选项来区分,重要! index index.html index.htm index.jsp; #定义索引首页 root /home/public; #定义站点根目录 error_page 400 402 403 404 405 406 410 411 413 416 500 501 502 503 504 /error.html; #定义错误页面 error_page 505 /error.html; #log_format access '$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 access; #定义本虚拟主机的访问日志 ############## 使用 location 标签对 URI 进行 控制 ##################### location / { expires 2m; add_header Cache-Control “public, must-revalidate, proxy-revalidate”; #添加自定义首部 add_header Cache-Control “public, must-revalidate, proxy-revalidate”; } location ~ /rest/(api|images|files)/ { #所有的rest请求都是以api开头的 proxy_pass http://localhost:8080; proxy_next_upstream error timeout; proxy_connect_timeout 8s; proxy_intercept_errors on; proxy_set_header X-Forwarded-Host httphost; proxysetheaderX−Forwarded−Serverhost; proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for; proxy_set_header X-Real-IPremote_addr; proxy_set_header Host $http_host; } #location / { #默认请求 #对 “/” 启用反向代理 #proxy_pass localhost; #proxy_redirect off; #proxy_set_header X-Real-IP $remote_addr; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP #proxy_set_header Host $host; #以下是一些反向代理的配置,可选。 #client_max_body_size 10m; #允许客户端请求的最大单文件字节数 #client_body_buffer_size 128; #缓冲区代理缓冲用户端请求的最大字节数 #proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时) #proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) #proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时) #proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 #proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置 #proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) #proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 #} #location ~ ^/(images|javascript|js|css|flash|media|static)/ { #以下为设置静态资源,nginx自己处理 # root /home; # expires 30d; #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。 #} #location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { #图片缓存时间设置 # expires 30d; #} #location ~ .*.(js|css)?$ { #JS和CSS缓存时间设置 # expires 30h; #} #location ~ .(jsp|jspx|do)?$ { #所有jsp的页面均交由tomcat或resin处理 # 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_pass http://127.0.0.1:8080; #} #location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { #所有静态文件由nginx直接读取不经过tomcat或rest # expires 15d; #} #location ~ .*.(js|css)?$ { # expires 1h; #} #location /NginxStatus { #设定查看Nginx状态的地址 #stub_status on; #access_log on; #auth_basic "NginxStatus"; #auth_basic_user_file conf/htpasswd; #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。 #} } }