Nginx.conf配置
基本配置说明
#定义Nginx运行的用户和用户组
user www-data www-data;
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 2;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;
#进程文件
pid /var/run/nginx.pid;
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
#工作模式与连接数上限
events
{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}
http块配置
http{
include mime.types #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
charset utf-8 #默认文件类型
server_names_hash_bucket_size 128; #服务器名字的hash表大小
client_header_buffer_size 32k; #上传文件大小限制
large_client_header_buffers 4 64k; #设定请求缓冲区大小
client_max_body_size 8m; #设定请求缓冲区大小
sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
autoindex on; #目录列表是否开启访问,默认关闭
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 120; #长链接超时时间,单位s
#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;
#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议)
gzip_comp_level 2; #推荐6压缩级别(级别越高,压的越小,越浪费CPU计算资源)
gzip_types text/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_vary on; # 是否传输gzip压缩标志
#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用
#负载均衡设置
upstream test.com{
#weight表示权重,权值越高被分配到的几率越大
server 192.168.1.1:80 weight=3;
server 192.168.1.2:80 weight=3;
server 192.168.1.3:80 weight=2;
}
#虚拟主机设置
server{
#监听端口
listen 80;
#域名可以有多个,用空格隔开
server_name www.test.com blog.test.com;
index index.html index.php;
root /var/www;
location /{
...
}
#日志格式设定
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/test.log access;
#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
#htpasswd文件的内容可以用apache提供的htpasswd工具来产生
}
}
}
location详解
类型
- 普通location
- 无任何前缀
- 其他前缀(=、^~、@)
- 普通location顺序无关
- 正则location
- (~、 ~*)表示正则前缀
- ~区分大小写
- ~*不区分大小写
- 正则location与顺序有关
先匹配普通,再匹配正则;正则会覆盖普通
执行顺序:
普通location
最大前缀匹配;
前面若指定了^~,则普通location一旦匹配上,就不需要继续正则匹配
制订了=严格匹配也不要继续正则匹配
正则location
顺序匹配,且只要匹配到第一个就停止后面的匹配
实例
location =/{
#严格匹配,主机名后面不能带任何字符串
#[ configuration A ]
}
location /{
#匹配所有请求
#但是由于最大前缀原则,最长字符串和正则会优先匹配
##[ configuration B ]
}
location /documents/ {
#匹配任何以/documents/开头的地址,匹配后会继续往下搜索
#后面正则没有匹配才采用这一条
#[ configuration C ]
}
location ~ /documents/Abc {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
#[ configuration CC ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
##[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif,jpg或jpeg 结尾的请求
# 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
[ configuration E ]
}
location /images/ {
# 字符匹配到 /images/,继续往下,会发现 ^~ 存在
[ configuration F ]
}
location /images/abc {
# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
# F与G的放置顺序是没有关系的
[ configuration G ]
}
location ~ /images/abc/ {
# 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
[ configuration H ]
}
执行顺序
- 以=开头表示精确匹配
- ^~开头表示以常规字符串开头,不是正则匹配
- ~区分大小写正则匹配
- ~*不区分大小写正则匹配
- /通用匹配,没有其他匹配,任何请求都会匹配到
rewrite功能
#语法
rewrite [regex] [replacement] [flag]
rewrite 规则
- rewrite只能出现在server{}、location{}、if{}中,只对域名后除去传递的参数有作用;
- 执行顺序:
如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。- server块的rewrite指令;
- 执行location匹配;
- 执行location中的rewrite指令;
flag标志位
- last:相当于Apache的[L]标记,表示完成rewrite
- break:停止执行当前虚拟主机的后续rewrite指令集
- redirect:返回302临时重定向,地址栏会显示跳转后的地址
- permanent:返回301永久重定向,地址栏会显示跳转后的地址
tips:
- last一般写在server和if中,而break一般使用在location中
- last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
- break和last都能组织继续执行后面的rewrite指令
if指定与全局变量
#语法
#1.当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
#2.直接比较变量和内容时,使用=或!=
#3.~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的不匹配
if(condition){
}
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
可用于if判断的全局变量:
- KaTeX parse error: Expected 'EOF', got '#' at position 8: args : #̲这个变量等于请求行中的参数,同query_string
- $content_length : 请求头中的Content-length字段。
- $content_type : 请求头中的Content-Type字段。
- $document_root : 当前请求在root指令中指定的值。
- $host : 请求主机头字段,否则为服务器名称。
- $http_user_agent : 客户端agent信息
- $http_cookie : 客户端cookie信息
- $limit_rate : 这个变量可以限制连接速率。
- $request_method : 客户端请求的动作,通常为GET或POST。
- $remote_addr : 客户端的IP地址。
- $remote_port : 客户端的端口。
- $remote_user : 已经经过Auth Basic Module验证的用户名。
- $request_filename:当前请求的文件路径,由root或alias指令与URI请求生成。
- $scheme : HTTP方法(如http,https)。
- $server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
- $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
- $server_name : 服务器名称。
- $server_port : 请求到达服务器的端口号。
- $request_uri :包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
- u r i : 不 带 请 求 参 数 的 当 前 U R I , uri : 不带请求参数的当前URI, uri:不带请求参数的当前URI,uri不包含主机名,如”/foo/bar.html”。
- d o c u m e n t u r i : 与 document_uri : 与 documenturi:与uri相同。
常用正则
rewrite实例
http {
# 定义image日志格式
log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
# 开启重写日志
rewrite_log on;
server {
root /var/www;
location / {
# 重写规则信息
error_log logs/rewrite.log notice;
# 注意这里要用‘’单引号引起来,避免{}
rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;
# 注意不能在上面这条规则后面加上“last”参数,否则下面的set指令不会执行
set $image_file $3;
set $image_type $4;
}
location /data {
# 指定针对图片的日志格式,来分析图片类型和大小
access_log logs/images.log mian;
root /data/images;
# 应用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,如果还不在就跳转到最后一个url里
try_files /$arg_file /image404.html;
}
location = /image404.html {
# 图片不存在返回特定的信息
return 404 "image not found\n";
}
}
对形如/images/ef/uh7b3/test.png的请求,重写到/data?file=test.png,于是匹配到location /data,先看/data/images/test.png文件存不存在,如果存在则正常响应,如果不存在则重写try_files到新的image404 location,直接返回404状态码。