先推荐两篇文章地址:讲述的很清楚了

关于nginx参数的详解:

负载均衡的一些说明:

前面必须确保nginx能成功安装并启动。

重启后nginx

Windows nginx不在服务中 nginx服务状态_后端服务

 nginx -c /etc/nginx/nginx.conf
 nginx -s reload

开始:

80端口反向代理8080:

(直接替换nginx.conf里的server那段代码注意后面的})然后nginx平滑重启:nginx -s reload   #加载刚刚加入的配置

server {
     listen       80;
    # root   /usr/share/nginx/html;
     server_name  localhost 150.109.65.xx;
     #charset koi8-r;
     #access_log  /var/log/nginx/log/host.access.log  main;
    location / {
           proxy_pass  http://150.109.65.xx:8080/;
           proxy_set_header Host      $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  }
  }

动静分离的配置:

 

 

server {
    listen       80;
    # root   /usr/share/nginx/html;
     server_name  localhost 150.109.65.xx;
     #charset koi8-r;
     #access_log  /var/log/nginx/log/host.access.log  main;
    location / {
           proxy_pass  http://150.109.65.xx:8080/;
           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 ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js|ttf|woff)$ {
           root /usr/local/tomcat7/webapps/;
           expires      3d; 
  }}

负载均衡配置:

   

upstream proxy_master{
       server 150.109.65.23:8081 weight=1;
       server 150.109.65.23:8080 weight=1;
        #ip_hash; 
    }server {
     listen       80;
    # root   /usr/share/nginx/html;
     server_name  localhost 150.109.65.xx;
     #charset koi8-r;
     #access_log  /var/log/nginx/log/host.access.log  main;
    location / {
           proxy_pass  http://proxy_master;
           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 ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js|ttf|woff)$ {
           root /usr/local/tomcat7/webapps/;
           expires      3d; 
  }}

健康状态的检测(只是简单demo):

 

http {
       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  /var/log/nginx/access.log  main;     
       sendfile            on;
      tcp_nopush          on;
      tcp_nodelay         on;
      keepalive_timeout   65;
      types_hash_max_size 2048;
      include             /etc/nginx/mime.types;     default_type        application/octet-stream;
    proxy_connect_timeout 60s;
     proxy_read_timeout 60s;        proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
  
       # Load modular configuration files from the /etc/nginx/conf.d directory.
       # See http://nginx.org/en/docs/ngx_core_module.html#include
       # for more information.
       include /etc/nginx/conf.d/*.conf;
     upstream proxy_master{
        server 150.109.65.xx:8081 weight=1;
        server 150.109.65.xx:8080 weight=1;
       #ip_hash;
     }server {
     listen       80;
    # root   /usr/share/nginx/html;
     server_name  localhost 150.109.65.xx;
     #charset koi8-r;
     #access_log  /var/log/nginx/log/host.access.log  main;
    location / {
           proxy_pass  http://proxy_master;
           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 ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js|ttf|woff)$ {
           root /usr/local/tomcat7/webapps/;
           expires      3d; 
  }}

标红代码块也可写在 location / {}中

 

 

 

问题说明:可以这里面看日志文件

Windows nginx不在服务中 nginx服务状态_服务器_02

里面还有个error.log。一般404 之类的路径错误就能看到并解决。

 

一些参数说明 

动静分离配置:

 

在server内配置这个 防止直接访问web-inf下的静态文件     

location ~ ^/(WEB-INF)/ {
      deny all;  
     }

 

#expires定义用户浏览器缓存的时间为7天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力

 

开启gzip压缩来提高速度


gzip  on;  #开启gzip

gzip_min_length 1k;  #低于1kb的资源不压缩

gzip_comp_level 3; #压缩级别【1-9】,越大压缩率越高,同时消耗cpu资源也越多,建议设置在4左右。

gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;  #需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片,下面会讲为什么。

gzip_disable "MSIE [1-6]\.";  #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)

gzip_vary on;  #是否添加“Vary: Accept-Encoding”响应头

 

Windows nginx不在服务中 nginx服务状态_服务器_03

 

 

gzip虽然好用,但是一下类型的资源不建议启用。

 

1、图片类型

原因:图片如jpg、png本身就会有压缩,所以就算开启gzip后,压缩前和压缩后大小没有多大区别,所以开启了反而会白白的浪费资源。(Tips:可以试试将一张jpg图片压缩为zip,观察大小并没有多大的变化。虽然zip和gzip算法不一样,但是可以看出压缩图片的价值并不大)

 

2、大文件

原因:会消耗大量的cpu资源,且不一定有明显的效果。

 

负载均衡说明

upstream按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能 自动剔除。虽然这种方式简便、成本低廉。但缺点是:可靠性低和负载分配不均衡。适用于图片服务器集群和纯静态页面服务器集群

 

除此之外,upstream还有其它的分配策略,分别如下:

    weight(权重)

    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。如下所示,10.0.0.88的访问比率要比10.0.0.77的访问比率高一倍。

upstream linuxidc{
       server 10.0.0.77 weight=5;
       server 10.0.0.88 weight=10;
 }

    ip_hash(访问ip)

    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream favresin{
       ip_hash;
       server 10.0.0.10:8080;
       server 10.0.0.11:8080;
 }

    fair(第三方)

    按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。

upstream favresin{     
       server 10.0.0.10:8080;
       server 10.0.0.11:8080;
       fair;
 }

url_hash(第三方)

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

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

upstream resinserver{
       server 10.0.0.10:7777;
       server 10.0.0.11:8888;
       hash $request_uri;
       hash_method crc32;
 }

upstream还可以为每个设备设置状态值,这些状态值的含义分别如下:

down 表示单前的server暂时不参与负载.

weight 默认为1.weight越大,负载的权重就越大。

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

fail_timeout : max_fails次失败后,暂停的时间。

backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

upstream bakend{ #定义负载均衡设备的Ip及设备状态

ip_hash;
       server 10.0.0.11:9090 down;
       server 10.0.0.11:8080 weight=2;
       server 10.0.0.11:6060;
       server 10.0.0.11:7070 backup;
 }

服务器健康状态检测

这个讲的比较详细:

服务器健康状态的检查主要有nginx自带的两个模块ngx_http_proxy_module 模块和ngx_http_upstream_module模块,阿里的一个nginx_upstream_check_module模块。

 

 这里列出这两个模块中相关的指令:
ngx_http_proxy_module 模块中的 proxy_connect_timeout 指令、proxy_read_timeout指令和proxy_next_upstream指令

语法: proxy_connect_timeout time;
 默认值:    proxy_connect_timeout 60s;
 上下文:    http, server, location

设置与后端服务器建立连接的超时时间。应该注意这个超时一般不可能大于75秒。

语法: proxy_read_timeout time;
 默认值:    proxy_read_timeout 60s;
 上下文:    http, server, location

定义从后端服务器读取响应的超时。此超时是指相邻两次读操作之间的最长时间间隔,而不是整个响应传输完成的最长时间。如果后端服务器在超时时间段内没有传输任何数据,连接将被关闭。

语法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 |http_404 | off ...;
 默认值:    proxy_next_upstream error timeout;
 上下文:    http, server, location

 

指定在何种情况下一个失败的请求应该被发送到下一台后端服务器:

error      # 和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现错误
 timeout    # 和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现超时
 invalid_header  # 后端服务器返回空响应或者非法响应头
 http_500   # 后端服务器返回的响应状态码为500
 http_502   # 后端服务器返回的响应状态码为502
 http_503   # 后端服务器返回的响应状态码为503
 http_504   # 后端服务器返回的响应状态码为504
 http_404   # 后端服务器返回的响应状态码为404
 off        # 停止将请求发送给下一台后端服务器

 

 

需要理解一点的是,只有在没有向客户端发送任何数据以前,将请求转给下一台后端服务器才是可行的。也就是说,如果在传输响应到客户端时出现错误或者超时,这类错误是不可能恢复的。

范例如下:

http {
 proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
 }


ngx_http_upstream_module模块中的server指令

语法: server address [parameters];
 默认值:    —
 上下文:    upstream

范例如下:

upstream name {
                 server 10.1.1.110:8080 max_fails=1 fail_timeout=10s;
                 server 10.1.1.122:8080 max_fails=1 fail_timeout=10s;
         }

 

负载的配置参数详解

 

nginx:    192.168.4.72           #nginx安装的位置及apache位置

apache:  192.168.4.68           #要代理的两台服务器

apache:  192.168.4.69

   1:vim /usr/local/nginx/conf/nginx.conf

 

user nginx nginx;                                   #这里是nginx运行的用户
   worker_processes 1;                            #设置nginx服务的worker子进程,比如设为1(一般设置为nginx所在服务器的核心数):也可以设置成 worker_processes auto;
   error_log logs/error.log;                        #去掉前面的#,记录nginx错误日志,方便检查bug:
   pid logs/nginx.pid;                                 #nginx的pid位置
events {
#每个进程允许的最多连接数,
 }

#服务器的最大连接数=最多连接数*进程数(单台nginx的负载量大概是5w,实际生成环境下2-3w。多了搭建集群)

 

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;                      #日志存放位置

 

#这里很关键,很多小伙伴问我 “负载均衡乍配置,为啥我配置的不能访问呢“,这里的upstream就是配置负载均衡的,当然得两台以上才叫负载,我这里的ip69和68都是

#用的apache,   也许你们的是tomcat, 没关系,按这样配置一样可以,

 

#这里很关键,很多小伙伴问我 “负载均衡乍配置,为啥我配置的不能访问呢“,这里的upstream就是配置负载均衡的,当然得两台以上才叫负载,我这里的ip69和68都是

#原博主用的apache,   我用的是tomcat,按这样配置都可以,

 

upstream proxy_test {
   server 192.168.4.69:80 weight=2;     #如果你要测试,把这里换成你自己要代理后端的ip
   server 192.168.4.68:80 weight=1;     #weight是权重 按服务器性能设置 这样设置大概三次请求两次会被分配到69 一次68
 每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每访客会固定访问一个后端服务器,可以解决session一致问题。
 }
 
这是server段的配置
 
server {
    listen       80;   #监听的端口 一般都为http端口
    server_name  www.test.com;    #配置域名或者ip,当服务器域名有多个时,用空格隔开:例如 server_name www.test.com  test.com;在浏览器以这个域名访问时会进入这个server 匹配不到时会进入第一个server (第一个往往return 404)
    charset utf8;
 
    location / {
        proxy_pass       http://proxy_test;               #这里proxy_test是上面的负载的名称,映射到代理服务器,可以是ip加端口,   或url  如果是简单的配置反向代理 不负载  就可以直接配个http://192.168.4.69:80就行了
        proxy_set_header Host      $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
   }
}

 

保存退出!

 

nginx平滑重启:nginx -s reload   #加载刚刚加入的配置

 

 后端服务器开启,在192.168.4.69和68的网页文件位置添加测试文件test.html, 内容69上: this is test 69,     68上:this is test 68,这样方便查看访问到哪台了。

      在本地配置好host,在\Windows\System32\drivers\etc\hosts              用记事本打开,在最后一行加入:192.168.4.72 www.test.com

     然后使用cmd,ping www.test.com   是否能ping通这个192.168.4.72地址,如果ok,则继续

打开浏览器用www.test.com去访问后端服务器的文件,

如: www.test.com/test.html,

    浏览器打开显示有this...说明配置ok了。

然后F5刷新一下,如果是68和69不停的切换,说明负载ok了。

 

xss预防

add_header X-Frame-Options "SAMEORIGIN";

add_header X-XSS-Protection "1; mode=block";

add_header X-Content-Type-Options "nosniff";

iis、apache、nginx使用X-Frame-Options防止网页被Frame的解决方法

 

修改web服务器配置,添加X-frame-options响应头。赋值有如下三种:

(1)DENY:不能被嵌入到任何iframe或frame中。
(2)SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中。
(3)ALLOW-FROM uri:只能被嵌入到指定域名的框架中。

也可在代码中加入,在PHP中加入:

header('X-Frame-Options: deny');

 X-XSS-Protection 的字段有三个可选配置值

0: 表示关闭浏览器的XSS防护机制

1:删除检测到的恶意代码, 如果响应报文中没有看到X-XSS-Protection 字段,那么浏览器就认为X-XSS-Protection配置为1,这是浏览器的默认设置

1; mode=block:如果检测到恶意代码,在不渲染恶意代码

如果在你的业务场景中,你认为你的程序或系统是不会有XSS漏洞的, 或者是无法承担XSS filter/auditor 特性引发的BUG,那你就选择配置成前者;否则,你还是选择配置成后者吧。 反正,老司机给你一句忠告就是,千万别配置成XSS-Protection: 1

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }

//log_not_found on|off,默认为on:启用或禁用404错误日志,这个指令可以用来禁止nginx记录找不到rebots.txt或favicon.ico这类文件的错误信息。