> 服务器 >

nginx配置文件详解

来源:网络 文章列表 2020-02-28 8
Nginx的配置文件是一个纯文本文件,它一般位于Nginx安装目录的conf目录下,整个配置文件是以block的形式组织的。每个block一般以一个大括号“{”来表示。block 可以分为几个层次,整个配置文件中Main命令位于最高层

Nginx的配置文件是一个纯文本文件,它一般位于Nginx安装目录的conf目录下,整个配置文件是以block的形式组织的。每个block一般以一个大括号“{”来表示。block 可以分为几个层次,整个配置文件中Main命令位于最高层,在Main层下面可以有Events、 HTTP等层级,而在HTTP层中又包含Server层,即server block, serverblock中又可分为location层,并且一个server block中可以包含多个location block。

nginx配置文件路径

[root@localhost vhost]# locate nginx.conf
/usr/local/nginx/conf/nginx.conf
/usr/local/nginx/conf/nginx.conf.default

一个完整的配置文件结构如图一 所示。

Nginx 服务的基本配置项详解:

我的本机nginx配置文件路径是  /usr/local/nginx/conf/ 这个目录下面,其中nginx.conf是主配置文件。Nginx.conf配置文件主要分成四个部分:

  • main (全局设置) 。  
  • sever (主机设置)。
  • upstram负载均街服务器设置。

  • location(URL匹配特定位置的设置)。

说明:

     main部分设置的命令将影响其他所有设置。 server 部分的命令主要用于指定主机和端口;。upstream命令主要用于负载均衡,设置一系列的后端服务器。 location 部分用于匹配网页位置。这四者之间的关系式server继承main, location 继承server, upstream 既不会继承其他设置也不会被继承。

    在这四个部分当中,每个部分都包含若干命令,这些命令主要包含Nginx的主模块命令,事件模块命令,HTTP核心模块命令,同时每个部分还可以使用其他HTTP模块命令(例如HTTP SSL模块,HttpGzip Static模块和Http Addition模块等)。

   下面通过一个Nginx配置实例详细介绍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 {
    use epoll;
    worker_connections  1024;
}

/*
  以上这块配置代码是对nginx全局属性的配置。
  user :主模块命令, 指定Nginx的worker进程运行用户以及用户组,默认由nobody账号运行。
  worker processes: 指定Nginx要开启的进程数。
  error log:用来定义全局错设日志文件的路径和日志名称。日志输出级别有debug,info,notice,warn,error,crit 可供选择,其中debug输出日志最为详细,面crit输出日志最少。
  pid: 用来指定进程id的存储文件位置。
  event:设定nginx的工作模式及连接数上限,其中参数use用来指定nginx的工作模式(这里是epoll,epoll是多路复用IO(I/O Multiplexing)中的一种方式),nginx支持的工作模式有select ,poll,kqueue,epoll,rtsig,/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,对于linux系统,epoll是首选。
         worker_connection是设置nginx每个进程最大的连接数,默认是1024,所以nginx最大的连接数max_client=worker_processes * worker_connections。进程最大连接数受到系统最大打开文件数的限制,需要设置ulimit。
*/


#下面部分是nginx对http服务器相关属性的设置
http {
    include       mime.types;               主模块命令,对配置文件所包含文件的设定,减少主配置文件的复杂度,相当于把部分设置放在别的地方,然后在包含进来,保持主配置文件的简洁
    default_type  application/octet-stream; 默认文件类型,当文件类型未定义时候就使用这类设置的。 

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '   指定nginx日志的格式
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;   开启高效文件传输模式(zero copy 方式),避免内核缓冲区数据和用户缓冲区数据之间的拷贝。
    #tcp_nopush     on;

    #keepalive_timeout  0;   客户端连接超时时间
    keepalive_timeout  65;

    #gzip  on;             设置是否开启gzip模块

    #server段是虚拟主机的配置 这里可以写在别的文件中 然后在包含进来,比如写在/usr/local/nginx/vhost/xxx.conf 目录某文件中 然后在包含进来,可以包含多个文件 include /usr/local/nginx/vhost/*;
    server {
        listen       80;   虚拟主机的服务端口
        server_name  localhost;   用来指定ip或者域名,多个域名用逗号分开

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {                       地址匹配设置,支持正则匹配,也支持条件匹配,这里是默认请求地址,用户可以location命令对nginx进行动态和静态网页过滤处理
            root   html;                   虚拟主机的网页根目录
            index  index.html index.htm;   默认访问首页文件
        }

        #error_page  404              /404.html;

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

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        location ~ \.php$ {   将以php为后缀的文件转发到 FastCGI处理. 使用FastCGI默认配置。本地8088端口处理
            fastcgi_pass   http://127.0.0.1:8088;

              fastcgi_index index.php;
              fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
              include        fastcgi_params;
        }
        #静态文件,nginx自己处理
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
             root /var/www/public/images;       
             expires 30d;  #缓存时间30天,静态文件更新不多,过期时间可以设大一点。
        }
       #配置Nginx状态的地址
        location /NginxStatus {
          stub_status            on;
          access_log              on;
          auth_basic              "NginxStatus";
          auth_basic_user_file  conf/htpasswd;
        }

       #配置nginx负载均衡的服务器列表
       upstream mysvr {
          #weigth参数表示权值,权值越高被分配到的几率越大
          #本机上的Squid开启3128端口
          server 192.168.199.1:88 weight=5;
          server 192.168.199.1:80   weight=1;

        }


        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {              
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

    #端口转发 (晚点补上...)

    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

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


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

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

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

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

}

nginx内置变量:

nginx的配置文件中可以使用的内置变量,都是以美元符$开始,也有人叫全局变量。其中,部分预定义的变量的值是可以改变的,这些内置变量可以提供给后端程序使用,比如php。下面列表就是nginx部分内置变量及其含义。

$args                      请求中的参数;
$binary_remote_addr        远程地址的二进制表示
$body_bytes_sent           已发送的消息体字节数
$content_length            HTTP请求信息里的"Content-Length"
$content_type              请求信息里的"Content-Type"
$document_root             针对当前请求的根路径设置值
$document_uri              与$uri相同
$host                      请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;    
$http_cookie               cookie 信息 
$http_referer              来源地址
$http_user_agent           客户端代理信息
$http_via                  最后一个访问服务器的Ip地址
$http_x_forwarded_for      相当于网络访问路径。    
$limit_rate                对连接速率的限制          
$remote_addr               客户端地址
$remote_port               客户端端口号
$remote_user               客户端用户名,认证用
$request                   用户请求信息
$request_body              用户请求主体
$request_body_file         发往后端的本地文件名称      
$request_filename          当前请求的文件路径名
$request_method            请求的方法,比如"GET"、"POST"等
$request_uri               请求的URI,带参数   
$server_addr               服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费)
$server_name               请求到达的服务器名
$server_port               请求到达的服务器端口号
$server_protocol           请求的协议版本,"HTTP/1.0"或"HTTP/1.1"
$uri                       请求的URI,可能和最初的值有不同,比如经过重定向之类的

nginx内核参数调优:

1.nginx进程数,一般跟cpu核数相同或为它的倍数,所以建议按照cpu数目来指定。
worker_processes 8;
2.Nginx最多可以打开文件数
  worker_rlimit_nofile 65535;
  该指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。

  注:
  文件资源限制的配置可以在/etc/security/limits.conf设置,针对root/user等各个用户或者*代表所有用户来设置。
  *   soft   nofile   65535
  *   hard  nofile   65535
  用户重新登录生效(ulimit -n)
3.隐藏响应头中的有关操作系统和Nginx服务器版本号的信息,保障安全性。
  server_tokens off;

性能相关配置参数

  • SENDFILE 
  • TCO_NODELY
  • TCP_NOPUSH 
  • TCP_CORK

sendfile :sendfile 参数和I/O有关,当上传文件时,内核首先缓冲数据,然后将数据发送到应用应用程序缓冲区。 应用程序反过来将数据发送到目的地。 Sendfile方法是一种改进的数据传输方法,其中数据在操作系统内核空间内的文件描述符之间复制,而不将数据传输到应用程序缓冲区。 

由于没有了用户态和内核态之间的切换,也没有内核缓冲区和用户缓冲区之间的拷贝,大大提升了传输性能

 nginx 中配置可以打开它

sendfile on;

 

腾讯云限量秒杀

1核2G 5M 50元/年 2核4G 8M 74元/年 4核8G 5M 818元/年 CDN流量包 100GB 9元

版权声明

本站部分原创文章,部分文章整理自网络。如有转载的文章侵犯了您的版权,请联系站长删除处理。如果您有优质文章,欢迎发稿给我们!联系站长:
愿本站的内容能为您的学习、工作带来绵薄之力。

评论

  • 随机获取
点击刷新
精彩评论

友情链接