Nginx知多少系列之(三)配置文件详解
目录
1.前言
2.安装
3.配置文件详解
4.工作原理
5.Linux下托管.NET Core项目
6.Linux下.NET Core项目负载均衡
7.负载均衡策略详解
8.加权轮询(round robin)策略剖析
9.IP哈希(ip hash)策略剖析
10.最少连接(least_conn)策略剖析
11.随机(random)策略剖析
12.URL哈希(url hash)策略剖析
13.响应时间(fair)第三方模块详解
14.Linux下.NET Core项目Nginx+Keepalived高可用(主从模式)
15.Linux下.NET Core项目Nginx+Keepalived高可用(双主模式)
16.Linux下.NET Core项目LVS+Keepalived+Nginx高可用集群
17.构建静态服务器
18.日志分析
19.优化策略
20.总结
Nginx拥有大量官方发布的模块和第三方模块,这些已有的模块可以帮助我们实现Web服务器上很多的功能。使用这些模块时,仅仅需要增加、修改一些配置项即可。
1.目录结构介绍
Nginx运行目录为/usr/local/nginx,其目录结构如下:
|---client_body_temp |---conf ---fastcgi.conf ---fastcgi.conf.default ---fastcgi_params ---fastcgi_params.default ---koi-utf ---koi-win ---mime.types ---mime.types.default ---nginx.conf ---nginx.conf.default ---scgi_params ---scgi_params.default ---uwsgi_params ---uwsgi_params.default ---win-utf |---fastcgi_temp |---html ---50x.html ---index.html |---logs ---access.log ---error.log ---nginx.pid |---proxy_temp |---sbin ---nginx |---scgi_temp |---uwsgi_temp
①、client_body_temp:如果客户端POST一个比较大的文件,长度超过了nginx缓冲区的大小,需要把这个文件的部分或者全部内容暂存到client_body_temp目录下的临时文件。
②、conf:这是Nginx所有配置文件的目录,极其重要
fastcgi.conf:fastcgi相关参数的配置文件
fastcgi.conf.default:fastcgi.conf的原始备份
fastcgi_params:fastcgi的参数文件,nginx配置Fastcgi解析时会调用fastcgi_params配置文件来传递服务器变量,这样CGI中可以获取到这些变量的值。
fastcgi_params.default:fastcgi_params.conf的原始备份
mime.types:文件扩展名与文件类型映射表,nginx根据映射关系,设置http请求响应头的Content-Type值。当在映射表找不到时,使用nginx.conf中default-type指定的默认值。例如,默认配置中的指定的default-type为application/octet-stream。
mime.types.default:mime.types的原始备份
nginx.conf:这是Nginx默认的主配置文件
nginx.conf.default:nginx.conf的原始备份
koi-utf、koi-win、win-utf:这三个文件都是与编码转换映射文件,用于在输出内容到客户端时,将一种编码转换到另一种编码。
koi-win: charset_map koi8-r < -- > windows-1251
koi-utf: charset_map koi8-r < -- > utf-8
win-utf: charset_map windows-1251 < -- > utf-8
koi8-r是斯拉夫文字8位元编码,供俄语及保加利亚语使用。在Unicode未流行之前,KOI8-R 是最为广泛使用的俄语编码,使用率甚至起ISO/IEC 8859-5还高。这3个文件存在是因为作者是俄国人的原因。
scgi_params:scgi的参数文件
scgi_params.default:scgi_params.conf的原始备份
uwsgi_params:uwcgi的参数文件
uwsgi_params.default:uwsgi_params.conf的原始备份
③、fastcgi_temp:Fastcgi的临时数据目录
④、html:默认站点目录
50x.html:错误页面优雅替代显示文件,例如:出现502错误时会调用此页面
index.html:默认的首页文件,首页文件名字是在nginx.conf中事先定义好的。
⑤、logs:这是Nginx默认的日志路径,包括错误日志及访问日志
access.log:这是Nginx的默认访问日志文件,使用tail -f access.log,可以实时观看网站用户访问情况信息
error.log:这是Nginx的错误日志文件,如果Nginx出现启动故障等问题,一定要看看这个错误日志
nginx.pid:Nginx的pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
⑥、proxy_temp:反向代理缓存目录
⑦、sbin:这是Nginx命令的目录,如Nginx的启动命令nginx
nginx:Nginx的启动命令nginx
⑧、scgi_temp:scgi临时目录
⑨、uwsgi_temp:uwscgi临时目录
因为有的暂时还没有用到,所以下面我们重点介绍conf配置文件
2.Nginx.conf配置详解
Nginx的指令具体如何使用,我们可以看官方介绍:http://nginx.org/en/docs/dirindex.html
nginx.conf 配置文件分为三大块:
①、全局块:主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。下面的红色部分为全局块
②、Events块:events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。下面的绿色部分为Events块
③、Http块:Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。Http部分又包含:http全局部分、一个或以上server 部分。下面的蓝色部分为Http块
#user nobody; 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 { worker_connections 1024; } 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; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; 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; # } #} }
3.全局块(设置的指令将影响其他所有设置)
①、#user nobody;
nobody 是系统用户,是一个不能登陆的帐号,一个特殊用途的用户 ID ,一些服务进程如apache,aquid等都采用一些特殊的帐号来运行,比如nobody,news,games等等。一般来说 uid < 500 的都是系统 ID 。如不指定nginx默认用户是nobody. 这里用户的设置又有什么意义呢?主要是指定执行nginx的worker process的用户,linux里所有程序都是文件,都具有权限问题,这个指定的用户对特定的文件有没有权限访问或执行,就是这个用户的意义。
出现访问权限的时候,我们不能直接把user改为root,这样就可以把每个服务运行的情况隔离出来,保证不会因为服务器程序的问题而让服务器程序成了黑客的直接操作源。
指令格式:user user [group];
user:指定可以运行Nginx服务器的用户;group:可选项,可以运行Nginx服务器的用户组。
如果user指令不配置或者配置为user nobody nobody,默认由nobody账户运行。
②、worker_processes 1;
Nginx开启的进程数,worker_processes默认情况下为1,一般情况下不用修改,但考虑到实际情况,可以修改这个数值,以提高性能;也可以修改为worker_processes auto;自动的设置进程个数。
官方的建议是修改成CPU的内核数,这里引用一段翻译过的文章:
worker_processes指明了nginx要开启的进程数,
据官方说法,一般开一个就够了,多开几个,可以减少机器io带来的影响。
指令格式:worker_processes number | auto;
number : Nginx 进程最多可以产生的worker process 数。
auto : Nginx 进程将自动检测
③、#error_log logs/error.log;
error_log是关键字不能改变
logs/error.log是存放日志的目录,可以指定任意目录
在后面还可以添加日志级别,例如 error_log logs/error.log info;常见的错误日志级别有[debug | info | notice | warn | error | crit | alert | emerg],级别越高记录的信息越少。生产场景一般是 warn | error | crit 这三个级别之一,不要配置info等级较低的级别,会带来大量的磁盘I/O消耗。
指定格式:error_log file | stderr;
file : 日志输出到某个文件file
stderr : 日志输出到标准错误输出 (日志输出级别)
④、#pid logs/nginx.pid;
Nginx进程是作为系统守护进程在进行,需要在某个文件中保存当前运行程序的主进程号,Nginx支持该保存文件路径的定义。
指令格式:pid file;
file:指定存放路径和文件名称。
如果不指定,则默认置于路径 logs/nginx.pid
4.Events块(设定Nginx的工作模式及连接数上限)
①、worker_connections 1024;
用于定义Nginx每个进程的最大连接数,默认是1024。
指令格式:worker_connections number;
number : 工作进程可以打开的最大同时连接数
②、#use [ kqueue | epoll | /dev/poll | select | poll ];
指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll 。其中select 和poll 都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。
指令格式:use method;
method : 要使用的连接处理方式,例如kqueue、epoll、select、poll、/dev/poll,通常无需显式指定它,因为默认情况下nginx将使用最有效的方法
5.Http块 - 全局
①、定义MIMI-Type
include mime.types;
default_type application/octet-stream;
指令格式:include file;
该指令主要用于将其他的Nginx配置或第三方模块的配置引用到当前的主配文件中,减少主配置文件的复杂度。default_type application/octet-stream;
default_type
属于HTTP核心模块指令,这里设定默认类型为二进制流。也就是当文件类型未定义时使用这种方式,
②、自定义服务日志
#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;
用于指定Nginx日志的输出日志,后面章节有更详细的讲解
③、允许sendfile方式传输文件
sendfile on;
#tcp_nopush on;
开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
#sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
#tcp_nopush on;此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
④、连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接,单位是秒。
若将它设置为 0,就禁止了 keepalive 连接。
⑤、gzip压缩
#gzip on;
开启nginx gzip压缩后,网页、css、js等静态资源的大小会大大的减少,从而可以节约大量的带宽,提高传输效率,给用户快的体验。
6.Http块 - Server块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。后面会详细介绍虚拟主机的概念。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
关于Server这一块后面还有详细介绍,这里只是简单说明。
- 全局块
①、listen 80;
声明服务器监听的端口号
②、server_name localhost;
用来指定IP地址或者域名,多个域名之间用空格分开
③、#charset koi8-r;
用于设置网页的默认编码格式
④、#access_log logs/host.access.log main;
定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式,在前面已经定义了。
- Location块
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
①、location / {}
该指令用于匹配 URL。Location接受两个参数,一个字符串或者正则和一段代码。字符串或者正则用于匹配某个特定目录
②、proxy_pass
设置被代理服务器的地址。可以是主机名称、IP地址加端口号的形式。
③、index
设置网站的默认首页。