Nginx 配置文件解释及简单配置
Nginx配置文件大致分为以下几个块
1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。
配置文件详细表述
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 配置用户或者组,默认为nobody user administrator; # 允许生成的进程数,默认为1 worker_processes 233; # 制定日志路径,级别。 # 这个设置可以放入全局块,http块,server块 # 级别依次为:debug|info|notice|warn|error|crit|alert|emerg error_log logs/error.log notice; # 指定nginx进程运行文件存放地址 pid logs/nginx.pid; # 配置影响nginx服务器或与用户的网络连接。 events { # 设置网路连接序列化,防止惊群现象发生,默认为on accept_mutex on; # 设置一个进程是否同时接受多个网络连接,默认为off multi_accept on; # 事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport # epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。 use epoll; # 单个进程最大连接数,默认为512 worker_connections 1024; } # 可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。 # 如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。 http { # 文件扩展名与文件类型映射表 include mime.types; # 默认文件类型,默认为text/plain 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 off; # combined为日志格式的默认值 access_log logs/access.log main; # 开启高效文件传输模式,允许sendfile方式传输文件 # 默认为off,可以在http块,server块,location块。 # 对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用可设置为off # 以平衡磁盘与网络I/O处理速度,降低系统的负载。 # 注意:如果图片显示不正常把这个改成off。 sendfile on; # 开启目录列表访问,合适下载服务器,默认关闭。 autoindex on; # 防止网络阻塞 tcp_nopush on; # 防止网络阻塞 tcp_nodelay on; # 每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。 sendfile_max_chunk 100k; # 连接超时时间,默认为75s,可以在http,server,location块。 keepalive_timeout 65; # gzip模块设置 # 开启gzip压缩输出 gzip on; # 最小压缩文件大小 gzip_min_length 1k; # 压缩缓冲区 gzip_buffers 4 16k; # 压缩版本(默认1.1,前端如果是squid2.5请使用1.0) gzip_http_version 1.0; # 压缩等级 gzip_comp_level 2; # 压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。 gzip_types text/plain application/x-javascript text/css application/xml; # 和http头有关系,加个vary头,给代理服务器用的 # 有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩 # 所以根据客户端的HTTP头来判断,是否需要压缩 gzip_vary on; # 服务器名字的hash表大小 server_names_hash_bucket_size 128; # 上传文件大小限制 client_header_buffer_size 32k; # 设定请求缓 large_client_header_buffers 4 64k; #设定请求缓 client_max_body_size 8m; # 负载均衡,需要转发的目标服务器地址以及端口号 # weight:是权重,可以根据机器配置定义权重,权值越高被分配到的几率越大。 # down:当前server暂时不参与负载均衡 # backup:预留的备份服务器(当正在使用的后端服务异常时,启动预留服务) # max_fails:允许请求失败的次数 # fail_timeout:经过max_fails失败后,服务暂停的时间 # max_conns:限制最大的接受的连接数 # 注意:backup不能和ip_hash同时配置。因为ip_hash只能访问同一台服务器,而backup是在只有所有参与 负载均衡的服务器出现故障时,才会请求备份机。当所有负载均衡的服务器出现故障了,ip_hash的将无法 请求了。 upstream ServerList { # 每个请求按时间顺序逐一分配到不同的后端服务器。 # 轮询(默认) # 每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。 # ip_hash; # 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。后台服务器为缓存的时候效率。 # url_hash; # 这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块。 # fair server 127.0.0.1:7878 weight=2; server 127.0.0.5:7878 weight=3; server 192.168.10.121:3333 backup;# 热备 server 192.168.10.121:6767 down;# 不参与负载 } #导入外部服务器配置文件存放地址 include .\myconf\*.conf; # 每一个server相当于一个代理服务器 # server { # 监听端口,默认80 listen 8080; # 当前服务的域名,可以有多个,用空格分隔(我们是本地所以是localhost) server_name localhost; # 当没有指定主页时,默认会选择这个指定的文件,可多个,空格分隔 index index.html index.htm index.php; # 默认编码 #charset koi8-r; # 表示匹配的路径,这时配置了/表示所有请求都被匹配到这里 # 正则匹配,~为区分大小写,~*为不区分大小写。 location / { # 网页路径 root html; # 默认页 index index.html index.htm; # 请求转向自定义的服务器列表,负载均衡 proxy_pass http://ServerList; } # 匹配静态文件 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ { # 缓存过期时间 expires 30d; # 关闭日志记录 access_log off; } location ~ .*\.(js|css)?$ { expires 7d; access_log off; } # 防盗链 location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$ { valid_referers none blocked server_names *.test.com ; expires 7d; # 缓存过期时间 if ($invalid_referer) { return 403; } access_log off; # 关闭日志记录 } # 文件和目录不存在的时候重定向 if (!-e $request_filename) { proxy_pass http://127.0.0.1; } # 重定向,将多级目录下的文件转成一个文件,增强seo效果 # /qw-1-2-3.html 指向/qw/1/2/3.html rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last; # 访问控制——访问/admin/目录的请求,只允许某几个IP访问 location /admin/ { allow 127.0.0.1; deny all; } # 拒绝访问.htaccess文件(如果apache的文档根目录为 # 与nginx的一致 location ~ /\.ht { deny all;# “deny all”和“return 403”效果一样 } # 将404错误页重定向到静态页/404.html error_page 404 /404.html; # 将服务器错误页重定向到静态页/50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # 对 "/" 启用反向代理 location / { # #需要转发请求的服务器 # 负载均衡也是如此配置 proxy_pass http://127.0.0.1:88; # 是否跳转 proxy_redirect off; # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Real-IP $remote_addr; # 以下是一些反向代理的配置,可选。 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 请求要转发的host proxy_set_header Host $host; # 允许客户端请求的最大单文件字节数 client_max_body_size 10m; # 缓冲区代理缓冲用户端请求的最大字节数, client_body_buffer_size 128k; # nginx跟后端服务器连接超时时间(代理连接超时) proxy_connect_timeout 90; # 后端服务器数据回传时间(代理发送超时) proxy_send_timeout 90; # 连接成功后,后端服务器响应时间(代理接收超时) proxy_read_timeout 90; # 设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffer_size 4k; # 缓冲区,网页平均在32k以下的设置 proxy_buffers 4 32k; # 高负荷下缓冲大小(proxy_buffers*2) proxy_busy_buffers_size 64k; # 设定缓存文件夹大小,大于这个值,将从upstream服务器传 proxy_temp_file_write_size 64k; } # 设定查看Nginx状态的地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; # htpasswd文件的内容可以用apache提供的htpasswd工具来产生。 auth_basic_user_file conf/htpasswd; } } # HTTPS server,用于https认证 # server { # 443端口为ssl监听端口。 listen 443 ssl; server_name localhost; # on表示打开ssl支持。 ssl on; # 指定crt文件所在路径,如果写相对路径,必须把该文件和nginx.conf文件放到一个目录下。 ssl_certificate cert.pem; # 指定key文件所在路径。 ssl_certificate_key cert.key; # 指定SSL协议。 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 设置存储session参数的缓存的类型和大小。 # off | none | [builtin[:size]] [shared:name:size] ssl_session_cache shared:ssl:1m; # 指定客户端可以重用会话参数的时间(超时后不可使用)。 ssl_session_timeout 5m; # 配置ssl加密算法,多个算法用:分隔,ALL表示全部算法,!表示不启用该算法,+表示将该算法排到最后面去。 ssl_ciphers high:!anull:!md5; # 如果不指定默认为off,当为on时,在使用SSLv3和TLS协议时,服务器加密算法将优于客户端加密算法。 ssl_prefer_server_ciphers on; # 这里的ca.crt是根证书公钥文件 ssl_client_certificate ca.crt; location / { root html; index index.html index.htm; } } }
配置文件中需要注意的事项
1、每个指令必须有分号结束。
2、惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能。
3、全局变量介绍
- $args :变量中存放了URL中的指令,比如http://e.n.com/index.do?id=10&p=中的id=10&p=,而且可以有多个指令。
- $body_bytes_sent :记录发送给客户端文件主体内容大小。
- $content_length :请求报文头部中的content-lenght字段。
- $content_type :请求头部中的content-type字段。
- $document_root :针对当前资源的请求的系统根目录。
- $document_uri :当前请求中不包含指令的URI,主注意是不包含请求的指令,比如http://h.c.cn/index.do?id=11会被定义为/index.do。
- $host :存放了请求的服务器名称。
- $http_user_agent :客户端浏览器的详细信息。
- $http_cookie :客户端的cookie信息。
- $http_referer :用来记录从那个页面链接访问过来的。
- $limit_rate :如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0。
- $remote_addr :与$http_x_forwarded_for 用以记录客户端的ip地址,存放了客户端的地址,注意是客户端的公网IP,也就是一家人访问一个网站,则会显示为路由器的公网IP。
- $remote_port :客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口。
- $remote_user :已经经过Auth Basic Module验证的用户名。
- $request :用来记录请求的url与http协议。
- $request_body_file :做反向代理时发给后端服务器的本地资源的名称。
- $request_method :请求资源的方式,GET/PUT/DELETE等
- $request_filename :当前请求的资源文件的路径名称,由root或alias指令与URI请求生成。
- $request_uri :包含请求参数的原始URI,不包含主机名,如:”/index.do?id=1&p=”。
- $squery_string :URL请求的指令,与 $args相同。
- $scheme :请求的协议,如ftp,https,http等。
- $server_protocpl :客户端请求资源使用的协议的版本,如HTTP/1.0,HTTP/1,HTTP/2.0等。
- $server_addr :服务器的IP地址。
- $server_name :服务器的主机名。
- $server_port :服务器的端口号。
- $status :用来记录请求状态;成功是200
- $time_local :用来记录访问时间与时区。
- $uri :与$document_uri相同,是一个不包含指令的uri地址。如访问:h.c.cn/index.do?id=1&p=,uri为:/index.do
4、Nginx正则
- ~ 区分大小写(大小写敏感)匹配成功
- ~* 不区分大小写匹配成功
- !~ 区分大小写匹配失败
- !~* 不区分大小写匹配失败
- ^ 以什么开头的匹配
- $ 以什么结尾的匹配
- * 代表任意字符
- \ 转义字符
- (值1|值2|值3|值4) 或匹配模式
5、文件及目录匹配
- -f和!-f用来判断是否存在文件
- -d和!-d用来判断是否存在目录
- -e和!-e用来判断是否存在文件或目录
- -x和!-x用来判断文件是否可执行
有错误的请多多指教,共同进步(๑•ᴗ•๑)
By听雨的人
By听雨的人