Nginx配置、负载均衡等
     分类:Web服务器负载均衡     有: 0 条评论

Nginx配置、负载均衡等

     分类:Web服务器负载均衡     有: 0 条评论

Nginx安装

# 安装最新版本
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install -y nginx

源码编译安装参考:
https://wizardforcel.gitbooks.io/nginx-doc/content/Text/1.3_install.html
https://wizardforcel.gitbooks.io/nginx-doc/content/Text/6.html


常用配置

http跳转到https

# 修改配置文件,80端口会自动转给443端口,这样就强制使用SSL证书加密了。访问http的时候会自动跳转到https上面。

server {
    listen 80;
    server_name www.leolan.top;
    rewrite ^(.*) https://$server_name$1 permanent;
}
server {
    listen       443 default ssl;
    server_name  leolan.top www.leolan.top;
    root   /web/www/default;
       ssl_certificate /etc/letsencrypt/live/www.leolan.top/fullchain.pem;
       ssl_certificate_key /etc/letsencrypt/live/www.leolan.top/privkey.pem;
       ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
       ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
       ssl_prefer_server_ciphers on;
       ssl_session_cache shared:SSL:10m;

#修改完成后,reload或重启nginx生效。

不带www跳转到www(301跳转)

# rewrite方式(推荐),优点是利于SEO,缺点是受版本限制可能导致301出错。
# 配置文件中加入这段代码,reload一下即可。
server {
    server_name leolan.top;
    rewrite ^(.*)$ https://www.leolan.top$1 permanent;
}


# return方式
server {
listen 80;
server_name leolan.top;
return 301 http://www.leolan.top$request_uri;
}

密码保护网页

yum install -y httpd-tools
mkdir -p /usr/local/nginx/conf/
htpasswd -bc /usr/local/nginx/conf/htpasswd.users admin 123456   #生成密码文件
cat /usr/local/nginx/conf/htpasswd.users

vim /etc/nginx/nginx.conf             #修改配置,在server下加入以下两句(不是在location内)

auth_basic "Restricted Access";       #描述说明
auth_basic_user_file /usr/local/nginx/conf/htpasswd.users;

# 重启nginx
/usr/sbin/nginx -t
/usr/sbin/nginx -s reload

参考:
https://www.cnblogs.com/keithtt/p/6593866.html
https://www.iwch.me/archives/658.html


Nginx负载均衡

Nginx负载均衡适用于小规模的集群,负载均衡的本质是所有客户端都从服务器A入口,最后被分流到B,C,D,E...服务器,出口也是经过服务器A,这样在同一个机房内只需要一个公网IP即可实现分流,但服务器A的压力及带宽是关键部分。(对于大集群可以用DNS分流)


Nginx+keepalived、双机热备

http://www.cnblogs.com/kevingrace/p/6138185.html
https://blog.csdn.net/jhq0113/article/details/44278221


Nginx反向代理

Nginx反向代理是所有客户端都从服务器A入口,最后被分流到B,C,D,E...服务器,之后的连接是和各自的B,C,D,E...服务器的连接,这样每台服务器都要有公网IP可跨机房,也减少了服务器A的压力。


配置部分(这是Server配置中,或者新建conf配置)

一般Nginx的配置文件会分成两部分,这样方便管理。
全局配置:/etc/nginx/nginx.conf
Server配置:/etc/nginx/conf.d/default.conf

简单的Nginx负载均衡和反向代理:

upstream leoTest {
#server后用ip,不要用localhost和127.0.0.1,这两个地址测试不了。
                server 123.207.92.209;      #ip后面可以接端口
                server 123.207.92.245;
}

server {
    listen       80;
    server_name  localhost;           #localhost或www.xxx.com(域名指向此服务器)

    location / {
        proxy_pass http://leoTest;   #调用upstream里设定的变量
        proxy_buffering off;          #缓存开关
        
        #以下三行是获得前端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;
}

参考资料:
http://www.ilanni.com/?p=7631
http://www.cnblogs.com/jacktang/p/3669115.html
http://www.linuxidc.com/Linux/2016-04/130350.htm
http://www.cnblogs.com/mecity/archive/2011/06/20/2085529.html
https://wizardforcel.gitbooks.io/nginx-doc/content/Text/7.4_loadbalance.html
https://www.liaohuqiu.net/posts/nginx-proxy-pass/


参数

upstream模块常用参数

1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

server 192.168.0.100:80负载均衡后端RealServer的IP或者域名,端口不写的话默认为80。高并发场景用域名,再通过DNS进行负载均衡
weight=5权重,默认为1,权重越大接收的请求越多
max_fails=2失败超过指定次数会暂停或请求转往其它服务器(最大尝试的失败次数),默认为1,0表示禁止失败尝试
fail_timeout=10s失败超过指定次数后暂停时间,失败超时时间,默认是10秒,通常3s左右比较合适
backup热备配置,前段RealServer出现问题后会自动上线backup服务器,其它服务器超时或down时才会请求backup服务器
down标志服务器不可用(负载过重或者不参与负载),这个参数通常配合IP_HASH使用

例:(这是在全局中的配置,具体的看下面配置部分

http {    
    
    upstream  www.test1.com {
          ip_hash;
          server   172.16.125.76:8066 weight=10;
          server   172.16.125.76:8077 down;
          server   172.16.0.18:8066 max_fails=3 fail_timeout=30s;
          server   172.16.0.18:8077 backup;
     }
      
     upstream  www.test2.com {
          server   172.16.0.21:8066;
          server   192.168.76.98:8066;         
     }


     server {
        listen       80;
        server_name  www.test1.com;        
       
        location /{
           proxy_pass        http://www.test1.com;
           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;
        server_name  www.test2.com;        
       
        location /{
           proxy_pass        http://www.test2.com;
           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_connect_timeout 300;             #跟后端服务器连接超时时间,发起握手等候响应时间
           proxy_send_timeout 300;                #后端服务器回传时间,就是在规定时间内后端服务器必须传完所有数据
           proxy_read_timeout 600;                #连接成功后等待后端服务器的响应时间,已经进入后端的排队之中等候处理
           proxy_buffer_size 256k;                #代理请求缓冲区,会保存用户的头信息以供nginx进行处理
           proxy_buffers 4 256k;                  #同上,告诉nginx保存单个用几个buffer最大用多少空间
           proxy_busy_buffers_size 256k;          #如果系统很忙时候可以申请最大的proxy_buffers
           proxy_temp_file_write_size 256k;       #proxy缓存临时文件的大小
     }
}

千万注意不要少了花括号,会报错:nginx: [emerg] "server" directive is not allowed here in /etc/nginx/nginx.conf:101

这里要注意,如果server写的是IP,那么监听的端口不同,这样是可以负载的。
监听的端口不同,server也是不同的网址,这样是可以负载的。
如果监听的端口相同,server应该是不同的网址(不能是相同的网址或IP),这样也是可以负载的。
其他情况都无法负载,会导致无法访问的情况。

参考:
https://www.cnblogs.com/kevingrace/p/5882006.html
https://www.cnblogs.com/kaifayuan/p/4701402.html

报错:413 request entity too large

反向代理后端服务器,上传文件时报错。

解决:在http{}段中加入 client_max_body_size 256m; (256m为允许最大上传的大小。)


多域名绑定、一机多站

这种情况是用一台服务器上的一个Nginx共用80和443端口绑定多个域名,每个域名对应不同的网站。

首先把网站放在Nginx可访问的www目录下,一个网站一个文件夹,名称随意。
配置文件,这里有两种方法:
法1:直接修改Nginx原有配置
在原有配置上(有的配置没有分离的则直接在全局配置里设定;分离的则在Server部分的配置文件中配置);直接在拷贝server栏目再粘贴进去,这时有两个一模一样的server栏目;把刚刚粘贴的那个server栏目中的server_name改为你要绑定的新网址(多个网址空格隔开,如:www.leolan.top leolan.top;);并且修改root对应的网站目录,其他的配置最好先不要修改,后期配置好了再按需修改。

这时nginx -t测试一下(这里可能会报错,可以关闭其他配置文件,单独测试报错的那个文件),没问题就nginx -s reload一下,不过reload可能并不会生效,还可能会报错(这点很古怪,我没找到原因),service nginx restart 也可以试试;如果你确定配置没问题就不用理会,直接重启系统,就正常了。

法2:方便管理的办法就是新建一个配置文件
一个网站对应一个配置文件,当配置出问题时不至于所有网站都挂掉,直接复制原来的配置文件一份,名称随意,只要全局配置中include就行,编辑复制的配置文件,修改server_name绑定网址;修改root对应的网站目录;修改access_log对应的日志目录。其他配置先不用修改。

nginx -t测试一下,并nginx -s reloadservice nginx restartreboot就正常工作了。

参考:
http://blog.csdn.net/zacklin/article/details/7859680
http://www.2cto.com/os/201411/355366.html


Nginx伪静态、Rewrite伪静态规则

伪静态是一种可以把文件后缀改成任何可能的一种方法,例如把php文件伪静态成html文件。

nginx里使用伪静态是直接在nginx.conf 中写规则的,并不需要像apache要开启写模块(mod_rewrite)才能进行伪静态。
nginx只需要打开nginx.conf配置文件,在server里面写需要的规则即可。

例:把php文件伪静态成html文件
法1:
直接在Nginx配置文件中的server栏下加入以下代码:

#下面就是伪静态了
location /{ 
rewrite ^(.*)/equip(d+).html$ $1/index.php?m=content&c=index&a=lists&catid=$2 last; 
} 
access_log  access_log   off; 
} 

然后重启nginx服务器伪静态就生效了,最好nginx -t测试一下配置文件是否正确,然后nginx -s reload重新加载也行。

法2:
为了方便维护,可以吧伪静态规则单独新建一个配置文件。
在指定文件夹新建配置文件,如XXX_rewrite.conf并写入以下代码

ocation /{ 
rewrite ^(.*)/equip(d+).html$ $1/index.php?m=content&c=index&a=lists&catid=$2 last; 
} 

在Nginx配置文件中加入包含(include文件夹或文件)

然后重启nginx服务器伪静态就生效了,最好nginx -t测试一下配置文件是否正确,然后nginx -s reload重新加载也行。


更多高级的用法详见:http://www.jb51.net/article/50899.htm
https://segmentfault.com/a/1190000002797606


各种CMS问题

Joomla安装后无法打开

普通问题,先参考官方文档:http://docs.typecho.org/faq
提示“没有文件输入”,则在nginx配置文件中加入以下代码:

if (-f $request_filename/index.html){
         rewrite (.*) $1/index.html break;
             }
if (-f $request_filename/index.php){
         rewrite (.*) $1/index.php;
             }
if (!-e $request_filename){
         rewrite (.*) /index.php;
             }

以下是一些博文,有时间再整理
nginx负载高可用
https://my.oschina.net/xshuai/blog/917097 (Nginx+keepalived详细)
http://blog.csdn.net/jhq0113/article/details/44278221 (配置概览)
https://www.liuliya.com/archive/290.html (Nginx+keepalived)
https://www.liuliya.com/archive/691.html (具体参数配置)

http://blog.csdn.net/xyang81/article/details/51702900 (配置概览)
http://ny0716.blog.51cto.com/9154254/1738708 (具体参数配置)

nginx性能优化:http://blog.csdn.net/zqtsx/article/details/24111319



Nginx开发从入门到精通

http://tengine.taobao.org/book/index.html

Nginx文档中文翻译:http://tengine.taobao.org/nginx_docs/cn/

(●゚ω゚●)