线上nginx配置记录

nginx 专栏收录该内容
1 篇文章 0 订阅

nginx下载安装

nginx下载官网 http://nginx.org/en/download.html
根据需要下载windows或者linux版本的nginx
在这里插入图片描述
当然也可以在linux服务器上使用wget命令下载nginx压缩包,下载完成一般是tar.gz格式的包,使用tar命令解压下,解压完成进入到解压后的nginx文件根目录运行配置和安装命令即可.

root@w tools]# wget -q http://nginx.org/download/nginx-1.6.3.tar.gz
[root@w tools]# tar xf nginx-1.6.3.tar.gz 
[root@w tools]# cd nginx-1.6.3
[root@w nginx-1.6.3]#./configure 
[root@w nginx-1.6.3]# make
[root@w nginx-1.6.3]# make install

注意:nginx的安装和启动,最好以ngx_http_ssl_module 的形式配置安装,这样以后再添加https的时候改下配置就可以,不用再重新配置安装了. 如果没有以ngx_http_ssl_module的方式配置,那么后来再次添加https,重启nginx的时候就会报出如下错误:

nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf

所以在配置./configure的时候就直接添加上这个参数:

[root@w nginx-1.6.3]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
[root@w nginx-1.6.3]# make

nginx目录介绍

[root@w ~]# tree ./nginx
 |-- client_body_temp
 |-- conf                        #这是Nginx所有配置文件的目录,极其重要
 |   |-- fastcgi.conf                    #fastcgi相关参数的配置文件
 |   |-- fastcgi.conf.default                 #fastcgi.conf的原始备份
 |   |-- fastcgi_params                   #fastcgi的参数文件
 |   |-- fastcgi_params.default
 |   |-- koi-utf
 |   |-- koi-win
 |   |-- mime.types                      #媒体类型,
 |   |-- mime.types.default
 |   |-- nginx.conf                      #这是Nginx默认的主配置文件
 |   |-- nginx.conf.default
 |   |-- scgi_params                     #scgi相关参数文件,一般用不到
 |   |-- scgi_params.default
 |   |-- uwsgi_params                       #uwsgi相关参数文件,一般用不到
 |   |-- uwsgi_params.default
 |   -- win-utf
 |-- fastcgi_temp                       #fastcgi临时数据目录
 |-- html      #这是编译安装时Nginx的默认站点目录,类似Apache的默认站点htdocs目录
 |   |--50x.html     #     错误页面优雅替代显示文件,例如:出现502错误时会调用此页面
          #     error_page   500502503504  /50x.html;
 |    -- index.html   # 默认的首页文件,首页文件名字是在nginx.conf中事先定义好的。
 |-- logs          #这是Nginx默认的日志路径,包括错误日志及访问日志
 |   |-- access.log      # 这是Nginx的默认访问日志文件,使用tail -f access.log,可以实时观看网站用户访问情况信息
 |   |-- error.log    # 这是Nginx的错误日志文件,如果Nginx出现启动故障等问题,一定要看看这个错误日志
 |   -- nginx.pid    # Nginx的pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
 |-- proxy_temp       #临时目录
 |-- sbin      #这是Nginx命令的目录,如Nginx的启动命令nginx
 |   -- nginx      #Nginx的启动命令nginx
 |-- scgi_temp      #临时目录
  -- uwsgi_temp      #临时目录

1.检查是否配置Nginx账号锁定策略

1.执行系统命令passwd -S nginx来查看锁定状态
出现Password locked证明锁定成功
如:nginx LK … (Password locked.)或nginx L …
2.默认符合,修改后才有(默认已符合)
3.执行系统命令passwd -l nginx进行锁定
加固建议:
配置Nginx账号登录锁定策略: Nginx服务建议使用非root用户(如nginx,nobody)启动,并且确保启动用户的状态为锁定状态。可执行passwd -l <Nginx启动用户> 如passwd -l nginx 来锁定Nginx服务的启动用户。命令 passwd -S <用户> 如passwd -S nginx可查看用户状态。 修改配置文件中的nginx启动用户修改为nginx或nobody 如: user nobody;

2. 检查Nginx进程启动账号

Nginx进程启动账号状态,降低被攻击概率
建议:修改Nginx进程启动账号:
1、打开conf/nginx.conf配置文件;
2、查看配置文件的user配置项,确认是非root启动的;
3、如果是root启动,修改成nobody或者nginx账号; 备注:
4、修改完配置文件之后需要重新启动Nginx。

3. Nginx后端服务指定的Header隐藏状态 | 服务配置

隐藏Nginx后端服务X-Powered-By头
加固建议
隐藏Nginx后端服务指定Header的状态: 1、打开conf/nginx.conf配置文件; 2、在http下配置proxy_hide_header项; 增加或修改为 proxy_hide_header X-Powered-By; proxy_hide_header Server;

4. Nginx的WEB访问日志记录状态 | 服务配置

Nginx后端服务指定的Header隐藏状态
建议:开启Nginx的WEB访问日志记录:
1、打开conf/nginx.conf配置文件;
2、在http下配置access_log项
access_log logs/host.access.log main;
3、 并删除off项

5. 针对Nginx SSL协议进行安全加固 | 服务配置

Nginx SSL协议的加密策略进行加固
建议:
Nginx SSL协议采用TLSv1.2:
1、打开conf/nginx.cconf配置文件;
2、配置
server {

ssl_protocols TLSv1.2;

}
备注:配置此项请确认nginx支持OpenSSL,运行nginxv -V 如果返回中包含built with OpenSSL则表示支持OpenSSL。如果不支持,请重新编译nginx

6. 隐藏Nginx服务的Banner | 服务配置

描述
Nginx服务的Banner隐藏状态
建议:Nginx后端服务指定的Header隐藏状态隐藏Nginx服务Banner的状态:
1、打开conf/nginx.conf配置文件;
2、在server栏目下,配置server_tokens项 server_tokens off;

7. 确保NGINX配置文件权限为644 | 文件权限

把控配置文件权限以抵御外来攻击
建议:修改Nginx配置文件权限: 执行chmod 644 <conf_path>来限制Nginx配置文件的权限;(<conf_path>为配置文件的路径,如默认/安装目录/conf/nginx.conf或者/etc/nginx/nginx.conf,或用户自定义,请 自行查找)

8.nginx增加单独配置文件

nginx默认的配置文件时nginx.config.,我们会在在nginx中增加自己单独的的配置文件.在nginx.conf文件中http模块最后一行增加include 内容,如下:

#user nobody;
user root;
worker_processes auto;
worker_rlimit_nofile 65535;
events {
    worker_connections 65535;
}
http {
	server
   	 {
      .......
   	 }
    include /etc/nginx/myConf/*.conf;
}

9.linux中nginx环境配置https

nginx对于https的配置主要是证书的配置
1.申请/生成/购买证书(根据大家需求定)
2.下载 SSL Key 和 CSR 文件,在服务器上新建目录存储这两个文件,我这边用的是阿里的,在阿里证书管理中可以下载.
在这里插入图片描述
3.配置nginx.conf,以下只展示了最重要的部分.

#user nobody;
events {
  ......
}

http {
    #http
    server
    {
     ....
    }
    #https
    server
    {
    	#ssl参数
        listen 443 ssl default_server;
        server_name _;
        #证书文件
        ssl_certificate      /etc/nginx/cert/appreal.crt;
        #私钥文件
        ssl_certificate_key  /etc/nginx/cert/appreal.key;
        ....
        return 500;
    }
}

4.配置完成后需要测试下nginx,加载配置文件,重启nginx

nginx -t   //测试nginx配置是否正常
nginx -s reload   //重启nginx服务

5.nginx中配置https需要以ngx_http_ssl_module 的形式启动nginx,所以最好在安装启动的时候就以这种模式安装,否则还要重新搞一遍.

10.linux中nginx配置websocket

// 1. 如果 $http_upgrade不为''(),则 $connection_upgrade 为 upgrade ,为 '' (),则为close
map $http_upgrade $connection_upgrade { 
	default upgrade; 
	'' close; 
} 

//nginx负载均衡,负载两台服务器及各自ip和端口 
//2. keepalive 1000 表示的是每个nginx进程中上游服务器保持的空闲连接,当空闲连接过多时,会关闭最少使用的空闲连接.当然,这不是限制连接总数的,可以想象成空闲连接池的大小.设置的值应该是上游服务器能够承受的
upstream wsbackend{ 
	server ip1:port1; 
	server ip2:port2; 
	keepalive 1000; 
} 
 
//监听的服务器的具体配置  
server { 
	listen 20038;    //nginx 监听的端口
	location /{      / 表示监听的路径(/表示所有路径,通用匹配,相当于default)
		proxy_http_version 1.1; //表示反向代理发送的HTTP协议的版本是1.1,HTTP1.1支持长连接
		proxy_pass http://wsbackend;  //表示反向代理的uri,这里可以使用负载均衡变量 
		proxy_redirect off; //表示不要替换路径,其实这里如果是/则有没有都没关系,因为default也是将路径替换到proxy_pass的后边 
		proxy_set_header Host $host; //表示传递时请求头不变, $host是nginx内置变量,表示的是当前的请求头,proxy_set_header表示设置请求头
		proxy_set_header X-Real-IP $remote_addr; //表示传递时来源的ip还是现在的客户端的ip 
		proxy_read_timeout 3600s; //表的两次请求之间的间隔超过 3600s 后才关闭这个连接,默认的60s.自动关闭的元凶 
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; //表示X-Forwarded-For头不发生改变 
		proxy_set_header Upgrade $http_upgrade; //表示设置Upgrade不变
		proxy_set_header Connection $connection_upgrade; //表示如果 $http_upgrade为upgrade,则请求为upgrade(websocket),如果不是,就关闭连接
	} 
}

在使用的时候如果用到文件上传下载,有可能会遇到连接请求超时错误,这个时候需要配置nginx下边几个参数

  proxy_connect_timeout 1200s;
  proxy_send_timeout 1200s;
  proxy_read_timeout 1200s;

11.nginx访问日志access_log

Nginx会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户的浏览行为等,此功能由ngx_http_log_module模块负责,对应的日志文件是access_log
配置完成后访问的信息会在这个文件中打印出来.示例如下:

 - 127.0.0.1 -- [10/Apr/2020:10:29:08 +0800] GET /myinterface/goods?start=0&limit=10&_dc=1586485747735 HTTP/1.1 "200" 933 "http://localhost:8888/home/home.html""Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" D:/admin-dashboard/myinterface/goods

我们从上日志可以看出,用户通过myinterface/goods接口访问nginx,访问的时间,访问请求的格式等一些相关信息,这些信息都可以进行配置,主要配置参数有两个:access_log文件的路径和access.log日志的输出格式

  • access_log 日志文件路径
    配置在server下
  • log_format 日志输出的格式
    定义语法: log_format 英文名字 ……;

示例:我在nginx的配置文件中增加如下内容,

#定义的日志输出格式
log_format myaccessLogFormat '$http_x_forwarded_for $remote_addr -$remote_user [$time_local] $request '
                          '"$status" $body_bytes_sent "$http_referer"'
                          '"$http_user_agent" ' "$request_filename";
server {
    .......
   
    location ~* \.(.*)$ {
       ...........
    }
    
    #我自己的日志路径是D:/nginx/logs/access.log,输出格式是myaccessLogFormat 
    access_log   D:/nginx/logs/access.log   myaccessLogFormat ;   
}

上述的myaccessLogFormat 中有一些变量,如$http_x_forwarded_for 是nginx里边的已经存在的变量,可以直接用.下边是nginx支持的所有内置变量:(内置变量存放在 ngx_http_core_module 模块中,下边的变量我们根据需要配置上去即可)

  1. $arg_name:请求中的的参数名,即“?”后面的arg_name=arg_value形式的arg_name
  2. $args:请求中的参数值
  3. $binary_remote_addr:客户端地址的二进制形式, 固定长度为4个字节
  4. $body_bytes_sent:传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的“%B”参数保持兼容
  5. $bytes_sent:传输给客户端的字节数 (1.3.8, 1.2.5)
  6. $connection:TCP连接的序列号 (1.3.8, 1.2.5)
  7. $connection_requests:TCP连接当前的请求数量 (1.3.8, 1.2.5)
  8. $content_length:“Content-Length” 请求头字段
  9. $content_type:“Content-Type” 请求头字段
  10. $cookie_name:cookie名称
  11. $document_root:当前请求的文档根目录或别名
  12. $document_uri:同 $uri
  13. $host:优先级如下:HTTP请求行的主机名>”HOST”请求头字段>符合请求的服务器名
  14. $hostname:主机名
  15. h t t p n a m e : 匹 配 任 意 请 求 头 字 段 ; 变 量 名 中 的 后 半 部 分 “ n a m e ” 可 以 替 换 成 任 意 请 求 头 字 段 , 如 在 配 置 文 件 中 需 要 获 取 h t t p 请 求 头 : “ A c c e p t − L a n g u a g e ” , 那 么 将 “ - ” 替 换 为 下 划 线 , 大 写 字 母 替 换 为 小 写 , 形 如 : http_name:匹配任意请求头字段; 变量名中的后半部分“name”可以替换成任意请求头字段,如在配置文件中需要获取http请求头:“Accept-Language”,那么将“-”替换为下划线,大写字母替换为小写,形如: httpnamenamehttpAcceptLanguage线http_accept_language即可。
  16. $https:如果开启了SSL安全模式,值为“on”,否则为空字符串。
  17. $is_args:如果请求中有参数,值为“?”,否则为空字符串。
  18. $limit_rate:用于设置响应的速度限制,详见 limit_rate。
  19. $msec:当前的Unix时间戳 (1.3.9, 1.2.6)
  20. $nginx_version:nginx版本
  21. $pid:工作进程的PID
  22. $pipe:如果请求来自管道通信,值为“p”,否则为“.” (1.3.12, 1.2.7)
  23. $proxy_protocol_addr:获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串。(1.5.12)
  24. $query_string:同 $args
  25. $realpath_root:当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径。
  26. $remote_addr:客户端地址
  27. $remote_port:客户端端口
  28. $remote_user:用于HTTP基础认证服务的用户名
  29. $request:代表客户端的请求地址
  30. $request_body:客户端的请求主体,此变量可在location中使用,将请求主体通过proxy_pass, fastcgi_pass, uwsgi_pass, 和 scgi_pass传递给下一级的代理服务器。
  31. $request_body_file:将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off, uwsgi_pass_request_body off, or scgi_pass_request_body off 。
  32. $request_completion:如果请求成功,值为”OK”,如果请求未完成或者请求不是一个范围请求的最后一部分,则为空。
  33. $request_filename:当前连接请求的文件路径,由root或alias指令与URI请求生成。
  34. $request_length:请求的长度 (包括请求的地址, http请求头和请求主体) (1.3.12, 1.2.7)
  35. $request_method:HTTP请求方法,通常为“GET”或“POST”
  36. $request_time:处理客户端请求使用的时间 (1.3.9, 1.2.6); 从读取客户端的第一个字节开始计时。
  37. $request_uri:这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看- $uri更改或重写URI,不包含主机名,例如:”/cnphp/test.php?arg=freemouse”。
  38. $scheme:请求使用的Web协议, “http” 或 “https”
  39. s e n t h t t p n a m e : 可 以 设 置 任 意 h t t p 响 应 头 字 段 ; 变 量 名 中 的 后 半 部 分 “ n a m e ” 可 以 替 换 成 任 意 响 应 头 字 段 , 如 需 要 设 置 响 应 头 C o n t e n t − l e n g t h , 那 么 将 “ - ” 替 换 为 下 划 线 , 大 写 字 母 替 换 为 小 写 , 形 如 : sent_http_name:可以设置任意http响应头字段; 变量名中的后半部分“name”可以替换成任意响应头字段,如需要设置响应头Content-length,那么将“-”替换为下划线,大写字母替换为小写,形如: senthttpnamehttpnameContentlength线sent_http_content_length 4096即可。
  40. $server_addr:服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中。
  41. $server_name:服务器名,www.cnphp.info
  42. $server_port:服务器端口
  43. $server_protocol:服务器的HTTP版本, 通常为 “HTTP/1.0” 或 “HTTP/1.1”
  44. $status:HTTP响应代码 (1.3.2, 1.2.2)
  45. $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, $tcpinfo_rcv_space:客户端TCP连接的具体信息
  46. $time_iso8601:服务器时间的ISO 8610格式 (1.3.12, 1.2.7)
  47. $time_local:服务器时间(LOG Format 格式) (1.3.12, 1.2.7)
  48. u r i : 请 求 中 的 当 前 U R I ( 不 带 请 求 参 数 , 参 数 位 于 uri:请求中的当前URI(不带请求参数,参数位于 uriURI(args),可以不同于浏览器传递的 r e q u e s t u r i 的 值 , 它 可 以 通 过 内 部 重 定 向 , 或 者 使 用 i n d e x 指 令 进 行 修 改 , request_uri的值,它可以通过内部重定向,或者使用index指令进行修改, requesturi使indexuri不包含主机名,如”/foo/bar.html”。

12.nginx日志access.log过大处理

随着时间的推移,nginx的日志会越来越大,我们需要对这个日志进行优化;

  1. 关闭所有日志的输出
    主要配置参数就是: access_log off; # 关闭日志
  2. 关闭部分访问日志的输出
    比如我们关闭gif|jpg|jpeg|png|bmp|swf|html|htm这些文件访问的日志
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|html|htm)${
    	............
        access_log off;
    }
    
  3. 日志切分
    通过linux脚本订单定时将日志按照日期进行切分并另外存储.
  4. 定时删除日志
    通过linux命令定时删除日志.

13.nginx的其他配置

http {
	    include         mime.types;
	    default_type    application/octet-stream;
	    access_log     off;  # 关闭日志
	    sendfile        on;  # 开启高效文件传输模式
	    tcp_nopush      on;  # 防止网络阻塞
	    tcp_nodelay     on;  # 防止网络阻塞
	    server_tokens   off; # 关闭nginx版本号
	    charset         utf-8; # 默认编码
    
    	server{
    	 ......
    	}
    }

14.nginx配置文件详细介绍

#定义Nginx运行的用户和用户组
user www www;
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /usr/local/nginx/logs/error.log info;
#进程pid文件
pid /usr/local/nginx/logs/nginx.pid;

#指定进程可以打开的最大描述符:数目
#工作模式与连接数上限
#这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
#现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。
#这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
worker_rlimit_nofile 65535;


events
{
    #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
    #是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,如果跑在FreeBSD上面,就用kqueue模型。
    #补充说明:
    #与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。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。
    use epoll;

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

    #keepalive超时时间。
    keepalive_timeout 60;

    #客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
    #分页大小可以用命令getconf PAGESIZE 取得。
    #[root@web001 ~]# getconf PAGESIZE
    #4096
    #但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。
    client_header_buffer_size 4k;

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

    #这个是指多长时间检查一次缓存的有效信息。
    #语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 使用字段:http, server, location 这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息.
    open_file_cache_valid 80s;

    #open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。
    #语法:open_file_cache_min_uses number 默认值:open_file_cache_min_uses 1 使用字段:http, server, location  这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cache中总是打开状态.
    open_file_cache_min_uses 1;
    
    #语法:open_file_cache_errors on | off 默认值:open_file_cache_errors off 使用字段:http, server, location 这个指令指定是否在搜索一个文件是记录cache错误.
    open_file_cache_errors on;
}
 
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http
{
    #文件扩展名与文件类型映射表
    include mime.types;

    #默认文件类型
    default_type application/octet-stream;

    #默认编码
    #charset utf-8;

    #服务器名字的hash表大小
    #保存服务器名字的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的提示,那么首要的是增大前一个参数的大小.
    server_names_hash_bucket_size 128;

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

    #客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取。
    large_client_header_buffers 4 64k;

    #设定通过nginx上传文件的大小
    client_max_body_size 8m;

    #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
    sendfile on;

    #开启目录列表访问,合适下载服务器,默认关闭。
    autoindex on;

    #此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
    tcp_nopush on;
     
    tcp_nodelay on;

    #长连接超时时间,单位是秒
    keepalive_timeout 120;

    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #gzip模块设置
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k;    #最小压缩文件大小
    gzip_buffers 4 16k;    #压缩缓冲区
    gzip_http_version 1.0;    #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_comp_level 2;    #压缩等级
    gzip_types text/plain application/x-javascript text/css application/xml;    #压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
    gzip_vary on;

    #开启限制IP连接数的时候需要使用
    #limit_zone crawler $binary_remote_addr 10m;



    #负载均衡配置
    upstream piao.jd.com {
     
        #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
        server 192.168.80.121:80 weight=3;
        server 192.168.80.122:80 weight=2;
        server 192.168.80.123:80 weight=3;

        #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 www.jd.com jd.com;
        index index.html index.htm index.php;
        root /data/www/jd;

        #对******进行负载均衡
        location ~ .*.(php|php5)?$
        {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
         
        #图片缓存时间设置
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires 10d;
        }
         
        #JS和CSS缓存时间设置
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
         
        #日志格式设定
        #$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地址和原来客户端的请求的服务器地址。
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for';
         
        #定义本虚拟主机的访问日志
        access_log  /usr/local/nginx/logs/host.access.log  main;
        access_log  /usr/local/nginx/logs/host.access.404.log  log404;
         
        #对 "/" 启用反向代理
        location / {
            proxy_pass http://127.0.0.1:88;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
             
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             
            #以下是一些反向代理的配置,可选。
            proxy_set_header Host $host;

            #允许客户端请求的最大单文件字节数
            client_max_body_size 10m;

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

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

            #后端服务器连接的超时时间_发起握手等候响应超时时间
            #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_connect_timeout 90;

            #后端服务器数据回传时间(代理发送超时)
            #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
            proxy_send_timeout 90;

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

            #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            #设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
            proxy_buffer_size 4k;

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

            #高负荷下缓冲大小(proxy_buffers*2)
            proxy_busy_buffers_size 64k;

            #设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
            #设定缓存文件夹大小,大于这个值,将从upstream服务器传
            proxy_temp_file_write_size 64k;
        }
         
         
        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file confpasswd;
            #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
        }
         
        #本地动静分离反向代理配置
        #所有jsp的页面均交由tomcat或resin处理
        location ~ .(jsp|jspx|do)?$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8080;
        }
         
        #所有静态文件由nginx直接读取不经过tomcat或resin
        location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|
        pdf|xls|mp3|wma)$
        {
            expires 15d; 
        }
         
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
    }
}

15.nginx代理及负载均衡

upstream platform{
    #负载均衡策略:weight/ip_hash/least_conn/fair/url_hash
    ip_hash;
    #负载的服务器IP及端口
    server 192.168.1:8888 max_fails=3 fail_timeout=3s;
    server 192.168.2:8888 max_fails=3 fail_timeout=3s;
    server 192.168.3:8888 max_fails=3 fail_timeout=3s;
}

server{
    listen  80;
    server_name   访问的域名/ip;

    location / {
        if ($request_uri = /) {
            rewrite ^(.*)$ ../index.html permanent;
        }
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-Server $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header token $http_token;
        proxy_set_header Host $host;
        proxy_pass http://platform;
    }

注意:如果使用proxy,需要在nginx.conf中配置如下两行代码:
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;

16.启动nginx报错could not build optimal proxy_headers_hash

could not build optimal proxy_headers_hash, you should increase either proxy_headers_hash_max_s            ize: 512 or proxy_headers_hash_bucket_size: 64; ignoring proxy_headers_hash_bucket_size
nginx: [warn] could not build optimal proxy_headers_hash, you should increase either proxy_headers_hash_max_s            ize: 512 or proxy_headers_hash_bucket_size: 64; ignoring proxy_headers_hash_bucket_size
nginx: [warn] could not build optimal proxy_headers_hash, you should increase either proxy_headers_hash_max_s            ize: 512 or proxy_headers_hash_bucket_size: 64; ignoring proxy_headers_hash_bucket_size
nginx: [warn] could not build optimal proxy_headers_hash, you should increase either proxy_headers_hash_max_s            ize: 512 or proxy_headers_hash_bucket_size: 64; ignoring proxy_headers_hash_bucket_size
nginx: [warn] could not build optimal proxy_headers_hash, you should increase either proxy_headers_hash_max_s            ize: 512 or proxy_headers_hash_bucket_size: 64; ignoring proxy_headers_hash_bucket_size
nginx: [warn] could not build optimal proxy_headers_hash, you should increase either proxy_headers_hash_max_s            ize: 512 or proxy_headers_hash_bucket_size: 64; ignoring proxy_headers_hash_bucket_size
nginx: [warn] could not build optimal proxy_headers_hash, you should increase either proxy_headers_hash_max_s            ize: 512 or proxy_headers_hash_bucket_size: 64; ignoring proxy_headers_hash_bucket_size

解决方式: 修改nginx.conf,http模块添加proxy_headers_hash_max_size 和proxy_headers_hash_bucket_size 配置信息

http {
    include       mime.types;
    
	proxy_headers_hash_max_size 51200;
	proxy_headers_hash_bucket_size 6400;
	.........................

17.启动nginx报错unknown “connection_upgrade” variable

解决方式:修改nginx.conf,在http模块中添加connection_upgrade 信息

http {
    include       mime.types;
    
	map $http_upgrade $connection_upgrade { 
		default upgrade; 
		'' close; 
	}
....................

18.[emerg]: could not build the proxy_headers_hash, you should increase either

[emerg]: could not build the proxy_headers_hash, you should increase either proxy_headers_hash_max_size: 512 or proxy_headers_hash_bucket_size: 640

修改nginx.conf,在http段中加如下面2行,然后nginx -t测试下:

http{

proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;

}

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值