Nginx常用配置和使用详解梳理

Posted wu6660563

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx常用配置和使用详解梳理相关的知识,希望对你有一定的参考价值。

文章目录


用了nginx这么久,也没时间去梳理一下配置和使用,此文重点是整理一下安装和使用方面的一些小技巧

安装篇

  • 安装要支持rewrite模块,Linux就必须安装pcreyum 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_moduleNginx配置能够使用扩展使用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后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。

注意:

  1. 使用alias时,目录名后面一定要加"/"。
  2. alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
  3. alias只能位于location块中。(root可以不放在location中)

nginx内置变量

nginx在处理请求的时候,会有大量的变量,这些变量可以通过访问日志来记录下来,也可以直接拿来nginx配置中使用

参数名称描述
$arg_PARAMETERHTTP请求中某个参数的值,比如/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常用配置和使用详解梳理的主要内容,如果未能解决你的问题,请参考以下文章

Nginx核心配置文件常用参数详解

nginx的安装配置详解

09-nginx常用配置详解

nginx 常用配置记录

Nginx----安装和配置文件参数详解

nginx代理常用配置