Nginx 配置文件解释及简单配置

时间:2023-03-08 16:25:00

Nginx配置文件大致分为以下几个块

1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。

5、location块:配置请求的路由,以及各种页面的处理情况。

配置文件详细表述

# 配置用户或者组,默认为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、全局变量介绍

  1. $args :变量中存放了URL中的指令,比如http://e.n.com/index.do?id=10&p=中的id=10&p=,而且可以有多个指令。
  2. $body_bytes_sent :记录发送给客户端文件主体内容大小。
  3. $content_length :请求报文头部中的content-lenght字段。
  4. $content_type :请求头部中的content-type字段。
  5. $document_root :针对当前资源的请求的系统根目录。
  6. $document_uri :当前请求中不包含指令的URI,主注意是不包含请求的指令,比如http://h.c.cn/index.do?id=11会被定义为/index.do。
  7. $host :存放了请求的服务器名称。
  8. $http_user_agent :客户端浏览器的详细信息。
  9. $http_cookie :客户端的cookie信息。
  10. $http_referer :用来记录从那个页面链接访问过来的。
  11. $limit_rate :如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0。
  12. $remote_addr :与$http_x_forwarded_for 用以记录客户端的ip地址,存放了客户端的地址,注意是客户端的公网IP,也就是一家人访问一个网站,则会显示为路由器的公网IP。
  13. $remote_port :客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口。
  14. $remote_user :已经经过Auth Basic Module验证的用户名。
  15. $request :用来记录请求的url与http协议。
  16. $request_body_file :做反向代理时发给后端服务器的本地资源的名称。
  17. $request_method :请求资源的方式,GET/PUT/DELETE等
  18. $request_filename :当前请求的资源文件的路径名称,由root或alias指令与URI请求生成。
  19. $request_uri :包含请求参数的原始URI,不包含主机名,如:”/index.do?id=1&p=”。
  20. $squery_string :URL请求的指令,与 $args相同。
  21. $scheme :请求的协议,如ftp,https,http等。
  22. $server_protocpl :客户端请求资源使用的协议的版本,如HTTP/1.0,HTTP/1,HTTP/2.0等。
  23. $server_addr :服务器的IP地址。
  24. $server_name :服务器的主机名。
  25. $server_port :服务器的端口号。
  26. $status :用来记录请求状态;成功是200
  27. $time_local :用来记录访问时间与时区。
  28. $uri :与$document_uri相同,是一个不包含指令的uri地址。如访问:h.c.cn/index.do?id=1&p=,uri为:/index.do

4、Nginx正则

  1. ~   区分大小写(大小写敏感)匹配成功
  2. ~*   不区分大小写匹配成功
  3. !~   区分大小写匹配失败
  4. !~*   不区分大小写匹配失败
  5. ^   以什么开头的匹配
  6. $   以什么结尾的匹配
  7. *   代表任意字符
  8. \  转义字符
  9. (值1|值2|值3|值4)  或匹配模式

5、文件及目录匹配

  1. -f和!-f用来判断是否存在文件
  2. -d和!-d用来判断是否存在目录
  3. -e和!-e用来判断是否存在文件或目录
  4. -x和!-x用来判断文件是否可执行