Nginx常用配置和使用详解梳理
Posted wu6660563
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx常用配置和使用详解梳理相关的知识,希望对你有一定的参考价值。
文章目录
用了nginx这么久,也没时间去梳理一下配置和使用,此文重点是整理一下安装和使用方面的一些小技巧
安装篇
- 安装要支持rewrite模块,Linux就必须安装
pcre
,yum install pcre*
- 如果要支持ssl,Linux就必须安装ssl,
yum install openssl*
执行安装
# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_spdy_module --with-http_stub_status_module --with-pcre
当然你也可以直接全部默认的#./configure
下面详细介绍一下配置:
- 通用配置
配置 | 描述 |
---|---|
--prefix=<path> | 指定Nginx的安装路径,所有其他的路径都要依赖于该选项 |
--sbin-path=<path> | 指定Nginx二进制文件的路径。如果没有指定,那么这个路径将依赖于–prefix选项 |
--conf-path=<path> | 指定Nginx的配置文件的路径,如果在命令行没有指定配置文件,那么将会通过这里指定路径。 |
--error-log-path=<path> | 指定错误日志文件路径,Nginx将会往里面写入错误日志文件,除非有其它的配置。 |
--pid-path=<path> | 指定的Nginx master进程的PID文件位置,通常在/var/run下 |
--lock-path=<path> | 共享存储器互斥锁文件的路径 |
--user=<user> | worker进程运行的用户 |
--group=<group> | worker进程运行的组 |
--with-file-aio | 为FreeBSD4.3 +和linux 2.6.22 +系统启用异步I/O |
--with-debug | 这个选项用于启用调试日志,在生产环境的系统中不推荐使用 |
--with-pcre | 为了支持rewrite重写功能,默认是开启的 |
--builddir=<path> | 指向编译目录 |
--with-rtsig_module | 启用rtsig模块支持 |
--with-select_module | 启用select模块,一种轮询模式,不推荐在高并发下面使用,禁用 --without-select_module |
--with-ipv6 | 启用ipv6支持 |
- 邮件代理配置
配置 | 描述 |
---|---|
--with-mail | 该选项用于启用Mail模块,该模块默认没有被激活 |
--with-mail_ssl_module | 为了代理任何一种类型的使用SSL/TLS的Mail |
--without-mail_pop3_module | 在启用Mail模块后,单独地禁用pop3模块 |
--without-mail_imap_module | 再启用mail模块后,单独地禁用IMAP模块 |
--without-mail_smtp_module | 在启用mail模块后,单独地禁用smtp模块 |
--without--http | 该选项将完全禁用http模块 |
- 指定路径的配置
配置 | 描述 |
---|---|
--without-http_perl_module | Nginx配置能够使用扩展使用Perl代码,这个选项启用这个模块(此模块会降低性能) |
--without-perl_module_path=<path> | 对于额外嵌入的Perl模块,使用该选项指定该Perl解析器的路径 |
--without—perl=<path> | 如果在默认路径中没有找到Perl,那么指定Perl的路径 |
--http-log-path=<path> | Http访问日志的默认路径 |
--http-client-body-temp-path=<path> | 从客户端收到请求后,该选项设置的目录用于作为请求体临时存放的目录。 |
--http-proxy-temp-path=<path> | 在使用代理后,通过该选项设置存放临时文件路径 |
--http-fastcgi-temp-path=<path> | 设置FastCGI临时文件的目录 |
--http-uwsgi-temp-path=<path> | 设置uWSGI临时文件的目录 |
--http-scgi-temp-path=<path> | 设置SCGI临时文件的目录 |
- 各种模块配置选项
配置 | 描述 |
---|---|
--with-http_ssl_module | 如果需要对流量进行加密,可以使用该选项,在URLs中开始部分将会是https(需要OpenSSL库) |
--with-http_realip_module | 将http头中的客户端IP地址传递,那么你将会需要启用这个模块。在多个客户处于一个IP地址的情况下使用 |
--with-http_addition_module | 输出过滤器,使你能够在请求经过一个location前或者后时在该location本身添加内容 |
--with-http_xslt_module | 处理XML响应转换,基于一个或者多个XSLT格式(需要libxml2和libxslt库) |
--with-http_image_filter_module | 图像过滤器使用,在将图形投递到客户之前进行处理(需要libgd库) |
--with-http_geoip_module | 设置各种变量以便在配置文件中区段使用,基于地理位置查找客户端IP地址(需要MaxMfind GeoIP库和相应的预编译数据库文件) |
--with-http_sub_module | 实现了替代过滤,在响应中用一个字符串替代另一个字符串 |
--with-http_dav_module | 这个模块将激活使用WebDAV的配置指令。 |
--with-http_flv_module | 如果需要提供Flash流媒体视频文件,那么该模块将会提供伪流媒体 |
--with-http_mp4_module | 这个模块支持H.264/AAC文件伪流媒体 |
--with-http_gzip_module | 调用的资源没有.gz结尾格式的文件时,如果想支持发送预压缩版本的静态文件,那么使用该模块 |
--with-http_gunzio_module | 对应不支持gzip编码的客户,该模块用于为客户解压缩预压缩内容 |
--with-http_random_index_module | 想提供从一个目录中随机选择文件的索引文件,那么这个模块需要被激活 |
--with-http_secure_link_module | 该模块提供了一个机制,它会将一个哈希值链接到一个URL中 |
--with-http_stub_status_module | 启用这个模块后会收集Nginx自身的状态信息。输出的状态信息可以使用RRDtool或类似的东西来绘制成图 |
--without-http_upstream_ip_hash_module | 禁用ip_hash的负载均衡策略 |
--with-md5 | 指向MD5库目录 |
配置详解
... #全局块
events #events块
...
http #http块
... #http全局块
server #server块
... #server全局块
location [PATTERN] #location块
...
location [PATTERN]
...
server
...
... #http全局块
- 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- server块:配置虚拟主机的相关参数,一个http中可以有多个server。
- location块:配置请求的路由,以及各种页面的处理情况。
配置虚拟主机vhost
server
: 配置虚拟主机必须有这个段
server_name
: 虚拟主机的域名,可以多个域名,类似于别名,比如你可以配置成server_name b.ttlsa.com
等
root /data/site/www.xxx.com
: 站点根目录,你网站文件存放的位置。
location /
:默认的uri
location配置
location太重要了,所以单独拿出来整理,因为大多数实际应用的场景中,其实80%的工作就配置这个location就好了
语法规则:location [=|~|~*|^~] /uri/ ...
= 等于符号,表示精确匹配,这个是优先级最高的
^~ 表示uri以某个常规字符串开头,理解为匹配url路径即可。nginx不对url编码,因此请求为/static/20%/aa,可以被规则 ^~ /static/ /aa匹配到(注意中间是空格)
~ 表示区分大小写的正则匹配
~* 表示不区分大小写的正则匹配(和上面唯一的区别就是不区分大小写)
!~ 和 !~* 分别为区分大小写不匹配和不区分大小写不匹配(加了个!表示非)
/ 通用匹配,任何请求都会匹配到,默认匹配
下面讲解规则优先级
优先级 =>^~>
首先匹配=,其次匹配^~,其次是按文件中的顺序匹配,最后是交给 / 通用匹配。当有匹配成功的时候,停止匹配,按当前匹配规则处理请求
location /
echo "/"; # 需要安装echo模块
location = /
echo "=/";
location = /nginx
echo "=/nginx";
location ~\\.(gif|jpg|png|js|css)$
echo "small-gif/jpg/png/js/css";
location ~* \\.png$
echo "all-png";
location ^~ /static/
echo "static";
访问:http://xxx.com/ 匹配/
#curl http://xxx.com/
=/
访问http://xxx.com/nginx,匹配了 =/nginx
#curl http://xxx.com/nginx
=/nginx
访问http://xxx.com/xxx/111.PNG,从第一个开始匹配,因为是大写的,所以匹配到了 ~* \\.png$
#curl http://xxx.com/xxx/111.PNG
all-png
访问htp://xxx.com/static/111.png,这里会先匹配static,因为前面有^
#curl http://xxx.com/static/1111.png
static
root & alias
nginx指定文件路径有两种方式root和alias,这两种的区别如下
location ^~ /t/
root /www/root/html/;
如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/t/a.html的文件。
#-----------------------------------------分割线------------------------------------------
location ^~ /t/
alias /www/root/html/new_t/;
如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/new_t/a.html的文件。注意这里是new_t,因为alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。
注意:
- 使用alias时,目录名后面一定要加"/"。
- alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
- alias只能位于location块中。(root可以不放在location中)
nginx内置变量
nginx在处理请求的时候,会有大量的变量,这些变量可以通过访问日志来记录下来,也可以直接拿来nginx配置中使用
参数名称 | 描述 |
---|---|
$arg_PARAMETER | HTTP请求中某个参数的值,比如/index.php?site=www.xxx.com,可以用$arg_site取到www.xxx.com这个值 |
$args | 请求的完整参数。比如请求/index.php?width=400&height=200,那么$args表示字符串width=400&height=200 |
$binary_remote_addr | 二进制格式的客户端地址。 |
$body_bytes_sent | 表示在向客户端发送的http响应中,body部分的字节数 |
$content_length | 表示客户端请求头部的Content-Length字段 |
$content_type | 表示客户端请求头部Content-Type字段 |
$cookie_COOKIE | 表示在客户端请求头部中的cookie字段 |
$document_root | 表示当前请求所使用的root配置项的值 |
$uri | 表示当前请求的URI,不带任何参数 |
$document_uri | 与$ui含义相同 |
$request_uri | 表示客户端发来的原始请求URI,带完整的参数,$uri和$document_uri未必是用户的原始请求,在内部重定向以后可能是重定向的URI,而$request_uri永远不会改变,始终是客户端的URI |
$host | 表示客户端请求的Host字段,host值是小写的 |
$hostname | 表示Nginx所在机器的名称,与gethostbyname调用返回值相同 |
$http_HEADER | 表示当前HTTP响应头部的值,HEADER全称全小写 |
$sent_http_HEADER | 表示返回客户端的HTTP相应中相应头部的值,HEADER名称全小写 |
$is_args | 表示请求中的URI是否带参数,如果带参数,$is_args值为?,如果不带参数,则是空字符串 |
$limit_rate | 表示当前连接的限速是多少,0表示无限速 |
$nginx_version | 表示当前nginx的版本号 |
$query_string | 请求URI中的参数,与$args相同,而$query_string是只读不能改变 |
$remote_addr | 表示客户端的地址 |
$remote_port | 表示客户端连接使用的端口 |
$remote_user | 表示使用Auth Basic Module时定义的用户名 |
$request_filename | 表示用户请求中的URI经过root或者alias转换后的文件路径 |
$request_body | 表示HTTP请求中的body,该参数只在proxy_pass或者fastcgi_pass中有意义 |
$request_body_file | 表示HTTP请求中的body存储的临时文件名 |
$request_completion | 当请求全部完成时,值为OK。若没有完成,就要返回客户端,则其值为空字符串;或者在断点续传等情况下使用HTTP range访问的并不是文件的最后一块,那么值也是空字符串 |
$request_method | 表示HTTP请求的方法名,如GET/PUT/POST等 |
$scheme | 表示HTTP scheme,如https://nginx.com/表示https |
$server_addr | 表示服务器地址 |
$server_name | 表示服务器名称 |
$server_port | 表示服务器端口 |
$server_protocal | 表示服务器向客户端发送响应的协议,如HTTP/1.1或HTTP/1.0 |
实例详解
#运行用户;
user root;
#启动进程,通常设置成和cpu的数量相等
worker_processes 8;
#cpu
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#全局错误日志及PID文件
error_log logs/error.log;
pid logs/nginx.pid;
worker_rlimit_nofile 102400;
#工作模式及连接数上限
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
#是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
events
use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
worker_connections 51200;#单个后台worker process进程的最大并发链接数
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http
include mime.types; #设定mime类型,类型由mime.type文件定义
default_type application/octet-stream;
include proxy.conf; // 引入代理文件配置
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $upstream_cache_status $request_time';
#设定日志格式
access_log logs/access.log main;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
#必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;
#连接超时时间
keepalive_timeout 45;#长连接超时时间,单位是秒
tcp_nodelay on; #防止网络阻塞
#开启gzip压缩
gzip on;
gzip_min_length 1k;#最小压缩文件大小
gzip_buffers 4 8k;#压缩缓冲区
gzip_http_version 1.1;#压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
#压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_disable "MSIE [1-6]\\.";
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_temp_path /data/nginx_temp_cache;
proxy_cache_path /data/nginx_cache/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
#/data/nginx_temp_cache,/data/nginx_cache/cache必须在同一个区
#设定负载均衡的服务器列表
upstream tomcat_server
server 10.3.0.20:8080;
#嵌入另外一个nginx.conf文件,里面全部放的是server配置文件,nginx在启动的时候会把所有的conf文件解析成一个conf里面
include nginx_7g.conf;
#虚拟服务器proxy_pass http://www.baidu.com;
#Nginx 的虚拟主机是通过HTTP请求中的Host值来找到对应的虚拟主机配置,如果找不到呢?那 Nginx 就会将请求送到指定了default_server 的 节点来处理,如果没有指定为 default_server 的话,就跑到 localhost 的节点,如果没有 localhost 的节点,那只好 404 了。
server
listen 80 default;
server_name 10.3.0.20; // 如果是只有一个虚拟服务器,这个server_name就不会匹配,如果有多个虚拟服务器,那么就会校验server_name
charset utf-8;
location ~ .*\\.(apk)(.*)
proxy_pass http://staticfiles_server;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache cache_one; #proxy_cache设置的就是proxy_cache_path中keys_zone的值
proxy_cache_key $host$uri; #增加设置web缓存的key值,nginx根据key值md5哈希存储缓存
proxy_cache_valid 200 304 30d; #proxy_cache_valid设置的是缓存过期时间,比如这里168小时过期
proxy_cache_valid 404 1m;
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m;
expires 1d;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
#对 "/" 启用反向代理
location /
proxy_pass http://tomcat_server ;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
index index.html index.htm index.jsp;
location /roam
proxy_pass http://tomcat_server ;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
index index.html index.htm index.jsp;
// 代理对应的接口
location /roam
proxy_pass http://tomcat_server ;
root /localhost; #配置的根目录
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
index index.html index.htm index.jsp;
// 代理对应的项目下面接口
location /roamServer/roams
proxy_pass http://tomcat_server ;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
index index.html index.htm index.jsp;
location ~ /purge(/.*) #用于清除缓存
allow 127.0.0.1;
allow 192.168.21.0/24; #设置只允许指定的IP或IP段才可以清除URL缓存。
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
所有的代理设定都会在这里
proxy.conf配置文件
#!nginx (-)
# proxy.conf
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 50m;
client_body_buffer_size 128k;
#proxy_connect_timeout 90;
#proxy_send_timeout 90;
#proxy_read_timeout 90;
#proxy_buffer_size 4k;
#proxy_buffers 4 32k;
#proxy_busy_buffers_size 64k;
#proxy_temp_file_write_size 64k;
日志格式
语法:log_format name string ...;
日志格式允许包含的变量注释如下:
$remote_addr,$http_x_forwarded_for 记录客户端IP地址
$remote_user 记录客户端用户名称
$request 记录请求的URL和HTTP协议
$status 记录请求状态
$body_bytes_sent 记录发送给客户端的字节数,不包含响应头的大小;该变量与Apache模块的mod_log_config里面的%B兼容
$bytes_sent 发送到客户端的总字节数
$connection 连接的序列号
$connection_requests 当前通过一个连接获得的请求数量
$msec 日志写入时间。单位为秒,精度为毫秒
$pipe 如果请求时通过HTTP流水线(pipelined)发送,pipe值为p,否则为点
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度
$request_time 请求的处理时间,单位是秒,精度毫秒
$time_iso8601 ISO8601标准格式下的本地时间
$time_local 通用日志格式下的本地时间
logrotate日志切割
nginx默认情况下将日志写入到access.log和error.log两个日志文件,如果系统访问很大,日志将会越来越多,日常需要做的就是将日志切割
#nginx日志切割实例
$vim /etc/logrotate.conf #创建nginx日志切割配置文件
/usr/local/nginx/logs/*.log
daily
rotate 10
create
dateext
$logrotate -d /etc/logrotate.d/nginx 调试测试 -d debug
$logrotate -d /etc/logrotate.d/nginx 手动切割日志测试
$ls /application/nginx/logs/ 带日期的表示是切割好的日志
access.log bbs.log-20180228 error.log www.log
access.log-20180228 blog.log error.log-20180228 www.log-20180228
bbs.log blog.log-20180228 nginx.pid
设置计划任务
$crontab -e
50 23 * * * /usr/sbin/logrotate -f /etc/logrotate.conf > /dev/null 2>&1
rewrite模块
Nginx的rewrite功能在企业里应用非常广泛:
- 可以调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。
- 为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
- 网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的360buy.com会跳转到jd.com
- 根据特殊变量、目录、客户端的信息进行URL调整等
nginx的重写模块是一个简单的正则匹配一个虚拟堆叠机结合,基于PCRE库
例子:
rewrite ^/(.*) http://www.czlun.com/$1 permanent;
说明:
rewrite为固定关键字,表示开始进行rewrite匹配规则
regex部分是 ^/(.*) ,这是一个正则表达式,匹配完整的域名和后面的路径地址
replacement部分是http://www.czlun.com/$1 $1,是取自regex部分()里的内容。匹配成功后跳转到的URL。
flag部分 permanent表示永久301重定向标记,即跳转到新的 http://www.czlun.com/$1 地址上
# 将abc.com重写为www.abc.com,浏览器敲abc.com自动变成www.abc.com
server
listen 80;
server_name abc.com www.abc.com;
if ( $host != 'www.abc.com' )
rewrite ^/(.*) http://www.abc.com/$1 permanent;
location /
root /data/www/www;
index index.html index.htm;
error_log logs/error_www.abc.com.log error;
access_log logs/access_www.abc.com.log main;
keepalived+nginx高可用
keepalived的作用是检测后端TCP服务的状态,如果有一台提供TCP服务的后端节点死机,或者工作出现故障,keepalived会及时检测到,并将有故障的节点从系统中剔除,当提供TCP服务的节点恢复并且正常提供服务后keepalived会自动将TCP服务的节点加入到集群中
-
先安装两台nginx,我们假设IP分为是192.168.0.251和192.168.0.148,此处省略安装过程,将两个nginx安装,两台机器配置一致或者类似,都有一个相同的应用
-
安装配置keepalived,安装省略,参考百度,下面贴出关键配置
vi /etc/keepalived/keepalived.conf
vrrp_instance VI_INET1
state MASTER
interface eth0
virtual_router_id 53
priority 100
advert_int 1
authentication
auth_type pass
auth_pass 1111
virtual_ipaddress
192.168.0.104/24 # vip是104,虚拟IP
virtual_ipaddress 192.168.0.104 80
delay_loop 6
lb_algo rr
lb_kind NAT
nat_mask 255.255.255.0
persistence_timeout 50
protocal TCP
real_server 192.168.0.251 80
weight 3
TCP_CHECK
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
- 配置备用调度器的keepalived,只需要将state MASTER改为state BACKUP,降低priority 100的值为99(这个值表示优先级,必须低于主的),修改完毕,通过
/etc/init.d/keepalived start
启动即可
以上是关于Nginx常用配置和使用详解梳理的主要内容,如果未能解决你的问题,请参考以下文章