web服务器之Nginx使用详解(进阶篇)

timo-nbktp 1年前 ⋅ 948 阅读

1 前言

上一篇 高性能web服务器之Nginx使用详解 中,介绍了Nginx的环境搭建,以及一些基础的使用,本文将介绍一些Nginx使用时的高级应用。

2 Nginx核心配置文件

下面简单介绍下Nginx的核心配置文件/usr/local/nginx/conf/nginx.conf

2.1 Nginx文件结构

nginx文件结构如下:

...    #全局块

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块
    配置请求的路由,以及页面资源的映射路径等。

    注:
    块配置项一定会用大括号把一系列所属的配置项全包含进来,块配置项可以嵌套,内层块直接继承外层块,当内外层块中的配置发生冲突时,以内层块为准。

2.2 Nginx核心配置文件

  • 下面给大家上一个配置文件,方便老铁们理解

########### 每个指令必须有分号结束。#################

#user administrator administrators;  #配置用户或者组,默认为nobody nobody
#worker_processes 2;  #允许生成的进程数,默认为1,这里一般设置为cpu核心数相等
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #指定日志路径,级别。这个设置可以放入全局块,http块,server块,级别依次为:debug|info|notice|warn|error|crit|alert|emerg

events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;  #最大连接数(指定同一时间最多可开启的文件数,对于linux来说,一个进程就会开启一个文件去处理),默认为1024,可以设置为65535(ulimit -h 65535)
}

http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型
    #access_log off; #取消服务日志    
    
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #              '$status $body_bytes_sent "$http_referer" '
    #              '"$http_user_agent" "$http_x_forwarded_for"'; #自定义配置 If the format is not specified then the predefined “combined” format is used.

    access_log log/access.log myFormat;  #combined为日志格式的默认值
    
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块中进行配置

    upstream app{   
      server 127.0.0.1:9091;
      server 127.0.0.1:9092 backup;  #热备
    }
    
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       80;   #监听端口
        server_name  127.0.0.1;   #监听地址(ip或者域名)  

		error_page 404 500 https://www.baidu.com; #错误页   
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index index.html index.htm;  #设置默认页
           proxy_pass  http://app;  #请求转向app定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}
  • 上面是nginx的基本配置,需要注意的有以下几点:
    惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能

每个指令必须有分号结束。

3 Nginx之动静分离

3.1 Nginx动静分离是什么

Nginx动静分离,指的是静态资源请求由Nginx 处理,动态资源请求由tomcat或其他web服务器处理。

Nginx主要用于部署静态资源,比如部署静态网站,如果我们是一个动态网站,比如Java开发的动态网站,那么动态网站里面肯定有一些静态资源,像图片、css、html、js、视频、音频、文档等等,这些静态资源如果使用tomcat等服务器部署,效率并不高,而采用nginx部署则大大提高性能。

3.2 Nginx动静分离配置

在负载均衡服务器的服务器上, Nginx根据客户端请求的URI判断请求的是否为静态资源,如果请求的 URI包含了jpg、png、.js、.html等信息,则由处理静态请求的服务器处理(部署 Nginx)。如果请求的URI包含了 .php、.jsp等字段,则由处理动态请求的服务器处理(部署 Tomcat)。

动静分离是实际应用中常见的一种场景,动态资源,由tomcat或其他web服务器完成,静态资源,如图片、css、js等由nginx服务器完成。
动静分离充分发挥它们各自的优势,从而达到更高效合理的架构,如下图所示:

nginx中配置静态资源,有以下两种方式:

  • 第一种方式
    通过在nginx.conf配置文件中添加静态资源的location进行匹配,比如:

    当访问静态资源的时候,从linux服务器的静态资源目录/opt/static目录下获取(静态资源目录可以根据个人习惯设置)

location ~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
   		root /opt/static;
}

location后面的参数说明:
~ 表示正则匹配,也就是说后面的内容可以是正则表达式匹配
第一个点 . 表示匹配任意字符
* 表示匹配一个或多个字符
\ 是转义字符,是后面这个点的转义字符

| 表示或者
$ 表示结尾
整个配置表示以 .后面括号里面的这些后缀结尾的文件都由nginx服务器处理

以上localtion匹配的最终效果:
访问资源的时候,如:http://域名/umi.jshttp://域名/app.csshttp://域名/index.htmlhttp://域名/hello.pdfhttp://域名/test.png等,都可以通过Nginx服务器,映射到静态资源目录/opt/static下,去获取资源。

  • 第二种方式
    通过在nginx.conf配置文件中配置静态资源所在目录实现,比如:
location ~ .*/(css|js|img|image) {
      root   /opt/static;
}

Localtion匹配的最终效果: hello/css、hello/js、hello/picture/img、*/image等
如,访问以下请求时,可以访问到目录下的资源
http://域名/css/index.csshttp://域名/admin/js/index.css

注意: nginx是把ip:80端口映射成你的root路径(比如笔者这里是 /opt/static),假设你需要这样http://域名/css/index.css访问资源,则需要配置资源的位置为: /opt/static/css/index.css

放置静态资源的目录,要注意一下目录权限问题,如果权限不足,可能会出现403错误,使用以下命令,给目录赋予权限 chmod 744 filename

Nginx动静分离,结合负载均衡一起使用,进行如下配置即可:

upstream app1 { 
    server  ip:91 weight=3; 
    server  域名 weight=2;  
}

location /admin{
    proxy_pass http://app1;
}
location ~ .*/(css|js|img|image) {
      root   /opt/static;
}

以上配置中,请求http://ip/admin,会分发到请求服务器,加载动态的数据,而请求http://ip/static/js/index.js,就会直接访问nginx服务器下的静态资源

4 Nginx日志配置以及切割

4.1 日志的配置

nginx服务,日志也是必不可少的,下面使用自定义日志配置:

 log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

参数说明
$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址
$remote_user 用来记录客户端用户名称
$time_local 用来记录访问时间与时区

$request 用来记录请求的url与http协议
$status 用来记录请求状态;成功是200
$body_bytes_sent 记录发送给客户端文件主体内容大小

$http_referer 用来记录从那个页面链接访问过来的
$http_user_agent 记录客户端浏览器的相关信息

官网日志配置: http://nginx.org/en/docs/http/ngx_http_log_module.html

4.2 日志的切割

4.2.1 为什么要进行日志切割

当nginx服务器运行一段时间之后,日志文件特别的大,不方便查看日志,这时候,可以按照实际的情况,进行日志文件的切分。

4.2.2 如何进行日志切割

使用以下命令:
/usr/local/nginx/sbin/nginx -s reopen

使用-s reopen参数可以重新打开日志文件,这样可以先把当前日志文件改名或转移到其他目录中进行备份,再重新打开时就会生成新的日志文件,这个功能使得日志文件不至于过大 ,进行日志切分后,方便查找日志。

Linux下我们可以直接把日志文件mv走,但是当你mv移走后新的日志文件没有重新生成,一般linux下用的文件句柄,文件被打开情况下你mv走文件,但是原来操作这个文件的进程还是有这个文件的inode等信息,原进程还是读写原来的文件,而此时我们只需要执行一下reopen,则会生成新的日志文件。

操作步骤:

  • mv原文件到新文件夹中,此时nginx还是会把日志信息写到这个旧日志文件(写入新日志目录位置的旧日志文件中了)
  • 调用/usr/local/nginx/sbin/nginx -s reopen用来打开新日志文件,这样nginx会把新日志信息写入到这个新的日志文件中,这样就完成了日志的切割工作, 同时切割过程中没有日志的丢失。

4.2.3 使用定时任务进行日志的切割

一般来说,不会手动进行日志的切割,通常会使用Linux的定时任务,去定周期的进行日志的切割,可以根据公司实际情况,根据日志产生的数据量,来合理的设置定时任务的周期。

(不会使用Linux定时任务的童鞋们,可以参考另一篇博文http://timoa.cn/post/143

为了更高效地完成此工作,可以采用定时任务+脚本实现

脚本配置如下:

#!/bin/bash
date=`date +%Y%m%d%`
logpath1=/usr/local/nginx/logs/
logpath2=/opt/logs/nginx/
mv $logpath1/access.log $logpath2/access-$date.log
mv $logpath1/error.log $logpath2/error-$date.log
/usr/local/nginx/sbin/nginx -s reopen

日志的路径可以根据个人习惯指定,这里,把日志移动到/opt/logs/nginx/路径下,所以需要创建这个用来存放日志的目录/opt/logs/nginx/,以后,可以去这个路径下查看nginx的运行日志情况。

使用以下命令创建目录:
mkdir -pv /opt/logs/nginx/ -p表示递归创建 -v表示显示目录创建信息

配置定时任务
首先,把上面的这个shell脚本,放到一个文件logCrontab.sh中,并放到目录/usr/local/nginx/logs下,接着,然后创建定时任务

使用命令:
crontab -e

添加如下内容,每日23点进行日志切割:

* 23 * * * /usr/local/nginx/logs/logCrontab.sh

然后就可以根据实际情况,完成日志的切割啦。

注意:
有可能没有执行权限:-bash: /usr/local/nginx/logs/logCrontab.sh: Permission denied

进入/usr/local/nginx/logs/目录,使用以下命令,设置可执行权限:
chmod 777 logCrontab.sh 或者 chmod +x logCrontab.sh

可以使用以下命令,查看定时任务执行情况:
tail -f /var/log/cron

5.1 Nginx服务器禁止ip访问

如果考虑安全性,可以设置禁止ip访问,这样黑客或者其他有心者,就不能通过ip或者他们的域名访问你的ip服务资源了。

具体配置也比较简单,如果是http访问,新添加如下server即可:

# http禁止IP直接访问网站 
server {
    listen 80 default;
    server_name _;
    return 403;
}

如果是https禁止ip访问,需要在ssl配置那里设置:

# https禁止IP直接访问网站(这种方式如果不好用,可以使用下面5.2中,域名的判断方式处理)
server {
    # 禁止ip访问
    listen 443 ssl default_server;
    # 填写绑定证书的域名
    server_name  www.domain.cn;
     # 禁止ip访问
    server_name _;
	return 403;
	
    # 证书文件名称
    ssl_certificate      /usr/local/nginx/nginx-private.crt;
    # 私钥文件名称
    ssl_certificate_key  /usr/local/nginx/nginx-private.key;
}

禁止访问如下所示:

一般来说,可以设置一些禁止访问的友好界面,看起来更好看。

5.2 最终nginx文件配置

worker_processes  4;

events {
      worker_connections  65535;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        # 监听80端口
        listen       80;
        #填写绑定证书的域名
        server_name www.domain.cn;

        #把http的域名请求转成https,这个是HTTP自动跳转HTTPS的安全配置(可选)让其自动将HTTP的请求重定向到HTTPS
        return 301 https://$host$request_uri;

        # location / {
        #     root   html;
        #     index  index.html index.htm;
        # }

    }

    server {
        # Nginx 版本为 nginx/1.15.0 以上请使用 listen 443 ssl 代替 listen 443 和 ssl on
        listen       443 ssl;
        # 填写绑定证书的域名
        server_name  www.domain.cn;
		# https禁止ip访问
        if ($host != 'www.domain.cn') {
               return 500;
        }

        # 证书文件名称
	    ssl_certificate      /usr/local/nginx/nginx-private.crt;
	    # 私钥文件名称
	    ssl_certificate_key  /usr/local/nginx/nginx-private.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        #请按照以下协议配置
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        #ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root html;
            index  index.html index.htm;
        }

    }

    # http禁止IP直接访问网站
    server {
        listen 80 default;
        server_name _;
        return 403;
    }

 }

 

参考资料:
Nginx官方文档: http://nginx.org/en/docs/
nginx配置:https://www.runoob.com/w3cnote/nginx-setup-intro.html

 

--end--

 

版权 本着开源共享、共同学习的精神,本文转载自 https://blog.csdn.net/smilehappiness/article/details/106675860 , 如果侵权之处,请联系博主进行删除,谢谢~