Chinaunix首页 | 论坛 | 博客
  • 博客访问: 76103
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 210
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-11 17:52
个人简介

黑夜给了我黑色的眼睛我却用它来寻找光明。

文章分类

全部博文(21)

文章存档

2015年(21)

我的朋友

分类: 系统运维

2015-03-07 15:00:47

 nginx服务器不支持中文路径,会提示找不到路径错误。如果正确启动nginx,你的任务管理器中会有两个名为nginx的守护进程,


 

确保启动后,进行如下配置:

1.找到nginx的解压目录,我这边是c: \ginx,打开conf目录下的nginx.conf,具体配置代码如下:

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

 

    upstream linuxidc.com {

         server 192.168.1.98;    #真实服务器A(sxlinuxidc-PC)

         server 192.168.1.99;    #真实服务器B(hzdk-vpc)

         }

 

    server {    #Nginx代理服务器

        listen       8088;

        server_name  localhost;

        location / {

            root   html;

            index  index.html index.htm;

        proxy_pass 

        proxy_redirect  default;

        }

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

    }

}

1.由于配置文件已被改动,所以要重启nginx服务,你可以在任务管理器中先结束两个nginx进程,再启动nginx;也可以在命令行中执行nginx -s reload。

2.我们把实现准备好的一个测试网站分别部署到主机A和主机B的IIS中,其访问地址分别为:192.168.1.98和192.168.1.99,我们来分别访问他们,得到的页面分别为:


 

3.最后我们再来访问一下我们的nginx代理服务器,看看他能不能让我们访问到真实的服务器A和B,访问结果是每刷新一次就在A和B之间切换,好像我们在轮次访问A和B一样,但我们表面上都是访问的代理服务器127.0.0.1:8088,以下是截图:


 

 

刷新一次后:


 

这样我们就用一个虚拟的ip地址127.0.0.1:8088来动态访问真实服务器A和B,由于是轮次访问,所以减轻了服务器A和B的负担,起到了简单的负载均衡的作用,提高你应用的性能。

 

nginx配置文件说明

nginx配置文件路径conf/nginx.conf

配置详细说明如下:

----------------------------------------------------------------------------------

运行用户

user www-data;   

#配置启动进程个数,通常设置成和cpu的数量相等

worker_processes  1;

#全局错误日志及PID文件

error_log  /var/log/nginx/error.log;

pid       /var/run/nginx.pid;

#工作模式及连接数上限

events {

    #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能

use   epoll;            

    worker_connections  1024;       #单个后台worker process进程的最大并发链接数

    # multi_accept on;

}

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

http {

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

    include       /etc/nginx/mime.types;

    default_type  application/octet-stream;

    #设定日志格式

    access_log    /var/log/nginx/access.log;

    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,

    #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.

    sendfile        on;

    #tcp_nopush     on;

    #连接超时时间

    #keepalive_timeout  0;

    keepalive_timeout  65;

    tcp_nodelay        on;

    #开启gzip压缩

    gzip  on;

    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    #设定请求缓冲

    client_header_buffer_size    1k;

    large_client_header_buffers  4 4k;

    include /etc/nginx/conf.d/*.conf;

    include /etc/nginx/sites-enabled/*;

    #设定负载均衡的服务器列表

    upstream mysvr {

    #weigth参数表示权值,权值越高被分配到的几率越大

    #本机上的Squid开启3128端口

    server 192.168.8.1:3128 weight=5;

    server 192.168.8.2:80  weight=1;

    server 192.168.8.3:80  weight=6;

    }

   server {

    #侦听80端口

        listen       80;

        #定义使用访问

        server_name  ;

        #设定本虚拟主机的访问日志

        access_log  logs/.access.log  main;

    #默认请求

location / {

root   /root;      #定义服务器的默认网站根目录位置

         index index.php index.html index.htm;   #定义首页索引文件的名称

         fastcgi_pass  ;

         fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;

         include /etc/nginx/fastcgi_params;

        }

    # 定义错误提示页面

    error_page   500 502 503 504 /50x.html;

        location = /50x.html {

        root   /root;

    }

    #静态文件,nginx自己处理

    location ~ ^/(images|javascript|js|css|flash|media|static)/ {

        root /var/www/virtual/htdocs;

        #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。

        expires 30d;

    }

    #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.

    location ~ \.php$ {

        root /root;

        fastcgi_pass 127.0.0.1:9000;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;

        include fastcgi_params;

    }

    #设定查看Nginx状态的地址

    location /NginxStatus {

        stub_status          on;

        access_log           on;

        auth_basic           "NginxStatus";

        auth_basic_user_file  conf/htpasswd;

    }

    #禁止访问 .htxxx 文件

    location ~ /\.ht {

        deny all;

    }

    

     }

}

----------------------------------------------------------------------------------

以上是一些基本的配置,使用Nginx最大的好处就是负载均衡

 

==================================================================

如果要使用负载均衡的话,可以修改配置http节点如下:

----------------------------------------------------------------------------------

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

http {

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

    include       /etc/nginx/mime.types;

    default_type  application/octet-stream;

    #设定日志格式

    access_log    /var/log/nginx/access.log;

    #省略上文有的一些配置节点

    #。。。。。。。。。。

    #设定负载均衡的服务器列表

    upstream mysvr {

    #weigth参数表示权值,权值越高被分配到的几率越大

    server 192.168.8.1x:3128 weight=5;#本机上的Squid开启3128端口

    server 192.168.8.2x:80  weight=1;

    server 192.168.8.3x:80  weight=6;

    }

   upstream mysvr2 {

    #weigth参数表示权值,权值越高被分配到的几率越大

    server 192.168.8.x:80  weight=1;

    server 192.168.8.x:80  weight=6;

    }

   #第一个虚拟服务器

   server {

         #侦听192.168.8.x的80端口

        listen       80;

         server_name  192.168.8.x;

         #对aspx后缀的进行负载均衡请求

         location ~ .*\.aspx$ {

         root   /root;      #定义服务器的默认网站根目录位置

         index index.php index.html index.htm;   #定义首页索引文件的名称

         proxy_pass  ;#请求转向mysvr 定义的服务器列表,

注意mysvr可以是IP地址也可以是域名,但不带端口,有些程序会获取server_name,生成链接。这种情况是程序问题。

         

#以下是一些反向代理的配置,默认是没有的

         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;

#这三个设置用于解决客户端getServerName或者#getRequestUrl获取不到IP地址

        

client_max_body_size 10m;            #允许客户端能够上传的最大文件,默认只有1M

 

         client_body_buffer_size 128k;    #缓冲区代理缓冲用户端请求的最大字节数,

         proxy_connect_timeout 90;        #nginx跟后端服务器连接超时时间(代理连接超时)

         proxy_send_timeout 90;               #后端服务器数据回传时间(代理发送超时)

         proxy_read_timeout 90;            #连接成功后,后端服务器响应时间(代理接收超时)

         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服务器传

       }

     }

}

 

squid,nginx,lighttpd区别

反向代理从传输上分可以分为2种:

1:同步模式(apache-mod_proxy和squid)

2:异步模式(lighttpd 和 nginx)

 

在nginx的文档说明中,提到了异步传输模式并提到它可以减少后端连接数和压力,这是为何?

下面就来讲解下传统的代理(apache/squid)的同步传输和lighttpd,nginx的异步传输的差异。


同步传输:浏览器发起请求,而后请求会立刻被转到后台,于是在浏览器和后台之间就建立了一个通道。在请求发起直到请求完成,这条通道都是一直存在的。
异步传输:浏览器发起请求,请求不会立刻转到后台,而是将请求数据(header)先收到nginx上,然后nginx再把这个请求发到后端,后端处理完之后把数据返回到nginx上,nginx将数据流发到浏览器,这点和lighttpd有点不同,lighttpd是将后端数据完全接收后才发送到浏览器。

小结:apache和squid的反向会增加后端web的负担,因为每个用户请求都会在proxy上与后端server建立的长久链接,知道数据取完前,连接都不会消失。因为wan速度与lan速度的不同,虽然lan之间的速度是极度快的,但是用户的wan连接决定了这个时间长。而lighttpd和nginx的异步模式,是不管你用户要求的数据有多大,都是先收下来,再与后端联系,这是非常迅速的速度,所以proxy与后端连接时间也会很短,几十M的东西也是几秒内。后端不需要维护这么多连接。而lighttpd也和nginx不同的异步,lighttpd是先收完再转向客户浏览器,而nginx是边收数据边转向用户浏览器。

 

 

那么这到底有什么好处呢?

1. 假设用户执行一个上传文件操作,因为用户网速又比较慢,因此需要花半个小时才能把文件传到服务器。squid的同步代理在用户开始上传后就和后台建立了连接,半小时后文件上传结束,由此可见,后台服务器连接保持了半个小时;而nginx异步代理就是先将此文件收到nginx上,因此仅仅是nginx和用户保持了半小时连接,后台服务器在这半小时内没有为这个请求开启连接,半小时后用户上传结束,nginx才将上传内容发到后台,nginx和后台之间的带宽是很充裕的,所以只花了一秒钟就将请求发送到了后台,由此可见,后台服务器连接保持了一秒。同步传输花了后台服务器半个小时,异步传输只花一秒,可见优化程度很大。

 

2. 在上面这个例子中,假如后台服务器因为种种原因重启了,上传文件就自然中断了,这对用户来说是非常恼火的一件事情,想必各位也有上传文件传到一半被中断的经历。用nginx代理之后,后台服务器的重启对用户上传的影响减少到了极点,而nginx是非常稳定的并不需要常去重启它,即使需要重启,利用kill -HUP就可以做到不间断重启nginx。

 

3. 异步传输可以令负载均衡器更有保障,为什么这么说呢?在其它的均衡器(lvs/haproxy/apache等)里,每个请求都是只有一次机会的,假如用户发起一个请求,结果该请求分到的后台服务器刚好挂掉了,那么这个请求就失败了;而nginx因为是异步的,所以这个请求可以重新发往下一个后台,下一个后台返回了正常的数据,于是这个请求就能成功了。还是用用户上传文件这个例子,假如不但用了nginx代理,而且用了负载均衡,nginx把上传文件发往其中一台后台,但这台服务器突然重启了,nginx收到错误后,会将这个上传文件发到另一台后台,于是用户就不用再花半小时上传一遍。

 

4. 假如用户上传一个10GB大小的文件,而后台服务器没有考虑到这个情况,那么后台服务器岂不要崩溃了。用nginx就可以把这些东西都拦在nginx上,通过nginx的上传文件大小限制功能来限制,另外nginx性能非常有保障,就放心的让互联网上那些另类的用户和nginx对抗去吧。

用异步传输会造成问题:

后台服务器有提供上传进度的功能的话,用了nginx代理就无法取得进度,这个需要使用nginx的一个第三方模块来实现。

欢迎大家分享相关的经验

getServerName获取不到IP

对于一些java程序,客户端通过request.getServerName方法从nginx反向代理服务器得不到真实IP地址,而是获取到了nginx配置中,集群的名称,比如下面的thy。

关键原因在于默认配置的集群配置是没有设置proxy_set_header这些参数的。

###################################################################

user  nginx;

worker_processes  2;

 

error_log  /var/log/nginx/error.log warn;

pid        /var/run/nginx.pid;

 

events {

    worker_connections  1024;

}

 

http {

    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    client_max_body_size    1000m;

    sendfile        on;

    #tcp_nopush     on;

 

    keepalive_timeout  65;

    #gzip  on;

#    include /etc/nginx/conf.d/*.conf;

 

###################################################################

#   proxy_redirect off

 

proxy_set_header X-Real-IP $remote_addr;

   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_set_header Host $http_host;

 

    upstream thy {

      ip_hash;

#       server 10.148.67.179:8179;

        server 10.148.65.169:8169;

#       server 10.148.65.171:8171;

#       server 10.148.65.170:8170;

    }

 

    server {

        listen       8080;

        server_name  localhost;

        location / { proxy_pass }

    }

##################################################################

nginx上传文件限制

nginx默认配置是没有client_max_body_size这个参数的,这个参数默认是1M,也就是nginx对应的客户端上传文件大小,最大不能超过1M。

实际上就是限制客户端发出的http请求报文中的Content-Length的值必须小于clent_max_body_size。可以更改此参数达到限制用户上传文件大小的目的。

在主配置文件中添加如下参数即可,上传文件最大1G。

client_max_body_size    1000m;

阅读(1535) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~