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上面。
# 注意,这里建议把80和443分两个端口,访问80则重定向;访问443不重定向;不区分开来会报错“重定向次数太多。

server {
    listen 80;
    server_name leolan.top www.leolan.top;
    rewrite ^/(.*) https://www.leolan.top$request_uri? permanent;
}

server {
    listen 443;
    server_name leolan.top;
    rewrite ^/(.*) https://www.leolan.top$request_uri? permanent;
    #return 301 https://www.leolan.top$request_uri;
}

# 注意:default ssl;很重要,不加可能会报以下错误:
# curl请求:SSL received a record that exceeded the maximum permissible length.
# 火狐浏览器:SSL接收到一个超出最大准许长度的记录。

server {
    listen       443 default ssl;
    server_name  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;

#修改完成后,重启nginx生效(如果没有加载ssl模块,reload可能不生效)。

不带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;
}

密码保护网页

纯静态网页

只需输入密码,不需要用户名。

# 在<body>标签下最前面加入以下代码即可。

        <SCRIPT LANGUAGE="JavaScript">
            function password() 
            {
                var testV = 1;
                var pass1 = prompt('请输入密码:','');
                while (testV < 3) 
                {
                    if (!pass1)
                    history.go(-1);
                    if (pass1 == "123456") 
                    {
                        //alert('密码正确!');
                        break;
                    }
                    testV+=1;
                    var pass1 =
                    prompt('密码错误!请重新输入:');
                }
                if (pass1!="password" & testV ==3)
                history.go(-1);
                return " ";
            }
            document.write(password());
        </SCRIPT>


网页不是静态的

网页是非静态的,可以系统内做账户管理;也可以使用nginx;当然如果只需要输入密码也可以使用上面的方法,自己修改以下即可。

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;

如果要限制某个URL下子路径需要验证密码,而其他路径不用验证(如:接口不需要验证,后台登录入口要验证)
可以新建一个location,在location里写上上述配置

# /view/admin/为相对路径,原路径是xxxxx.com/view/admin/
location /view/admin/ {
        # 账户认证
    	auth_basic "账户认证";
	auth_basic_user_file /www/server/nginx/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


显示目录文件列表

在location、server或http配置段添加额外参数:

autoindex on;             # 开启目录文件列表
autoindex_exact_size on;  # 显示出文件的确切大小,单位是bytes
autoindex_localtime on;   # 显示的文件时间为文件的服务器时间
charset utf-8,gbk;        # 避免中文乱码

另外,如果希望请求文件是下载而不是显示内容,可以通过添加下面参数实现:
add_header Content-Disposition attachment;
# 有时不加这个也可以直接下载

Nginx负载均衡

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


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;
}

# 如果反代443等,参考上面跳转https的做法,记得default ssl。
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.cnblogs.com/mecity/archive/2011/06/20/2085529.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为允许最大上传的大小。)


动静分离

参考:https://mp.weixin.qq.com/s/MyioGlYeC2sgugIvqihxbg

upstream syncdServer {
    server [IP]:8868;
}

server
{
    listen 80;
    server_name [域名或IP];
    
    location / {
    	# 网站根目录(一般情况下网站根目录是在location外配置的)
        root /www/wwwroot/www.xxxx.com/syncd-deploy/public;
        index index.html index.htm;
    }
    
    location ^~ /api/ {
        proxy_pass         http://syncdServer;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
   
    access_log  /www/wwwlogs/www.xxxx.com.log;
    error_log  /www/wwwlogs/www.xxxx.com.error.log;
}

反代特殊情况

我需要通过www.leolan.top访问网站A;www.leolan.top/mail访问网站B;www.leolan.top/git访问网站C;
1,三个网站在同一台服务器上
这就是极为普通的情况,就是本地代理到不同端口或根据url放在根目录下的文件夹就行了。

2,三个网站在不同服务器上,可以通过内网IP或公网IP访问(不使用https)
注意一些坑!!!

# 注意看中文注释!!!
server {
        listen 80;
        server_name 192.168.1.10 192.168.2.10 192.168.3.10;
        location /mail {
        # 注意:mail后面不加"/"则是(普通访问,后面的子目录路径不会传递过去,比如访问xxx/mail/admin会变成访问xxx/admin;如果没有location定义admin访问方式,则是主站点“/”下的admin目录。)
        # 加"/"会变成301永久跳转,后面的子目录路径也会传递过去,比如访问xxx/mail/admin就是访问xxx/mail/admin。
            proxy_pass      http://192.168.8.5:90/;  #后面的斜杠不能少,作用是不往后端传递/mail这个路径
            proxy_redirect  off;
            proxy_set_header  Host  mail.domain.com; #传递不同的host给后方节点,实现IP和域名均可以访问
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        location /git/ {
            proxy_pass      http://DemoBackend;     #如果没有"/"则会把git路径也传到后端,后端实际的网站目录应该是:/$wwwroot/git/ 
            proxy_redirect  off;
            proxy_set_header  Host  $host;          # 默认是传递主机名
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
            #变量包含客户端请求头中的"X-Forwarded-For",如果没有"X-Forwarded-For" 请求头,则$proxy_add_x_forwarded_for等于$remote_addr。
        }
        #还可以添加更多映射,通过不同的路径来映射不同的API,最后对于直接访问IP则返回403,防网络上的扫码探测
        location / {
            return 403;
        }
}

3,三个网站在不同服务器上,且使用HTTPS
参考2中的情况,注意443端口和跨域跨主机的问题,没试过这种情况,不知道能不能访问。

参考资料:
https://zhangge.net/5054.html
https://blog.csdn.net/xybelieve1990/article/details/52932977


Nginx+keepalived、双机热备

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


多域名绑定、一机多站

这种情况是用一台服务器上的一个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

正向代理、反向代理、Master-Worker模式、负载均衡



Nginx开发从入门到精通

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

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


提升10倍Web应用性能的10个小技巧!

https://mp.weixin.qq.com/s/UzSCSBdbr5pH6Etvju9yhw


Nginx负载均衡、限流、缓存、黑白名单

https://www.toutiao.com/i6692127248272589315/

文章作者: Leo
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LeoLan的小站
Web服务器 负载均衡 nginx joomla nginx负载均衡
喜欢就支持一下吧