青蛙学Linux—Nginx配置文件详解

Nginx的配置文件位于Nginx安装目录下的conf目录下,nginx.conf为其主要的配置文件,Nginx的主要功能都在该文件中进行配置。

1、main和event部分详解

我们先来看下nginx.conf中这一部分的内容:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

详解:

  • user:定义运行Nginx进程的用户和用户组,默认为nobody
  • worker_processes:定义Nginx启动的工作进程数,一般设置为CPU核心数即可;在Nginx 1.10版本之后,该项新增了一个配置值auto,表示自动检测CPU核心数并打开相同数量的工作进程
  • error_log:定义全局错误日志文件。日志的输出级别有debug、info、notice、warn、error、crit,其中debug输出内容最为详细,crit输出内容最少
  • pid:定义Nginx的PID文件位置
  • events:Nginx配置文件中的event部分,用来定义Nginx的工作模式和连接数
  • worker_connections:定义Nginx每个进程的最大连接数,默认为1024,可视情况上调。在一个纯Nginx(无反向代理、仅进行静态解析)应用中,最大连接数为worker_processes*worker_connections

为了优化Nginx的性能,在这部分的配置中还可以加上以下内容:

  • worker_cpu_affinity:将Nginx工作进程与指定的CPU核心绑定,降低由于多核心的切换造成的性能损耗;该项与worker_processes配合使用;该项的设置方法为,CPU有几个核心,就有几位数,1代表在该核心开启,0代表在该核心关闭,具体如下
    # 假设当前主机有4个CPU核心
    worker_processes 4;
    worker_cpu_affinity 0001 0010 0100 1000;
  • worker_rlimit_nofile:定义一个Nginx进程可以打开的最大文件描述符数目,值可以设置为65535到百万(需要主机性能足够强大);另外也可以使用系统命令ulimit –n 数值来设定最大文件描述符数目;推荐使用该项进行设置,只有设置了该项后worker_connections自定义值才能生效
  • use:event部分的设置,用于定义Nginx工作的模式。Nginx支持select、poll、kqueue、epoll、rtsig和/dev/poll,对于Linux来说,epoll是Nginx最优的工作模式,所以该项建议配置为epoll

2、http部分详解

我们先来看下nginx.conf中这一部分的内容:

http {
    include       mime.types;
    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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

详解:

  • include:可以将其他配置文件引入主配置文件,以减少主配置文件的复杂度。这里引入的是Nginx可以处理的文件类型
  • default_type:当文件类型未定义时使用指定的方法进行解析,默认类型为二进制流。例如在未配置PHP的环境中通过浏览器访问一个PHP页面,此时会出现下载窗口
  • log_format:定义Nginx日志的输出格式,有两个参数,第一个为格式的名称,可自定义,第二个为具体的格式
  • access_log:定义Nginx访问日志保存的位置以及格式,有两个参数,第一个参数为日志保存的位置,第二个参数为log_format中定义的日志格式的名称
  • sendfile:用于开启高效文件传输模式,可与tcp_nopush、tcp_nodelay(自行添加)配合使用,后两个项设置为on可用于防止网络阻塞
  • keepalive_timeout:定义客户端连接保持活动的超时时间
  • gzip:是否开启gzip模块对传输的数据进行压缩

为了优化Nginx的性能,在这部分的配置中还可以加上以下内容:

  • server_names_hash_bucket_size:为了提高快速寻找到相应server name的能力,Nginx使用散列表来存储server name,而server_names_hash_bucket_size就是设置每个散列桶占用的内存大小,在生产环境使用时可设置为128
  • client_max_body_size:定义允许客户端请求的最大的单个文件字节数,可用于控制客户端上传文件的大小,如限制客户端上传文件的大小为20MB,可设置为20m
  • client_header_buffer_size:定义来自客户端请求头的header buffer大小。对于大多数请求,1K的缓冲区大小已经足够,如果自定义了消息头或有更大的Cookie,可以增加缓冲区大小。对于大多数环境可设置成32k
  • large_client_header_buffers:用来指定客户端请求中较大的消息头的缓存最大数量和大小, 有两个参数,第一个定义最大数量,第二个定义大小,可设置为4 32k

gzip模块常用的压缩参数配置:

  • gzip_min_length:定义允许压缩的页面最小字节数,页面字节数从header的Content-Length中获取,默认值为0,表示不管页面多大都进行压缩。建议设置成大于等于1k的值,小于1k可能会越压越大
  • gzip_buffers:定义压缩时申请多少单位的多大内存作为压缩结果流缓存,默认是申请与原始数据大小相同的内存空间来存储gzip压缩结果。生产环境可设置为4 16k
  • gzip_http_version:定义HTTP协议版本,默认为1.1。当前大部分浏览器已经支持gzip解压,这里设置成1.1即可
  • gzip_comp_level:定义gzip的压缩比,值为1-9。数字越小压缩比越小,处理速度越快,建议设置成2
  • gzip_types:定义对于哪些内容使用gzip进行压缩,值一般设置为text/plain application/x-javascript text/css application/xml;对于html,无论是否指定均会被压缩

3、server部分详解

以下为nginx.conf中一个server部分的内容(不包括location部分):

server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;


        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;

详解:

  • listen:定义该虚拟主机的服务端口
  • server_name:定义该虚拟主机提供访问的域名,这里也可以使用IP地址;多个域名之间用空格分开
  • charset:定义该虚拟主机的字符集;如果出现中文乱码的情况可将该项的值修改为utf-8
  • access_log:定义该虚拟主机的访问日志保存路径以及日志格式,有两个参数,第一个参数为保存路径,第二个参数为http部分中log_format定义的格式名称
  • error_page:定制各种错误信息的返回页面。在默认情况下,Nginx会在主目录的html目录中查找指定的返回页面,特别需要注意的是,这些错误信息的返回页面的大小一定要超过512K,否者会被IE浏览器替换为IE默认的错误页面

4、启动Nginx

4.1、检查配置文件是否正确

Nginx提供了检查配置文件的功能,以便我们在修改完配置文件之后进行检查。进入Nginx的安装目录下的sbin目录,运行:

./nginx -t
./nginx -t -c 配置文件路径

如果不使用-c选项指定配置文件,则Nginx默认使用安装目录下conf目录中的nginx.conf配置文件。

4.2、启动Nginx

进入Nginx的安装目录下的sbin目录,运行:

./nginx

4.3、停止Nginx和重启Nginx

Nginx对进程的控制能力非常强大,可以通过信号指令控制进程。常用的信号有:

  • QUIT:处理完当前请求之后关闭进程
  • HUP:重新加载配置文件,关闭原有的工作进程,并开启新的工作进程,此操作不会中断用户的访问请求,因此可以平滑的重启Nginx
  • USR1:用于Nginx的日志切换,重新打开一个日志文件
  • USR2:平滑升级可执行程序
  • WINCH:从容关闭工作进程

注意:Nginx在工作的时候会由主进程(master process)启动配置文件中指定数量的子进程(worker process,工作进程),而以上信号操作的都是Nginx的主进程PID。

所以,可以使用以下命令停止Nginx:

kill -QUIT Nginx主进程PID
kill -WINCH Nginx主进程PID
kill -9 Nginx主进程PID

使用以下命令平滑重启Nginx:

kill -HUP Nginx主进程PID

也可以使用以下命令对Nginx执行停止|退出|重新打开|重载操作:

# 进入Nginx安装目录下的sbin目录
./nginx -s stop|quit|reopen|reload

4.4、查看Nginx版本号以及编译参数

进入Nginx安装目录下的sbin目录,使用以下命令查看Nginx的版本号:

./nginx -v

使用以下命令查看更详细的信息以及Nginx编译安装时指定的参数:

./nginx -V

5、小技巧:隐藏Nginx的版本号信息

在Nginx运行后,将会打开80端口,此时使用telnet检测80端口是否打开,结束时将会显示Nginx版本等详细信息,如下所示:

3

为了减少安全隐患,我们需要将Nginx的版本号隐藏起来(某些版本可能存在已知漏洞),在Nginx配置文件中的http部分中添加以下配置:

server_tokens  off;

此时再使用telnet时,就无法看到Nginx的具体版本号信息:

4

在Linux下也可以使用以下命令查看:

curl -I http://xxx

另外,可以通过修改Nginx的源码包中的文件来隐藏版本号,修改以下几处:

  • 源码包目录下的src/core/nginx.h中的#define NGINX_VERSION后的值
  • 源码包目录下的src/http/ngx_http_header_filter_module.c中的static u_char ngx_http_server_string[] = 的值
  • 源码包目录下的src/http/ngx_http_special_response.c中的"<hr><center>nginx</center>" CRLF的值
posted @ 2019-01-02 10:04  青蛙学Linux  阅读(453)  评论(0编辑  收藏  举报