精华内容
下载资源
问答
  • Nginx配置文件(nginx.conf)配置详解

    万次阅读 多人点赞 2016-02-19 10:03:50
    Nginx配置文件nginx.conf配置详解如下: usernginxnginx; Nginx用户及组:用户组。window下不指定 worker_processes8; 工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。 error_loglogs/error.log;...

     

    Nginx的配置文件nginx.conf配置详解如下:

     

    user nginx nginx ;

    Nginx用户及组:用户 组。window下不指定

     

    worker_processes 8;

    工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。

     

    error_log  logs/error.log;  

    error_log  logs/error.log  notice;  

    error_log  logs/error.log  info;  

    错误日志:存放路径。

     

    pid logs/nginx.pid;

    pid(进程标识符):存放路径。

     

    worker_rlimit_nofile 204800;

    指定进程可以打开的最大描述符:数目。

    这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。

    现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。

    这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。

     

    events

    {

    use epoll;

    使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。

    补充说明:

    与apache相类,nginx针对不同的操作系统,有不同的事件模型

    A)标准事件模型

    Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll

    B)高效事件模型

    Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。

    Epoll:使用于Linux内核2.6版本及以后的系统。

    /dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。

    Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。

     

    worker_connections 204800;

    没个工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。worker_processes*worker_connections

    keepalive_timeout 60;

    keepalive超时时间。

     

    client_header_buffer_size 4k;

    客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。

    分页大小可以用命令getconf PAGESIZE 取得。

    [root@web001 ~]# getconf PAGESIZE

    4096

    但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。

     

    open_file_cache max=65535 inactive=60s;

    这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。

     

    open_file_cache_valid 80s;

    这个是指多长时间检查一次缓存的有效信息。

     

    open_file_cache_min_uses 1;

    open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。

    }

     

     

    ##设定http服务器,利用它的反向代理功能提供负载均衡支持

    http

    {

    include mime.types;

    设定mime类型,类型由mime.type文件定义

     

    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"';

    log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';

    日志格式设置。

    $remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;

    $remote_user:用来记录客户端用户名称;

    $time_local: 用来记录访问时间与时区;

    $request: 用来记录请求的url与http协议;

    $status: 用来记录请求状态;成功是200,

    $body_bytes_sent :记录发送给客户端文件主体内容大小;

    $http_referer:用来记录从那个页面链接访问过来的;

    $http_user_agent:记录客户浏览器的相关信息;

    通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

     

    access_log  logs/host.access.log  main;

    access_log  logs/host.access.404.log  log404;

    用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径

     

    server_names_hash_bucket_size 128;

    #保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.

     

    client_header_buffer_size 4k;

    客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。

     

    large_client_header_buffers 8 128k;

    客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果

    header过大,它会使用large_client_header_buffers来读取。

     

    open_file_cache max=102400 inactive=20s;

    这个指令指定缓存是否启用。
    例: open_file_cache max=1000 inactive=20s; 

    open_file_cache_valid 30s; 

    open_file_cache_min_uses 2; 

    open_file_cache_errors on;

     

    open_file_cache_errors
    语法:open_file_cache_errors on | off 默认值:open_file_cache_errors off 使用字段:http, server, location 这个指令指定是否在搜索一个文件是记录cache错误.

    open_file_cache_min_uses

    语法:open_file_cache_min_uses number 默认值:open_file_cache_min_uses 1 使用字段:http, server, location 这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cache中总是打开状态.
    open_file_cache_valid

    语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 使用字段:http, server, location 这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息.

     

     

    client_max_body_size 300m;

    设定通过nginx上传文件的大小

     

    sendfile on;

    sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。

     

    tcp_nopush on;

    此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用

     

    proxy_connect_timeout 90; 
    后端服务器连接的超时时间_发起握手等候响应超时时间

     

    proxy_read_timeout 180;

    连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)

     

    proxy_send_timeout 180;

    后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据

     

    proxy_buffer_size 256k;

    设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小

     

    proxy_buffers 4 256k;

    设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k

     

    proxy_busy_buffers_size 256k;

     

    proxy_temp_file_write_size 256k;

    设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长

     

    proxy_temp_path /data0/proxy_temp_dir;

    proxy_temp_path和proxy_cache_path指定的路径必须在同一分区


    proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
    #设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。

    keepalive_timeout 120;

    keepalive超时时间。

     

    tcp_nodelay on;

     

    client_body_buffer_size 512k;
    如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
    无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误

     

    proxy_intercept_errors on;

    表示使nginx阻止HTTP应答代码为400或者更高的应答。

     

    upstream bakend {

    server 127.0.0.1:8027;

    server 127.0.0.1:8028;

    server 127.0.0.1:8029;

    hash $request_uri;

    }

    nginx的upstream目前支持4种方式的分配

    1、轮询(默认)

    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

    2、weight
    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
    例如:
    upstream bakend {
    server 192.168.0.14 weight=10;
    server 192.168.0.15 weight=10;
    }

    2、ip_hash
    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
    例如:
    upstream bakend {
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
    }

    3、fair(第三方)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    upstream backend {
    server server1;
    server server2;
    fair;
    }

    4、url_hash(第三方)

    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

    例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

    upstream backend {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
    }

    tips:

    upstream bakend{#定义负载均衡设备的Ip及设备状态}{
    ip_hash;
    server 127.0.0.1:9090 down;
    server 127.0.0.1:8080 weight=2;
    server 127.0.0.1:6060;
    server 127.0.0.1:7070 backup;
    }
    在需要使用负载均衡的server中增加
    proxy_pass http://bakend/;

    每个设备的状态设置为:
    1.down表示单前的server暂时不参与负载
    2.weight为weight越大,负载的权重就越大。
    3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
    4.fail_timeout:max_fails次失败后,暂停的时间。
    5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

    nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

    client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug
    client_body_temp_path设置记录文件的目录 可以设置最多3层目录

    location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

     

     

    ##配置虚拟机

    server

    {

    listen 80;

    配置监听端口

     

    server_name image.***.com;

    配置访问域名

     

    location ~* \.(mp3|exe)$ {

    对以“mp3或exe”结尾的地址进行负载均衡

     

    proxy_pass http://img_relay$request_uri;

    设置被代理服务器的端口或套接字,以及URL

     

    proxy_set_header Host $host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    以上三行,目的是将代理服务器收到的用户的信息传到真实服务器上

    }

     

    location /face {

    if ($http_user_agent ~* "xnp") {

    rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;

    }

    proxy_pass http://img_relay$request_uri;

    proxy_set_header Host $host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    error_page 404 502 = @fetch;

    }

    location @fetch {

    access_log /data/logs/face.log log404;

    rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;

    }

    location /image {

    if ($http_user_agent ~* "xnp") {

    rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;

    }

    proxy_pass http://img_relay$request_uri;

    proxy_set_header Host $host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    error_page 404 502 = @fetch;

    }

    location @fetch {

    access_log /data/logs/image.log log404;

    rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;

    }

    }

     

    ##其他举例

    server

    {

    listen 80;

    server_name *.***.com *.***.cn;

    location ~* \.(mp3|exe)$ {

    proxy_pass http://img_relay$request_uri;

    proxy_set_header Host $host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

    location / {

    if ($http_user_agent ~* "xnp") {

    rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;

    }

    proxy_pass http://img_relay$request_uri;

    proxy_set_header Host $host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    #error_page 404 http://i1.***img.com/help/noimg.gif;

    error_page 404 502 = @fetch;

    }

    location @fetch {

    access_log /data/logs/baijiaqi.log log404;

    rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;

    }

    }

    server

    {

    listen 80;

    server_name *.***img.com;

     

    location ~* \.(mp3|exe)$ {

    proxy_pass http://img_relay$request_uri;

    proxy_set_header Host $host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

    location / {

    if ($http_user_agent ~* "xnp") {

    rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif;

    }

    proxy_pass http://img_relay$request_uri;

    proxy_set_header Host $host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    #error_page 404 http://i1.***img.com/help/noimg.gif;

    error_page 404 = @fetch;

    }

    #access_log off;

    location @fetch {

    access_log /data/logs/baijiaqi.log log404;

    rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;

    }

    }

    server

    {

    listen 8080;

    server_name ngx-ha.***img.com;

    location / {

    stub_status on;

    access_log off;

    }

    }

    server {

    listen 80;

    server_name imgsrc1.***.net;

    root html;

    }

     

    server {

    listen 80;

    server_name ***.com w.***.com;

    # access_log /usr/local/nginx/logs/access_log main;

    location / {

    rewrite ^(.*)$ http://www.***.com/ ;

    }

    }

    server {

    listen 80;

    server_name *******.com w.*******.com;

    # access_log /usr/local/nginx/logs/access_log main;

    location / {

    rewrite ^(.*)$ http://www.*******.com/;

    }

    }

    server {

    listen 80;

    server_name ******.com;

    # access_log /usr/local/nginx/logs/access_log main;

    location / {

    rewrite ^(.*)$ http://www.******.com/;

    }

    }

    location /NginxStatus {
    stub_status on;
    access_log on;
    auth_basic "NginxStatus";
    auth_basic_user_file conf/htpasswd;
    }

    #设定查看Nginx状态的地址

     

    location ~ /\.ht {
    deny all;
    }

    #禁止访问.htxxx文件

    }

     

    注释:变量

    Ngx_http_core_module模块支持内置变量,他们的名字和apache的内置变量是一致的。

    首先是说明客户请求title中的行,例如$http_user_agent,$http_cookie等等。

    此外还有其它的一些变量

    $args此变量与请求行中的参数相等

    $content_length等于请求行的“Content_Length”的值。

    $content_type等同与请求头部的”Content_Type”的值

    $document_root等同于当前请求的root指令指定的值

    $document_uri与$uri一样

    $host与请求头部中“Host”行指定的值或是request到达的server的名字(没有Host行)一样

    $limit_rate允许限制的连接速率

    $request_method等同于request的method,通常是“GET”或“POST”

    $remote_addr客户端ip

    $remote_port客户端port

    $remote_user等同于用户名,由ngx_http_auth_basic_module认证

    $request_filename当前请求的文件的路径名,由root或alias和URI request组合而成

    $request_body_file

    $request_uri含有参数的完整的初始URI

    $query_string与$args一样

    $sheeme http模式(http,https)尽在要求是评估例如

    Rewrite ^(.+)$ $sheme://example.com$; Redirect;

    $server_protocol等同于request的协议,使用“HTTP/或“HTTP/

    $server_addr request到达的server的ip,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在listen指令中指明ip,并使用bind参数。

    $server_name请求到达的服务器名

    $server_port请求到达的服务器的端口号

    $uri等同于当前request中的URI,可不同于初始值,例如内部重定向时或使用index

    展开全文
  • Nginx 配置文件详解

    2019-11-24 13:42:18
    Nginx 配置文件详解Nginx配置文件结构Nginx的全局配置HTTP服务器配置HttpGzip模块配置负载均衡配置server虚拟主机配置location URL匹配配置StubStatus模块配置配置实例1. nginx 配置 tomcat 集群反向代理2. 多个...

    Nginx的配置文件结构

      Nginx 的配置文件 nginx.conf 位于其安装目录的 conf 目录下。
    nginx.conf 由多个块组成,最外面的块是 main,main 包含 Events 和 HTTP,HTTP 包含 upstream 和多个 Server,Server 又包含多个 location:main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)和 location(URL 匹配特定位置的设置)。

    在这里插入图片描述

    • main 块设置的指令将影响其他所有设置;
    • server 块的指令主要用于指定主机和端口;
    • upstream 指令主要用于负载均衡,设置一系列的后端服务器;
    • location 块用于匹配网页位置。

      这四者之间的关系式:server 继承 main,location 继承 server,upstream 既不会继承其他设置也不会被继承。
    在这四个部分当中,每个部分都包含若干指令,这些指令主要包含 Nginx 的主模块指令、事件模块指令、HTTP 核心模块指令,同时每个部分还可以使用其他 HTTP 模块指令,例如 Http SSL 模块、HttpGzip Static 模块和 Http Addition 模块等。

    Nginx的全局配置

    user nobody nobody;
    worker_processes 2;
    error_log logs/error.log notice;
    pid logs/nginx.pid;
    worker_rlimit_nofile 65535;
     
    events{
    use epoll;
    worker_connections 65536;
    }
    

    每个配置选项的含义解释如下:

    • user 是个主模块指令,指定 Nginx Worker 进程运行用户以及用户组,默认由 nobody 账号运行。

    • worker_processes 是个主模块指令,指定了 Nginx 要开启的进程数。每个 Nginx 进程平均耗费 10M~12M 内存。建议指定和 CPU 的数量一致即可。

    • error_log 是个主模块指令,用来定义全局错误日志文件。日志输出级别有 debug、info、notice、warn、error、crit 可供选择,其中,debug 输出日志最为最详细,而 crit 输出日志最少。

    • pid 是个主模块指令,用来指定进程 pid 的存储文件位置。

    • worker_rlimit_nofile 用于绑定 worker 进程和 CPU, Linux 内核 2.4 以上可用。

    • events 事件指令是设定 Nginx 的工作模式及连接数上限:
      use 是个事件模块指令,用来指定 Nginx 的工作模式。Nginx 支持的工作模式有 select、poll、kqueue、epoll、rtsig 和 /dev/poll。其中 select 和 poll 都是标准的工作模式,kqueue 和 epoll 是高效的工作模式,不同的是 epoll 用在 Linux 平台上,而 kqueue 用在 BSD 系统中。对于 Linux 系统,epoll 工作模式是首选。

    • worker_connections 也是个事件模块指令,用于定义 Nginx 每个进程的最大连接数,默认是1024。最大客户端连接数由 worker_processes 和 worker_connections 决定,Max_client=worker_processes*worker_connections。在作为反向代理时,max_clients 变为:max_clients = worker_processes * worker_connections/4。
      进程的最大连接数受 Linux 系统进程的最大打开文件数限制,在执行操作系统命令 “ulimit -n 65536” 后 worker_connections 的设置才能生效

    HTTP服务器配置

    http{
        include conf/mime.types;
        default_type application/octet-stream;
        log_format main '$remote_addr - $remote_user [$time_local] '
        '"$request" $status $bytes_sent '
        '"$http_referer" "$http_user_agent" '
        '"$gzip_ratio"';
        log_format download '$remote_addr - $remote_user [$time_local] '
        '"$request" $status $bytes_sent '
        '"$http_referer" "$http_user_agent" '
        '"$http_range" "$sent_http_content_range"';
        client_max_body_size 20m;
        client_header_buffer_size 32K;
        large_client_header_buffers 4 32k;
        Sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 60;
        client_header_timeout 10;
        client_body_timeout 10;
        send_timeout 10;
    

      下面详细介绍下这段代码中每个配置选项的含义。

    • include 是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。类似于 Apache 中的 include 方法。

    • default_type 属于 HTTP 核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置 PHP 环境时,Nginx 是不予解析的,此时,用浏览器访问 PHP 文件就会出现下载窗口。

      下面的代码实现对日志格式的设定:

        log_format main '$remote_addr - $remote_user [$time_local] '
        '"$request" $status $bytes_sent '
        '"$http_referer" "$http_user_agent" '
        '"$gzip_ratio"';
        log_format download '$remote_addr - $remote_user [$time_local] '
        '"$request" $status $bytes_sent '
        '"$http_referer" "$http_user_agent" '
        '"$http_range" "$sent_http_content_range"';
    

      log_format 是 Nginx 的 HttpLog 模块指令,用于指定 Nginx 日志的输出格式。main 为此日志输出格式的名称,可以在下面的 access_log 指令中引用。

    • client_max_body_size 用来设置允许客户端请求的最大的单个文件字节数;

    • client_header_buffer_size 用于指定来自客户端请求头的 headerbuffer 大小。对于大多数请求,1K 的缓冲区大小已经足够,如果自定义了消息头或有更大的 Cookie,可以增加缓冲区大小。这里设置为 32K;

    • large_client_header_buffers 用来指定客户端请求中较大的消息头的缓存最大数量和大小, “4” 为个数,“128K” 为大小,最大缓存量为 4 个 128K;

    • sendfile 参数用于开启高效文件传输模式。将 tcp_nopush 和 tcp_nodelay 两个指令设置为 on 用于防止网络阻塞;

    • keepalive_timeout 设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接;

    • client_header_timeout 设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx 将返回 “Request time out(408)” 错误;

    • client_body_timeout 设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx 将返回 “Request time out(408)” 错误,默认值是 60;

    • send_timeout 指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx 将会关闭连接。

    HttpGzip模块配置

      下面配置 Nginx 的 HttpGzip 模块。这个模块支持在线实时压缩输出数据流。
    看是否安装了 HttpGzip 模块:

    [root@vps ~]# /opt/nginx/sbin/nginx  -V
    nginx version: nginx/1.0.14
    built by gcc 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)
    configure arguments: --with-http_stub_status_module --with-http_gzip_static_module --prefix=/opt/nginx
    

      通过 /opt/nginx/sbin/nginx -V 命令可以查看安装 Nginx 时的编译选项,由输出可知,我们已经安装了 HttpGzip 模块。

      下面是 HttpGzip 模块在 Nginx 配置中的相关属性设置:

    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    
    • gzip用于设置开启或者关闭 gzip 模块,“gzip on” 表示开启 GZIP 压缩,实时压缩输出数据流;

    • gzip_min_length 设置允许压缩的页面最小字节数,页面字节数从 header 头的Content-Length 中获取。默认值是 0,不管页面多大都进行压缩。建议设置成大于 1K 的字节数,小于 1K 可能会越压越大;

    • gzip_buffers 表示申请 4 个单位为 16K 的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果;

    • gzip_http_version 用于设置识别 HTTP 协议版本,默认是 1.1,目前大部分浏览器已经支持 GZIP 解压,使用默认即可;

    • gzip_comp_level 用来指定 GZIP 压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗 cpu 资源;

    • gzip_types 用来指定压缩的类型,无论是否指定,“text/html” 类型总是会被压缩的;

    • gzip_vary 选项可以让前端的缓存服务器缓存经过 GZIP 压缩的页面,例如用 Squid 缓存经过 Nginx 压缩的数据。

    负载均衡配置

      下面设定负载均衡的服务器列表:

    upstream cszhi.com{
    ip_hash;
        server 192.168.8.11:80;
        server 192.168.8.12:80 down;
        server 192.168.8.13:8009 max_fails=3 fail_timeout=20s;
        server 192.168.8.146:8080;
    }
    

      upstream 是 Nginx 的 HTTP Upstream 模块,这个模块通过一个简单的调度算法来实现客户端 IP 到后端服务器的负载均衡。
      在上面的设定中,通过 upstream 指令指定了一个负载均衡器的名称 cszhi.com。这个名称可以任意指定,在后面需要的地方直接调用即可。

      Nginx 的负载均衡模块目前支持 4 种调度算法,下面进行分别介绍,其中后两项属于第三方的调度方法。

    • 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响;

    • Weight:指定轮询权值,Weight 值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下;

    • ip_hash:每个请求按访问 IP 的 hash 结果分配,这样来自同一个 IP 的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题;

    • fair:比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx 本身是不支持 fair 的,如果需要使用这种调度算法,必须下载 Nginx 的 upstream_fair 模块;

    • url_hash:按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx 本身是不支持 url_hash 的,如果需要使用这种调度算法,必须安装 Nginx 的 hash 软件包。

      在 HTTP Upstream 模块中,可以通过 server 指令指定后端服务器的 IP 地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:

    • down:表示当前的 server 暂时不参与负载均衡;

    • backup:预留的备份机器。当其他所有的非 backup 机器出现故障或者忙的时候,才会请求 backup 机器,因此这台机器的压力最轻;

    • max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误;

    • fail_timeout:在经历了 max_fails 次失败后,暂停服务的时间。max_fails 可以和 fail_timeout 一起使用。

      注意,当负载调度算法为 ip_hash 时,后端服务器在负载均衡调度中的状态不能是 weight 和 backup。

    server虚拟主机配置

      下面介绍对虚拟主机的配置。
      建议将对虚拟主机进行配置的内容写进另外一个文件,然后通过 include 指令包含进来,这样更便于维护和管理。

    server{
        listen 80;
        server_name 192.168.8.18 cszhi.com;
        index index.html index.htm index.php;
        root /wwwroot/www.cszhi.com
        charset gb2312;
        access_log logs/www.ixdba.net.access.log main;
    
    • server 标志定义虚拟主机开始。

    • listen 用于指定虚拟主机的服务端口。

    • server_name 用来指定 IP 地址或者域名,多个域名之间用空格分开。

    • index 用于设定访问的默认首页地址。

    • root 指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。
      Charset 用于设置网页的默认编码格式。

    • access_log 用来指定此虚拟主机的访问日志存放路径,最后的 main 用于指定访问日志的输出格式。

    location URL匹配配置

      URL 地址匹配是进行 Nginx 配置中最灵活的部分。 location 支持正则表达式匹配,也支持条件判断匹配,用户可以通过 location 指令实现 Nginx 对动、静态网页进行过滤处理。使用 location URL 匹配配置还可以实现反向代理,用于实现 PHP 动态解析或者负载负载均衡。

      以下这段设置是通过 location 指令来对网页 URL 进行分析处理,所有扩展名以 .gif、.jpg、.jpeg、.png、.bmp、.swf 结尾的静态文件都交给 nginx 处理,而 expires 用来指定静态文件的过期时间,这里是 30 天。

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        root /wwwroot/www.cszhi.com;
        expires 30d;
    }
    

      以下这段设置是将 upload 和 html 下的所有文件都交给 nginx 来处理,当然,upload 和 html 目录包含在 /web/wwwroot/www.cszhi.com 目录中。

    location ~ ^/(upload|html)/ {
        root /web/wwwroot/www.cszhi.com;
        expires 30d;
    }
    

      在最后这段设置中,location 是对此虚拟主机下动态网页的过滤处理,也就是将所有以 .jsp 为后缀的文件都交给本机的 8080 端口处理。

    location ~ .*.php$ {
        index index.php;
        proxy_pass http://localhost:8080;
    }
    

    StubStatus模块配置

      StubStatus 模块能够获取 Nginx 自上次启动以来的工作状态,此模块非核心模块,需要在 Nginx 编译安装时手工指定才能使用此功能。

      以下指令实指定启用获取 Nginx 工作状态的功能。

    location /NginxStatus {
        stub_status on;
        access_log logs/NginxStatus.log;
        auth_basic "NginxStatus";
        auth_basic_user_file ../htpasswd;
    }
    
    • stub_status 设置为 “on” 表示启用 StubStatus 的工作状态统计功能。

    • access_log 用来指定 StubStatus 模块的访问日志文件。auth_basic 是 Nginx 的一种认证机制。

    • auth_basic_user_file 用来指定认证的密码文件,由于 Nginx 的 auth_basic 认证采用的是与 Apache 兼容的密码文件,因此需要用 Apache 的 htpasswd 命令来生成密码文件,例如要添加一个 test 用户,可以使用下面方式生成密码文件:

    /usr/local/apache/bin/htpasswd -c  /opt/nginx/conf/htpasswd test
    

      然后输入两次密码后确认之后添加用户成功。

      要查看 Nginx 的运行状态,可以输入 http://ip/NginxStatus ,输入创建的用户名和密码就可以看到 Nginx 的运行状态:

    Active connections: 1
    server accepts handled requests
    34561 35731 354399
    Reading: 0 Writing: 3 Waiting: 0
    

      Active connections 表示当前活跃的连接数,第三行的三个数字表示 Nginx当前总共处理了 34561 个连接, 成功创建次握手, 总共处理了 354399 个请求。最后一行的 Reading 表示 Nginx 读取到客户端 Header 信息数, Writing 表示 Nginx 返回给客户端的Header 信息数
    ,“Waiting” 表示 Nginx 已经处理完,正在等候下一次请求指令时的驻留连接数。

      在最后这段设置中,设置了虚拟主机的错误信息返回页面,通过 error_page 指令可以定制各种错误信息的返回页面。在默认情况下,Nginx 会在主目录的 html 目录中查找指定的返回页面,特别需要注意的是,这些错误信息的返回页面大小一定要超过 512K,否者会被 ie 浏览器替换为 ie 默认的错误页面。

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
    

    配置实例

    配置主机为 192.168.1.52、192.168.1.52,且 tomcat 中只有一个 root 项目。

    1. nginx 配置 tomcat 集群反向代理

    #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;
    }
    
    http {
    
    gzip              on;  
    gzip_min_length   1000;  
    gzip_types        text/plain text/css application/x-javascript;
    
    #设定负载均衡的服务器列表
    #weigth 参数表示权值,权值越高被分配到的几率越大
    upstream helptimely_52{
        server 192.168.1.52:8090 weight=1;
        server 192.168.1.53:8090 weight=1;
                    
    }
       
    server {
        #侦听的80端口
        listen       80;
        server_name  localhost;
        #设定查看 Nginx 状态的地址
        location /nginxstatus{
             stub_status on;
             access_log on;
             auth_basic "nginxstatus";
             auth_basic_user_file htpasswd;
        }
        #匹配以 jsp 结尾的,tomcat 的网页文件是以 jsp 结尾
        location / {
            index index.jsp;
            proxy_pass   http://helptimely_52;    #在这里设置一个代理,和 upstream 的名字一样
            #以下是一些反向代理的配置可删除
            proxy_redirect             off; 
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实 IP
            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       10m; #允许客户端请求的最大单文件字节数
            client_body_buffer_size    128k; #缓冲区代理缓冲用户端请求的最大字节数
            proxy_connect_timeout      300; #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout         300; #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout         300; #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size          4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers              4 32k; #proxy_buffers 缓冲区,网页平均在 32k以下的话,这样设置
            proxy_busy_buffers_size    64k; #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
        }
    }
    
    }
    
    

    2. 多个tomcat多个项目配置

    多个 tomcat 及每个 tomcat 下有多个项目的时候,需要指定 tomcat 及其下的指定项目。

    #user  nobody;
    worker_processes  1;
    
    error_log  logs/error.log;
    error_log  logs/error.log  notice;
    error_log  logs/error.log  info;
    
    #pid存放路径
    pid        logs/nginx.pid;
    
    events {
        worker_connections  1024;
    }
    
    http {
    
    gzip              on;  
    gzip_min_length   1000;  
    gzip_types        text/plain text/css application/x-javascript;
    #该配置为多个 tomcat 及其下多个项目时配置
    #指定 tomcat 并指定项目
    server {
        #侦听的 80 端口
        listen       80;
        server_name  localhost;
        #设定查看 Nginx 状态的地址
        location /nginxstatus{
             stub_status on;
             access_log on;
             auth_basic "nginxstatus";
             auth_basic_user_file htpasswd;
        }
         #默认路径不能指定路径、配置原始配置
    	 location /{
                root   html;
                index  index.html index.htm;	
    	}    
            #为多个tomcat指定其下的某个项目,Timely50 为访问路径名
            #项目名后面需要加/,表示访问项目根路径
            location /Timely50/{
                 #指定访问路径
                 proxy_pass http://192.168.1.50:8090/Timely4000_01_hrb/;
                 #给访问url赋予正常访问值
                 proxy_set_header Host $host;
                 proxy_set_header X-Real-IP $remote_addr;
                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
            location /Timely52/{
                 proxy_pass http://192.168.1.52:8090/Timely4000/;
                 proxy_set_header Host $host;
                 proxy_set_header X-Real-IP $remote_addr;
                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
            location /Timely53/{
                 proxy_pass http://192.168.1.53:8090/Timely4000/;
                 proxy_set_header Host $host;
                 proxy_set_header X-Real-IP $remote_addr;
                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    
    }
    }
    
    

    3.nginx 原生配置

    #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;
    }
    
    
    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;
    
        server {
            listen       80;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                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$ {
            #    proxy_pass   http://127.0.0.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.conf全解

    千次阅读 2019-12-30 19:22:09
    Nginx配置文件nginx.conf全解 nginx配置文件nginx.conf的配置http、upstream、server、location等; nginx负载均衡算法:轮询、加权轮询、ip_hash、url_hash等策略配置; nginx日志文件access_log配置; 代理服务...

    Nginx配置文件nginx.conf全解

    nginx配置文件nginx.conf的配置http、upstream、server、location等;

    nginx负载均衡算法:轮询、加权轮询、ip_hash、url_hash等策略配置;

    nginx日志文件access_log配置;

    代理服务缓存proxy_buffer设置。

    #user  nobody;   # 用户  用户组  ;一般只有类unix系统有,windows不需要
    worker_processes  1;   # 工作进程,一般配置为cpu核心数的2倍
    
    #  错误日志的配置路径
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    
    # 进程id存放路径
    #pid        logs/nginx.pid;
    
    
    
    
    # 指定进程可以打开的最大描述符的数量
    # 整个系统的最大文件描述符打开数目可以通过命令 ulimit -n  查看
    # 所以一般而言,这个值可以是 ulimit -n 除以nginx进程数
    #  worker_rlimit_nofile 65535;
    
    events {
        # 使用epoll的I/O 模型;epoll 使用于Linux内核2.6版本及以后的系统
        use epoll;
        # 每一个工作进程的最大连接数量; 理论上而言每一台nginx服务器的最大连接数为: worker_processes*worker_connections
        worker_connections  1024;
    
        # 超时时间
        #keepalive_timeout 60
    
        # 客户端请求头部的缓冲区大小,客户端请求一般会小于一页; 可以根据你的系统的分页大小来设定, 命令 getconf PAGESIZE 可以获得当前系统的分页大小(一般4K)
        #client_header_buffer_size 4k;
    
        # 为打开的文件指定缓存,默认是不启用; max指定缓存数量,建议和打开文件数一致;inactive是指经过这个时间后还没有被请求过则清除该文件的缓存。
        #open_file_cache max=65535 inactive=60s;
    
        # 多久会检查一次缓存的有效信息
        #open_file_cache_valid 80s;
    
        # 如果在指定的参数open_file_cache的属性inactive设置的值之内,没有被访问这么多次(open_file_cache_min_uses),则清除缓存
        # 则这里指的是 60s内都没有被访问过一次则清除 的意思
        # open_file_cache_min_uses 1;
    }
    
    
    
    # 设定http服务;可以利用它的反向代理功能提供负载均衡支持
    http {
        #设定mime类型,类型由mime.types文件定义;  可以 cat nginx/conf/mime.types  查看下支持哪些类型
        include       mime.types;
        # 默认mime类型;  application/octet-stream 指的是原始二进制流
        default_type  application/octet-stream;
    
    
    
        # --------------------------------------------------------------------------   #
        # 日志格式设置:
        #   $remote_addr、$http_x_forwarded_for     可以获得客户端ip地址
        #   $remote_user                            可以获得客户端用户名
        #   $time_local                             记录访问的时区以及时间
        #   $request                                请求的url与http协议
        #   $status                                 响应状态成功为200
        #   $body_bytes_sent                        发送给客户端主体内容大小
        #   $http_referer                           记录从哪个页面过来的请求
        #   $http_user_agent                        客户端浏览器信息
        #
        #   注意事项:
        #           通常web服务器(我们的tomcat)放在反向代理(nginx)的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。
        #           反向代理服务器(nginx)在转发请求的http头信息中,可以增加$http_x_forwarded_for信息,记录原有客户端的IP地址和原来客户端的请求的服务器地址。
        # --------------------------------------------------------------------------   #
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        
        #log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';
    
    
        # 日志文件;  【注意:】用了log_format则必须指定access_log来指定日志文件
        #access_log  logs/access.log  main;
        #access_log  logs/access.404.log  log404;
    
    
        # 保存服务器名字的hash表由 server_names_hash_bucket_size、server_names_hash_max_size 控制
        # server_names_hash_bucket_size 128;
    
        # 限制通过nginx上传文件的大小
        #client_max_body_size 300m;
    
    
        # sendfile 指定 nginx 是否调用sendfile 函数(零拷贝 方式)来输出文件;
        # 对于一般常见应用,必须设为on。
        # 如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
        sendfile        on;
    
        # 此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用;TCP_CORK TCP_NODELAY 选项可以是否打开TCP的内格尔算法
        #tcp_nopush     on;
    
    
        #tcp_nodelay on;
    
        # 后端服务器连接的超时时间_发起握手等候响应超时时间
        #proxy_connect_timeout 90; 
    
        # 连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
        #proxy_read_timeout 180;
    
        # 后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
        #proxy_send_timeout 180;
    
    
        # proxy_buffering 这个参数用来控制是否打开后端响应内容的缓冲区,如果这个设置为on,以下的proxy_buffers才生效
        #proxy_buffering on
    
        # 设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,
        # 默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
        #proxy_buffer_size 256k;
    
        # 设置用于读取应答(来自被代理服务器--如tomcat)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k
        #proxy_buffers 4 256k;
    
    
        # 同一时间处理的请求buffer大小;也可以说是一个最大的限制值--控制同时传输到客户端的buffer大小的。
        #proxy_busy_buffers_size 256k;
    
        # 设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
        #proxy_temp_file_write_size 256k;
    
    
        # proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
        #proxy_temp_path /app/tmp/proxy_temp_dir;
    
        # 设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为10GB。
        #proxy_cache_path /app/tmp/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
    
    
        # 如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。
        # 如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
        # 无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误
        #client_body_buffer_size 512k;   # 默认是页大小的两倍
    
        # 表示使nginx阻止HTTP应答代码为400或者更高的应答。可以结合error_page指向特定的错误页面展示错误信息
        #proxy_intercept_errors on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    
    
    
        # 负载均衡 START>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        # upstream 指令定义的节点可以被proxy_pass指令引用;二者结合用来反向代理+负载均衡配置
        # 【内置策略】:轮询、加权轮询、ip_hash、最少连接 默认编译进了nginx
        # 【扩展策略】:fair、通用hash、一致性hash 默认没有编译进nginx
        #-----------------------------------------------------------------------------------------------#
        # 【1】默认是轮询;如果后端服务器down掉,能自动剔除。
        #   upstream bakend {
        #        server 192.168.75.130:8080;
        #        server 192.168.75.132:8080;
        #        server 192.168.75.134:8080;
        #    }
        #
        #【2】权重轮询(加权轮询):这样配置后,如果总共请求了3次,则前面两次请求到130,后面一次请求到132
        #   upstream bakend {
        #        server 192.168.75.130:8080 weight=2;
        #        server 192.168.75.132:8080 weight=1;
        #   }
        #
        #【3】ip_hash:这种配置会使得每个请求按访问者的ip的hash结果分配,这样每个访客固定访问一个后端服务器,这样也可以解决session的问题。
        #   upstream bakend {
        #        ip_hash;
        #        server 192.168.75.130:8080;
        #        server 192.168.75.132:8080;
        #   }
        #
        #【4】最少连接:将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。
        #   upstream bakend {
        #        least_conn;
        #        server 192.168.75.130:8080;
        #        server 192.168.75.132:8080;
        #   }
        #
        #
        #【5】fair策略(需要安装nginx的第三方模块fair):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
        #   upstream bakend {
        #        fair;
        #        server 192.168.75.130:8080;
        #        server 192.168.75.132:8080;
        #   }
        #
        #【6】url_hash策略(也是第三方策略):按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
        #               在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method指定hash算法
        #   upstream bakend {
        #        server 192.168.75.130:8080;
        #        server 192.168.75.132:8080;
        #        hash $request_uri;
        #        hash_method crc32;
        #   }
        #
        #【7】其他设置,主要是设备的状态设置
        #   upstream bakend{
        #       ip_hash;
        #       server 127.0.0.1:9090 down;   # down 表示该机器处于下线状态不可用
        #       server 127.0.0.1:8080 weight=2;
        #       server 127.0.0.1:6060;
        #       
        #       # max_fails 默认为1; 最大请求失败的次数,结合fail_timeout使用;
        #       # 以下配置表示 192.168.0.100:8080在处理请求失败3次后,将在15s内不会受到任何请求了
        #       # fail_timeout 默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它。
        #       server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
        #       server 192.168.0.101:8080 weight=3;
        #       server 192.168.0.102:8080 weight=1;
        #       # 限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。注意:1.5.9之后的版本才有这个配置
        #       server 192.168.0.103:8080 max_conns=1000;
        #       server 127.0.0.1:7070 backup;  # 备份机;其他机器都不可用时,这台机器就上场了
        #       server example.com my_dns_resolve;  # 指定域名解析器;my_dns_resolve需要在http节点配置resolver节点如:resolver 10.0.0.1;
        #   }
        #
        #
        #
        #负载均衡 END<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        #-----------------------------------------------------------------------------------------------#
    
    
        ###配置虚拟机START>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        #
        #server{
        #    listen 80;
        #    配置监听端口
        #    server_name image.***.com;
        #    配置访问域名
        #    location ~* \.(mp3|exe)$ {
        #        对以“mp3或exe”结尾的地址进行负载均衡
        #        proxy_pass http://img_relay$request_uri;
        #        设置被代理服务器的端口或套接字,以及URL
        #        proxy_set_header Host $host;
        #        proxy_set_header X-Real-IP $remote_addr;
        #        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #        以上三行,目的是将代理服务器收到的用户的信息传到真实服务器上
        #    }
        #
        #
        #
        #    location /face {
        #        if ($http_user_agent ~* "xnp") {
        #            rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
        #        }
        #        proxy_pass http://img_relay$request_uri;
        #        proxy_set_header Host $host;
        #        proxy_set_header X-Real-IP $remote_addr;
        #        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #        error_page 404 502 = @fetch;
        #    }
        #
        #    location @fetch {
        #        access_log /data/logs/face.log log404;
        #        rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
        #    }
        #
        #    location /image {
        #        if ($http_user_agent ~* "xnp") {
        #            rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
        #
        #        }
        #        proxy_pass http://img_relay$request_uri;
        #        proxy_set_header Host $host;
        #        proxy_set_header X-Real-IP $remote_addr;
        #        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #        error_page 404 502 = @fetch;
        #    }
        #
        #    location @fetch {
        #        access_log /data/logs/image.log log404;
        #        rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
        #    }
        #}
        #
        #
        #
        ###其他举例
        #
        #server{
        #
        #    listen 80;
        #
        #    server_name *.***.com *.***.cn;
        #
        #    location ~* \.(mp3|exe)$ {
        #        proxy_pass http://img_relay$request_uri;
        #        proxy_set_header Host $host;
        #        proxy_set_header X-Real-IP $remote_addr;
        #        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #    }
        #
        #    location / {
        #        if ($http_user_agent ~* "xnp") {
        #            rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;
        #        }
        #
        #        proxy_pass http://img_relay$request_uri;
        #        proxy_set_header Host $host;
        #        proxy_set_header X-Real-IP $remote_addr;
        #        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #        #error_page 404 http://i1.***img.com/help/noimg.gif;
        #        error_page 404 502 = @fetch;
        #    }
        #
        #    location @fetch {
        #        access_log /data/logs/baijiaqi.log log404;
        #        rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;
        #    }
        #}
        #
        #server{
        #    listen 80;
        #    server_name *.***img.com;
        #
        #    location ~* \.(mp3|exe)$ {
        #        proxy_pass http://img_relay$request_uri;
        #        proxy_set_header Host $host;
        #        proxy_set_header X-Real-IP $remote_addr;
        #        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #    }
        #
        #    location / {
        #        if ($http_user_agent ~* "xnp") {
        #            rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif;
        #        }
        #
        #        proxy_pass http://img_relay$request_uri;
        #        proxy_set_header Host $host;
        #        proxy_set_header X-Real-IP $remote_addr;
        #        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #        #error_page 404 http://i1.***img.com/help/noimg.gif;
        #        error_page 404 = @fetch;
        #    }
        #
        ##access_log off;
        #
        #    location @fetch {
        #        access_log /data/logs/baijiaqi.log log404;
        #        rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;
        #    }
        #}
        #
        #server{
        #    listen 8080;
        #    server_name ngx-ha.***img.com;
        #
        #    location / {
        #        stub_status on;
        #        access_log off;
        #    }
        #}
        #
        #server {
        #    listen 80;
        #    server_name imgsrc1.***.net;
        #    root html;
        #}
        #
        #
        #
        #server {
        #    listen 80;
        #    server_name ***.com w.***.com;
        #    # access_log /usr/local/nginx/logs/access_log main;
        #    location / {
        #        rewrite ^(.*)$ http://www.***.com/ ;
        #    }
        #}
        #
        #server {
        #    listen 80;
        #    server_name *******.com w.*******.com;
        #    # access_log /usr/local/nginx/logs/access_log main;
        #    location / {
        #        rewrite ^(.*)$ http://www.*******.com/;
        #    }
        #}
        #
        #server {
        #    listen 80;
        #    server_name ******.com;
        #
        #    # access_log /usr/local/nginx/logs/access_log main;
        #
        #    location / {
        #        rewrite ^(.*)$ http://www.******.com/;
        #    }
        #
        #    location /NginxStatus {
        #        stub_status on;
        #        access_log on;
        #        auth_basic "NginxStatus";
        #        auth_basic_user_file conf/htpasswd;
        #    }
        #
        #    #设定查看Nginx状态的地址
        #    location ~ /\.ht {
        #        deny all;
        #    }#禁止访问.htxxx文件
        #
        #}
        #配置虚拟机END<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    
        server {
            listen       80;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                #root   html;
                root   /app;
    	    index   zyt505050.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$ {
            #    proxy_pass   http://127.0.0.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.conf详解

    千次阅读 2020-10-09 15:49:31
    第一章 1.1-1.3 NGINX配置文件nginx.conf的详细解释

    NGINX配置文件详解

    1.1: 查找nginx路径
    ps aux |grep  nginx
    

    若配置了nginx的环境变量则可不用查看nginx的路径,直接运行nginx-t查看实际调用的配置文件

    1.2: 使用nginx的 -t 参数校验
    nginx -t
    

    使用nginx的 -t 参数进行配置检查,即可知道实际调用的配置文件路径及是否调用有效。

    1.3: nginx.conf内容详解

    使用cat nginx.conf查看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;           
    
          ##注释开始
    以上为全局块
    worker_processes 工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU
    error_log  存放错误日志文件位置
    pid  pid 进程标识符  /logs/nginx.pid进程标识符文件存放位置 
          ##注释结束
    
    events {
        use epoll;  
        worker_connections  1024;
    }
    
          ##注释开始
    以上为event块"事件块"
    use epoll: epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
    worker_connections:每个工作进程的最大连接数量.根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行,每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为:工作进程数目*每个工作进程最大连接数除以4再除以2  动态资源除以4,静态资源除以2
          ##注释结束
    
    
        ##注释开始
    以下为http块 include为引入文件
    在htpp块server块中配置Nginx三大特性1.反向代理2.负载均衡3.动静分离
        ##注释结束
    http {
        include       mime.types;
        default_type  application/octet-stream;
        
        ##注释开始
    include mime.types 引入大量的媒体类型
    default_type  默认使用的媒体类型
        ##注释结束
    
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
      
        ##注释开始
    log_foemat  日志格式设置
    $remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
    $remote_user:用来记录客户端用户名称;
    $time_local: 用来记录访问时间与时区;
    $request: 用来记录请求的url与http协议;
    $status: 用来记录请求状态;成功是200,
    $body_bytes_sent :记录发送给客户端文件主体内容大小;
    $http_referer:用来记录从那个页面链接访问过来的;
    $http_user_agent:记录客户浏览器的相关信息;
    通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
        ##注释结束
    
    
        #access_log  logs/access.log  main;
        ##注释开始
        用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径;
        ##注释结束
        
        sendfile        on;
        #tcp_nopush     on;
     
        ##注释开始
    sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
    tcp_nopush此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
        ##注释结束
    
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    ##设置kepplived的超时时间
    
        #gzip  on;
        
        server {
            listen       80;    ##配置nginx监听端口 
            server_name  localhost;  ##配置访问域名 nginx接受请求的域名
        
            #charset koi8-r;
        
            #access_log  logs/host.access.log  main;
        
            location / {
                root   html;
                index  index.html index.htm;
            }
            ##注释开始
    将接收到请求根据root下的路径查找资源,默认查找上述路径中的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$ {
            #    proxy_pass   http://127.0.0.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配置文件

    2019-10-20 16:13:49
    Nginx配置文件@TOC 本部分参考了文章 nginx.conf 的结构 { main events : {} http : { main server : { main location : {} } ...
  • 【Nginx】Nginx配置文件详解

    千次阅读 2019-12-27 17:47:17
    Nginx配置文件02. Nginx配置文件详解03. 参考 01. Nginx配置文件 不同的安装方法,可能导致配置文件的路径不一样 我的配置文件如下: # /usr/local/nginx/conf/nginx.conf 02. Nginx配置文件详解 ######Nginx配置...
  • NGINX配置文件

    2021-01-09 23:35:03
    nginx配置文件结构如下 [root@myserver_2 conf]# egrep -v '#|^$' nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-...
  • nginx配置文件详解

    千次阅读 2018-08-08 21:33:18
    1.在nginx目录下编辑中配置文件,生成虚拟主机: 虚拟主机技术主要应用于HTTP(Hypertext Transfer Protocol,超文本传输协议)服务,将台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个...
  • nginx配置文件 通过域名访问

    万次阅读 多人点赞 2018-10-24 16:26:17
    解读Nginx配置文件,通过域名访问tomcat 第一次在linux 服务器上使用nginx 并指向tomcat 目录 通过域名 访问项目。遇到了很多坑,为了让自己更好的学习并吸收知识,特意总结了一下这次的经验。 首先我们需要了解一下...
  • Nginx配置-初始Nginx配置文件

    万次阅读 2018-04-22 21:28:34
    1.配置文件的结构安装完nginx之后,可以安装路径下找到个conf目录,nginx.conf就是个最简单的配置文件。这个文件虽然简单,但是“麻雀虽小,五脏俱全“,那我们就从这里开始吧!#user nobody; worker_processes ...
  • Nginx配置文件详解

    千次阅读 2020-03-08 03:53:15
    Nginx配置文件的整体结构 Nginx是通过配置文件来做到各个功能的实现的。Nginx配置文件的格式非常合乎逻辑,学习这种格式以及如何使用这种每个部分是基础,这将帮助我们有可能手工创建配置文件。 其...
  • 解析Nginx配置文件

    2015-01-08 11:36:07
    Nginx安装完毕后,会产生相应的安装目录,根据前面的安装路径,Nginx的配置文件... Nginx配置文件主要分成四部分:main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)和 location(URL匹配特定位
  • nginx.conf文件第一行一般是设置用户的地方(编译安装nginx时的参数--user=<user>也是指定用户的地方),如 user www www; 如不指定默认是nobody. 这里用户的设置又有什么意义呢?主要是指定执行nginx的...
  • ######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数。 worker_processes 8; #全局错误日志定义类型,[ debug | info | notice |...
  • Nginx指南 - 检验Nginx配置文件语法是否可用 // 使用nginx -t 命令检验配置文件的语法是否可用 nginx -t // 如果语法不可用,nginx会反馈大致的原因以及错误在哪一行。 // 比如错误 nginx: [emerg] invalid...
  • Nginx 配置文件

    2014-03-04 17:50:35
    Nginx个轻量级高性能的web服务器,它是为快速响应大量静态文件请求和高效利用系统资源而设计的。与apache使用面向进程或线程的方式处理请求不同,nginx使用异步事件驱动模型在负载下性能更突出。 虽然nginx能...
  • Nginx配置文件实例及说明

    千次阅读 2017-09-03 15:11:04
    nginx 配置文件nginx.conf
  • Nginx配置文件详细说明

    千次阅读 2013-04-09 13:02:36
    Nginx配置文件详细说明 在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. #运行用户 user www-data;  #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及...
  • Nginx配置文件nginx.conf配置中文详解

    千次阅读 2018-12-27 11:34:56
    nginx.conf配置文件的结构大体可以分为三大模块:全局模块(设置影响Nginx服务器整体运行的指令)、events模块(设置影响Nginx服务器与用户的网络连接指令)、http模块(代理、缓存和日志等大多数功能以及三方模块...
  • Nginx配置文件 nginx.conf详解

    千次阅读 2020-02-07 20:39:24
    Nginx配置文件nginx.conf详解 nginx.conf # 定义Nginx运行的用户和用户组 # user nobady nobady; # nginx进程数,建议设置为等于CPU总核心数,默认为1。 worker_processes 8; #全局错误日志定义类型,[ debug | ...
  • nginx配置文件

    2013-07-27 08:52:15
    默认的主要配置文件nginx.conf,主要内容如下 #使用的用户和组 user www www; #指定工作衍生的进程数,一般配置与CPU核数相等或总核数的两倍 worker_processes 8; #相当于 error_log /data2/log/nginx/error.log...
  • Nginx配置文件nginx.conf详细解释(二)

    万次阅读 多人点赞 2020-07-07 13:56:10
    ######Nginx配置文件nginx.conf中文详解#####
  • Nginx配置配置文件详解

    万次阅读 多人点赞 2018-10-24 22:45:23
    配置文件配置文件
  • nginx 配置项优化 开启高效传输模式 fastcgi 调优 gzip 调优 expires 缓存调优 内核参数优化 系统连接数的优化 准备nginx测试环境 nginx安装略 准备测试文件 vim /usr/local/nginx/conf/nginx.conf echo '...
  • Nginx配置文件 rpm -ql nginx //查看所有文件 /etc/logrotate.d/nginx 日志轮转 /etc/nginx/nginx.conf 总配置文件 /etc/nginx/conf.d 子配置文件夹 /etc/nginx/conf.d/default.conf 默认的网站配置...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,528
精华内容 27,411
关键字:

nginx配置文件第一行错误