Nginx反向代理 负载均衡sky

  1. 云栖社区>
  2. 博客>
  3. 正文

Nginx反向代理 负载均衡sky

技术小胖子 2017-11-08 17:29:00 浏览1908
展开阅读全文

Nginx服务部署

Nginx简介

Nginx (engine x) 是一个轻量级的、高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004104日。是在一个BSD-like 协议下发行。

其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。201161日,nginx 1.0.4发布。

其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

 

官网和资料

官网:http://nginx.org/

中文文档:http://www.nginx.cn/doc/

nginx源码包下载:wget   http://nginx.org/download/nginx-1.13.4.tar.gz

nginx官网rpm包下载:http://nginx.org/packages/centos/

Centos6EPEL源:https://mirrors.tuna.tsinghua.edu.cn/epel/6/x86_64/

Centos7EPEL源:http://mirrors.sohu.com/fedora-epel/7Server/x86_64/

 

nginx结构与扩展功能

工作结构:一个主进程(master)和多个工作进程(woker)。工作进程是单线程的,且不需要特殊授权即可运行。

扩展功能

kqueue (FreeBSD 4.1+),epoll (Linux 2.6+),rt signals (Linux 2.2.19+),/dev/poll(Solaris 7 11/99+),select,以及 poll 支持;

kqueue支持的不同功能包括 EV_CLEAR,EV_DISABLE (临时禁止事件), NOTE_LOWAT,EV_EOF,有效数据的数目,错误代码

sendfile (FreeBSD 3.1+),sendfile (Linux 2.2+),sendfile64 (Linux 2.4.21+),和 sendfilev (Solaris 8 7/01+) 支持;

输入过滤 (FreeBSD4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;

10,000 非活动的 HTTP keep-alive 连接仅需要 2.5M内存。

最小化的数据拷贝操作;

其他HTTP功能;

基于IP、端口和名称的虚拟主机服务;

Memcached  GET 接口;

支持 keep-alive和管道连接;

灵活简单的配置;

重新配置和在线升级而无须中断客户的工作进程;

可定制的访问日志,日志写入缓存,以及快捷的日志回卷;

4xx-5xx错误代码重定向;

基于 PCRE  rewrite 重写模块

基于客户端IP 地址和 HTTP 基本认证的访问控制;

PUT,DELETE,和 MKCOL 方法;

支持 FLV Flash 视频);

带宽限制。

 

Nginx架构原理


大致上Nginx的架构就是这样:

1.Nginx启动后,会产生一个主进程,主进程执行一系列的工作后会产生一个或者多个工作进程;

2.在客户端请求动态站点的过程中,Nginx服务器还涉及和后端服务器的通信。Nginx将接收到的Web请求通过代理转发到后端服务器,由后端服务器进行数据处理和组织;

3.Nginx为了提高对请求的响应效率,降低网络压力,采用了缓存机制,将历史应答数据缓存到本地。保障对缓存文件的快速访问;

 

##工作进程##

工作进程的主要工作有以下几项:

接收客户端请求;

将请求一次送入各个功能模块进行过滤处理;

IO调用,获取响应数据;

与后端服务器通信,接收后端服务器处理结果;

数据缓存

响应客户端请求;

 

##进程交互##

Nginx服务器在使用Master-Worker模型时,会涉及到主进程和工作进程的交互和工作进程之间的交互。这两类交互都依赖于管道机制。

1.Master-Worker交互

这条管道与普通的管道不同,它是由主进程指向工作进程的单向管道,包含主进程向工作进程发出的指令,工作进程ID等;同时主进程与外界通过信号通信;

2.worker-worker交互

这种交互是和Master-Worker交互是基本一致的。但是会通过主进程。工作进程之间是相互隔离的,所以当工作进程W1需要向工作进程W2发指令时,首先找到W2的进程ID,然后将正确的指令写入指向W2的通道。W2收到信号采取相应的措施。

 

Nginx服务器的事件驱动模型

从上面我们可以知道,Nginx服务器的工作进程调用IO后,就取进行其他工作了;当IO调用返回后,会通知工作进程。IO调用时如何把自己的状态通知给工作进程的呢??

一般解决这个问题有两种方法:

1)让工作进程在进行其他工作的过程中间隔一段时间就去检查一下IO的状态,如果完成就响应客户端,如果未完成,继续工作。

    2IO调用在完成后能主动通知工作进程。

当然最好的就是用第二种方法了;像select/poll/epoll等这样的系统调用就是用来支持第二种解决方案的。这些系统调用也常被称为事件驱动模型。他们提供了一种机制就只让进程同时处理多个并发请求,不用关心IO调用的具体状态。IO调用完全由事件驱动模型来管理。

 

Nginx中的事件驱动模型

就是用事件驱动处理库(多路IO复用),最常用的就是select模型,poll模型,epoll模型。

关于这三个模型的详解在这里可以看到:https://segmentfault.com/a/1190000003063859

 

 

 

nginx安装和配置

安装方法:1、用yumrpm方式安装       2、编译安装

方法一:用yum安装nginx

实施思路:

1、  下载nginx-*.rpm软件包或配置网络yum源。

2、  yumrpm  -ivh安装nginx软件。

3、  修改nginx.conf配置文件。

4、  启动nginx服务。本地访问测试。

 

具体实施:

1、  下载nginx-*.rpm软件包或配置网络yum源。

1步,配置sohu网络yum源:

vim   /etc/yum.repos.d/6sohu.repo

注:此处是sohu网的Centos6yum源。

[6sohuyum]

name=6sohu_yum

baseurl=http://mirrors.sohu.com/fedora-epel/7Server/x86_64/

enabled=1

gpgcheck=0

vim    /etc/yum.repos.d/6epel.repo

注:此处是Centos6epelyum源。

[6epel]

name=6epel

baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/6/x86_64/

enabled=1

gpgcheck=0

 

 

vim   /etc/yum.repos.d/7sohu.repo

注:此处是sohuCentos7yum源。

[7sohuyum]

name=7sohu_yum

baseurl=http://mirrors.sohu.com/fedora-epel/7Server/x86_64/

enabled=1

gpgcheck=0

vim    /etc/yum.repos.d/7epel.repo

注:此处是Centos7epelyum源。

[7epel]

name=7epel

baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/

enabled=1

gpgcheck=0

2步,测试yum源是否可用。

yum  clean  all

yum  makecache  fast

yum  repolist

yum  list  nginx

 

2、  yumrpm  -ivh安装nginx软件。

yum    install  -y  pcre-devel   openssl-devel  zlib-devel  curl   elinks   lynx

yum    install  -y  nginx

rpm   -ql  nginx

rpm   -qc  nginx

技巧:下载网络yum源中的nginx和依赖包到本地主机上。方法如下:

方法一:downloadonly插件(首选)

  1.安装插件

    yum   -y  install  yum-download

  2.下载nginx软件包到当前文件夹的nginx目录中。

    yum  -y  install   nginx  -downloadonly  -downloaddir= ./nginx/

 

方法二:yum-utils中的yumdownloader

  1.安装yum-utils

    yum  -y  install   yum-utils

  2.使用yumdownloader下载软件包nginx

    yumdownloader  nginx

 

方法三:利用yum的缓存功能

  默认情况下,yum在安装软件包后会自动清理软件包,修改配置,使yum不再清理软件包

  vim /etc/yum.conf中修改keepcache = 0改为keepcache = 1

  /etc/init.d/yum-updatesd restart

  yum -y install httpd

  这时软件包已经安装下载,目录为/var/cache/yum

每一次启程都是从搬砖开始......

 

3、  修改nginx.conf配置文件。

rpm   -qc  nginx    查看配置文件

/etc/logrotate.d/nginx     日志轮滚策略

/etc/nginx/conf.d/default.conf    自动载的默认配置文件

/etc/nginx/conf.d/ssl.conf        ssl配置文件

/etc/nginx/conf.d/virtual.conf     虚拟主机配置文件

/etc/nginx/fastcgi.conf           fastcgi配置文件(php交互)

/etc/nginx/fastcgi.conf.default     fastcgi配置文件的备份

/etc/nginx/fastcgi_params        fastcgi参数配置文件

/etc/nginx/fastcgi_params.default    fastcgi参数配置文件的备份

/etc/nginx/mime.types             文件类型mime配置文件

/etc/nginx/nginx.conf             nginx的主配置文件

/etc/nginx/nginx.conf.default       nginx的主配置文件的备份

/etc/nginx/scgi_params            scgi参数文件

/etc/nginx/uwsgi_params           uwcgi参数文件

/etc/sysconfig/nginx              nginx系统配置文件

 

4、  启动nginx服务。本地访问测试。

nginx  -t                  检测nginx.conf语法

service  nginx   restart      重启服务

chkconfig   nginx  on        设为开机启动

curl  127.0.0.1              本地访问测试

elinks   127.0.0.1           本地访问测试

service  nginx  status        查服务状态

service  nginx   stop         停止服务

查服务的进程:

ps  aux|grep  nginx

ps  ef|nginx

 

查服务端口:

lsof  -i:80

ss  -atunlp|grep  :80

netstat  -atunlp|grep  :80

 

方法二:用nginx-*tar.gz源码安装(见最后的附录)

nginx 1.13.4简单编译安装

软件下载、安装:

#说明:pcre(rewrite功能需要)     openssl是提供ssl安全套接字功能,让nginx支持https协议

yum    install  -y  gcc  gcc-c++  pcre-devel   openssl-devel  zlib

id   nginx ||useradd  -r  nginx

cd   ~

wget    http://nginx.org/download/nginx-1.13.4.tar.gz

ls

tar    xf  nginx-1.13.4.tar.gz

cd    nginx-1.13.4

./configure  --prefix=/usr/local/nginx  \

  --conf-path=/etc/nginx/nginx.conf  \

  --user=nginx  \

  --group=nginx  \

   --with-http_ssl_module

 

#安装:

make &&  make  install

 

#设置环境变量:

echo "PATH=$PATH:/usr/local/nginx/sbin/"  > /etc/profile.d/nginx.sh

source /etc/profile.d/nginx.sh

export /etc/profile.d/nginx.sh

 

手动启动nginx:

nginx -t    检测配置文件语法

nginx      启动nginx软件

nginx -h    查看帮助

nginx -v    显示编译安装的参数信息

 

服务管理:

nginx -s  stop/quit    停止

nginx -s  reload      重载新配置文件

curl 127.0.0.1       firefox   127.0.0.1  &

lsof -i:80    ss  -atunlp|grep  :80   netstat  -atunlp|grep  :80

说明:nginx官方没有提供服务启动脚本,需要自己写服务启动脚本。

 

nginx完整安装参考

软件下载

yum  install  -y  gcc  gcc-c++  pcre-devel openssl-devel

cd  ~

wget  http://nginx.org/download/nginx-1.13.4.tar.gz

ls

tar  xf  nginx-1.13.4.tar.gz

 

编译安装方法:

准备工作:安装编译器和依赖的软件

yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel

Nginx模块必须在编译的时候指定,完整的编译选项,可用的模块可以参考安装指导

下面是一个例子:

id  nginx || useradd   -r  nginx
cd   ~/nginx-1.13.4
./configure \
  --prefix=/usr/local/nginx \
  --sbin-path=/usr/sbin/nginx \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --pid-path=/var/run/nginx/nginx.pid  \
  --lock-path=/var/lock/nginx.lock \
  --user=nginx \
  --group=nginx \
  --with-http_ssl_module \
  --with-http_flv_module \
  --with-http_gzip_static_module \
  --http-log-path=/var/log/nginx/access.log \
  --http-client-body-temp-path=/var/tmp/nginx/client/ \
  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/

编译和安装:make  &&   make  install  &&   echo  ok

更多编译参数与可用的模块信息请运行./configure --help

 

启动关闭nginx

## 检查配置文件是否正确

#/usr/sbin/nginx  -t

#mkdir -pv /var/tmp/nginx/client/

# nginx -h    #查看帮助

# nginx -V     # 可以看到编译选项

 

## 启动、关闭

# nginx       # 默认配置文件conf/nginx.conf-c 指定

# ./sbin/nginx  -s  stop

 pkill nginx

 

测试访问:curl  127.0.0.1    firefox 127.0.0.1  &

 

默认主页index.html的目录:ls  /usr/local/nginx/html/

 

nginx简易的服务脚本:

vi    /etc/init.d/nginx

#!/bin/bash

#chkconfig: - 85 15

nginx='/usr/local/nginx/sbin/nginx'

case   $1  in

         start)

                   $nginx  -t && $nginx && echo start ok

         ;;

         stop)

                   $nginx  -s  stop   && echo stop ok

         ;;

         reload)

                   $nginx  -t && $nginx -s  reload   || $nginx   -s  stop

         ;;

         restart)

                   $nginx  -s  stop   && echo stop ok

                   $nginx  -t && $nginx && echo start ok

         ;;

         *)

                   echo  "Usage nginx {start|stop|reload|restart}"            

         ;;

esac       

添加x权限并测试:

chmod   +x   /etc/init.d/nginx

service   nginx  restart

 

 

nginx专业级服务脚本:

vi  /etc/init.d/nginx    内容如下

#!/bin/bash

# chkconfig: - 30 21

# description: http service.

# Source Function Library

. /etc/init.d/functions

# Nginx Settings

NGINX_SBIN="/usr/local/nginx/sbin/nginx"

NGINX_CONF="/etc/nginx/nginx.conf"

NGINX_PID="/usr/local/nginx/logs/nginx.pid"

RETVAL=0

prog="Nginx"

start() {

         echo -n $"Starting $prog: "

         mkdir -p /dev/shm/nginx_temp

         daemon $NGINX_SBIN -c $NGINX_CONF

         RETVAL=$?

         echo

         return $RETVAL

}

stop() {

         echo -n $"Stopping $prog: "

         killproc -p $NGINX_PID $NGINX_SBIN -TERM

         rm -rf /dev/shm/nginx_temp

         RETVAL=$?

         echo

         return $RETVAL

}

case   $1  in 

       start)

              start

              [  $?  -eq   0 ] &&  echo  "nginx   ok"  ||  echo   "nginx  error"

       ;;

       stop)

              stop

              [  $?  -eq   0 ] &&  echo  "nginx   ok"  ||  echo   "nginx  error"

       ;;

       restart)

              stop  && start

              [  $?  -eq   0 ] &&  echo  "nginx   ok"  ||  echo   "nginx  error"

       ;;

       *|"")

              echo  $"Usage:nginx {start|stop|restart|status}."

       ;;

esac   

 

nginx.conf主配置文件

nginx配置文件结构(rpm方式)

cat   -n  /etc/nginx/nginx.conf

user          nginx;     进程用户

worker_processes  1;      进程数(双核CPU可设置为2)

error_log  /var/log/nginx/error.log;    错误日志

#error_log  /var/log/nginx/error.log  notice;      错误日志为notice等级

#error_log  /var/log/nginx/error.log  info;        错误日志为info等级

pid        /var/run/nginx.pid;     进程的pid文件

events {     事件设置

     worker_connections  1024;    单个进程最在连接数

}

 

http {       配置http服务参数

     include       /etc/nginx/mime.types;      包含mime支持类型的配置文件

     default_type  application/octet-stream;      默认类型

 

     log_format  main  '$remote_addr - $remote_user [$time_local] "$request"  '  定义main日志文件格式

                      '$status $body_bytes_sent  "$http_referer" '

                      '"$http_user_agent"  "$http_x_forwarded_for"';

 

     access_log  /var/log/nginx/access.log  main;        访问日志

     sendfile        on;    开启sendfile功能

     #tcp_nopush     on;    不启用tcp_nopush功能

     #keepalive_timeout  0;

     keepalive_timeout  65;    指定保持连接的超时时间

     #gzip  on;    是否启用gzip功能

     # Load config files from the /etc/nginx/conf.d  directory

     # The default server is in conf.d/default.conf

     include  /etc/nginx/conf.d/*.conf;    包含分支配置文件(启动服务时加载这些配置文件)

}      结束http参数配置

 

default.conf默认网站配置文件

cat    /etc/nginx/conf.d/default.conf


# The default server  设置服务器配置文件(80端口的虚拟主机)

server {   虚拟主机配置

     listen       80  default_server;   监听80端口,并设置为默认服务器

     server_name  _;                服务器域名

     #charset koi8-r;     网站字符编码设置

     #access_log  logs/host.access.log  main;     访问日志类型为main类型

    location / {    位置匹配设置

        root   /usr/share/nginx/html;    网站根目录

        index  index.html  index.htm;     默认主页文件名列表

    }   位置设置结束

 

    error_page  404              /404.html;    404错误代码及页面

    location = /404.html {      位置匹配设置

        root   /usr/share/nginx/html;    位置的根目录

    }  位置设置结束

 

     # redirect server error pages to the static page /50x.html

    error_page   500 502 503 504  /50x.html;    500~504错误代码及页面

    location = /50x.html {   位置匹配设置

        root   /usr/share/nginx/html;    位置根目录

    }   匹配位置结束

     # proxy the PHP scripts to Apache listening on 127.0.0.1:80  代理PHP由后端的apache处理

     #location ~ \.php$  {      匹配以.php为后缀的设置

    #    proxy_pass   http://127.0.0.1;       后端web服务器IP地址及协议

    #}   匹配设置结束

     # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

     #PHP脚本发给端口为9000FastCGI服务器处理,

    #location ~ \.php$ {    匹配以.php为后缀的设置 

    #    root           html;   网站根目录

    #    fastcgi_pass   127.0.0.1:9000;    指定fastcgi服务器的IP和端口号

    #    fastcgi_index  index.php;    指定主页文件

    #    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;  脚本文件名

    #    include        fastcgi_params;   包含fastcgi_params参数配置文件

    #    include        fastcgi.conf;      包含fastcgi.conf配置文件

    #}  匹配设置结束

 

     # deny access to .htaccess files, if Apache's document root

     # concurs with nginx's one

     #

     #location ~ /\.ht {    匹配.ht的文件

     #    deny  all;      设置权限为拒绝访问

     #}   匹配设置结束

}   虚拟主机配置结束(与开头的server{的大括号配对)

 

nginx虚拟主机配置

cat    /etc/nginx/conf.d/virtual.conf    

虚拟主机配置文件模板

# A virtual host using mix of IP-, name-,  and port-based configuration

#server {      定义虚拟主机

#     listen       8000;   指定监听端口

#     listen       somename:8080;   指定域名和监听端口

#     server_name  somename  alias   another.alias;   指定服务器域名

#     location / {     位置设置

#         root   html;    网站根目录(html位于/usr/share/nginx/html),可用绝对路径

#         index  index.html index.htm;     网站默认主页文件名

#     }   位置设置结束

#}   虚拟主机设置结束

虚拟主机:在一台nginx服务器上发布多个不同的网站。

实现nginx虚拟主机的方法(三种方案可以综合应用)

1、  基于端口:将不同的网站绑定在不同的端口。

2、  基于IP:将不同的网站绑定在不同的IP地址。

3、  基于域名:将不同的网站绑定在不同的域名。需要在hosts文件或DNS服务器上登记域名和IP地址的对应解析关系。

 

练习:在nginx服务器上创建一个网站根目录/web/8080,并创建index.html主页,用nginx虚拟主机基于端口的方式发布这个网站,用独立的配置文件8080.conf,重启nginx服务后,并在本地做访问测试。

1步,创建网站根目录和主页。

mkdir   -pv  /web/8080

echo   www.8080.com  > /web/8080/index.html

2步,创建8080.conf配置文件,将网站绑定在8081端口进行发布。

cd   /etc/nginx/conf.d

cp   -v  virtual.conf   8080.conf

vi    8080.conf     修改后的内容如下

server {

     listen       8080;

     #listen       somename:8080;

     server_name  www.8080.com  8080   8080.com;

     access_log  /web/8080/access.log  main;

     error_log  /web/8080/error.log;

     location / {

         root   /web/8080;

         index  index.html index.htm;

     }

}

3步,检测配置文件语法,重启服务,本地访问测试。

nginx   -t

service   nginx  restart

curl   127.0.0.1:8080  ; elinks   127.0.0.1:8081       本地访问测试

 

任务:参考/web/8080目录的网站发布的方法,将/web/8081目录的网站绑定在8081端口进行发布,并做访问测试。

 

Nginx文件共享:

文件共享设置

方法一:(首选)用nginx自带的index文件列表索引功能实现,只需要添加全局设置参数即可。也可以将autoindex功能代码添加到location代码段中

location   /  {

     root   /var;     #根目录路径

     autoindex  on;   # 显示目录

     autoindex_exact_size  on;   # 显示文件大小

     autoindex_localtime  on;    # 显示文件时间

     limit_rate_after  5m;       #5m之后下载速度为10k

     limit_rate  10k;            #限速10k

     #alias  /usr/local;        #别名

}

方法二:(备用)在location匹配代码段中用if对请求的文件类型判断,指定访问某些格式的文件时才会提示下载。

        location /  {

            #root    html;

            #index   index.html index.htm;

            if ($request_filename ~* ^.*?\.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){

            add_header Content-Disposition: 'attachment;';

            }

         }

实例:用nginx基于端口的方式发布/var目录,绑定在8001端口,实现文件共享功能。

1步,修改配置文件。vim   /etc/nginx/conf.d/8001.conf   

server {

     listen       8001;

     #listen       somename:8001;

     server_name  www.8001.com  8001   8001.com;

     access_log  /var/8001_access.log  main;

     error_log  /var/8001_error.log;

     location / {

         root   /var;

         index  index.html index.htm;

        autoindex  on;

        autoindex_exact_size   on;

        autoindex_localtime  on;

     }

}

2步,重启nginx服务,本地访问测试。(elinks是用q键退出)

nginx   -t  &&  nginx   -s  reload

elinks   127.0.0.1:8001    (elinks是用q键退出)

 

 

nginx访问控制表

访问控制表相关指令:allowdenyngx_http_access_module

单看nginx模块名ngx_http_access_module,很多人一定很陌生,但是denyallow相比没一个人不知道的,实际上denyallow指令属于ngx_http_access_module.我们想控制某个uri或者一个路径不让人访问,在nginx就得靠它了。

nginx的访问控制模块语法很简单,至少比apache好理解,apacheallowdeny的顺序让很多初学者抓头.好了具体看下这个插件的使用方法吧。

1、安装模块

这个模块内置在了nginx中,除非你安装中使用了--without-http_access_module。如果你还没安装过nginx,那么请参考下ttlsa之前写的nginx安装.

2、指令

allow

语法:     allow <address | CIDR | unix: | all>;

默认值:     

配置段:     http, server, location, limit_except

实例:allow  192.168.10.0/24;

允许某个ip或者一个ip段访问.如果指定unix:,那将允许socket的访问.注意:unix1.5.1中新加入的功能,如果你的版本比这个低,请不要使用这个方法。

deny

语法:     deny <address| CIDR | unix: | all>;

默认值:     

配置段:     http, server, location, limit_except

禁止某个ip或者一个ip段访问.如果指定unix:,那将禁止socket的访问.注意:unix1.5.1中新加入的功能,如果你的版本比这个低,请不要使用这个方法。

3. allowdeny实例

location / {

deny 192.168.10.1;

allow  192.168.10.0/24;

allow  192.168.20.0/24;

allow  10.1.1.0/16;

allow 2001:0db8::/32;

deny all;

}

从上到下的顺序,类似iptables。匹配到了便跳出。如上的例子先禁止了192.16.1.1,接下来允许了4个网段,其中包含了一个ipv6,最后未匹配的IP全部禁止访问.在实际生产环境中,我们也会使用nginx geo模块配合使用,有兴趣的请参考ttlsa相关文章nginx geo使用方法.

4. 结束语

nginx访问控制模块要数nginx里面最简单的指令,只要记住你想禁止谁访问就deny加上IP,想允许则加上allow ip,想禁止或者允许所有,那么allowall或者deny all即可.

 

实例:在上一例的8001端口的文件共享的location /代码段中使用denyallow访问共享控制功能,禁止192.168.10.1192.168.20.1的主机访问共享,允许其他任何主机访问共享。

1步,修改配置文件。vim   /etc/nginx/conf.d/8001.conf

server {

     listen       8001;

     #listen       somename:8001;

     server_name  www.8001.com  8001   8001.com;

     access_log  /var/8001_access.log  main;

     error_log  /var/8001_error.log;

     location / {

         root   /var;

         index  index.html index.htm;

         autoindex  on;

         autoindex_exact_size  on;

         autoindex_localtime  on;

        deny   192.168.10.1;

        deny   192.168.20.1;

        allow   all;

     }

}

2步,重启nginx服务,在物理机上做访问测试(elinks是用q键退出)

nginx   -t  &&  nginx   -s  reload

elinks   192.168.10.25:8001   (elinks是用q键退出)

firefox   192.168.10.25:8001 

 

 

nginx身份认证

基于Basic Auth认证

Nginx提供HTTPBasic Auth功能,配置了Basic Auth之后,需要输入正确的用户名和密码之后才能正确的访问网站。

我们使用htpasswd来生成密码信息,首先要安装httpd-tools,在httpd-tools中包含了htpasswd命令。

Basic Auth配置代码

server {

     listen       8001;

     #listen       somename:8001;

     server_name  www.8001.com  8001   8001.com;

     access_log  /var/8001_access.log  main;

     error_log  /var/8001_error.log;

     location / {

         root   /var;

         index  index.html index.htm;

        auth_basic "Restricted";     基本身份认证对话框的名称

        auth_basic_user_file   /etc/nginx/.htpasswd;     用户账号文件

     }

}

 

实例:对上前面例子中8000端口的网站(/var目录共享)Basic Auth基本身份认证。只有当用户输入正确的账号和密码才能访问共享。

1步,安装httpd-tools软件包。软件包中带有htpwd命令,用来生成用户认证账号文件。

yum   install  -y  httpd-tools

2步,用htpasswd创建用户和密码。创建用户lucytomjim。密码都为01

htpasswd  -bmc  /etc/nginx/.htpwd  lucy   01

htpasswd  -bm  /etc/nginx/.htpwd  tom  01

htpasswd  -bm  /etc/nginx/.htpwd  jim  01

cat  /etc/nginx/.htpwd

3步,修改8001.conf配置文件,设置认证功能。vi  /etc/nginx/conf.d/8001.conf

server {

     listen       8001;

     #listen       somename:8001;

     server_name  www.8001.com  8001   8001.com;

     location / {

         root   /var;

         index  index.html index.htm;

         autoindex  on;

         autoindex_exact_size  on;

         autoindex_localtime  on;

        auth_basic  "Restricted";

        auth_basic_user_file   /etc/nginx/.htpwd;

     }

}

4步,重启nginx服务,在物理机或虚拟机本地做访问测试(elinks是用q键退出)

nginx   -t  &&  nginx   -s  reload

elinks   192.168.10.25:8001   (elinks是用q键退出)

firefox   192.168.10.25:8001 

curl  192.168.10.25:8001  -u  lucy:01

 

 

 

nginx.conf配置文件功能汇总

配置文件目录

/usr/local/nginx/conf/nginx.conf

http基础配置/usr/local/nginx/conf/nginx.conf-> http{}

server_tokens默认值是on,表示显示版本信息,设置server_tokens值是off,就可以在所有地方隐藏nginx的版本信息。

gzip压缩技术/usr/local/nginx/conf/nginx.conf-> http{}

gzip    on;
gzip_min_length    1024;
gzip_buffers    4    16k;
gzip_http_version    1.1;
gzip_vary    on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

负载均衡&反向代理

http{}
upstream    servers {
    server  192.168.20.11:80  max_fails=2  fail_timeout=60s  weight=1;
    #none;    轮询(weight决定,默认为1)
    #ip_hash;    客户端ip请求hash均衡
    #fair;    自动分配到服务器
    #url_hash;    当前请求的hash均衡
 
    #weight;权重,值越高负载越大
    server URL weight = 5;
    #backup;备份机,只有非备份机全部挂掉情况下,才启动
    server URL backup;
    #down;停机标志,不会被访问,临时升级维护
    server URL down;
    #max_fails;达到指定次数认为服务器挂掉,并终止此接受访问
    #fail_timeout;服务器挂掉多久后再去尝试是否已恢复
    server URL max_fails=2 fail_timeout=60s;
}
 
location / {
    proxy_pass http://servers;
 
    #以下是一些反向代理的配置,可选。
    proxy_redirect off; #如果需要修改从被代理server传来的应答头中的"Location"和"Refresh"字段,可以用这个指令设置。
    proxy_next_upstream  http_500 http_502 http_503 error timeout invalid_header;   #指定故障转移策略,当后端节点返回500,502,503,等执行超时错误时,自动将请求转发到upstream组的另一台服务器,实现故障转移。
    proxy_set_header X-Real-IP $remote_addr;#记录客户机IP,X-Real-IP变量名,可以随便修改
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
    proxy_set_header Host $host;#指定后端server获取Client的主机名和地址以及代理的真实IP
    client_max_body_size 10m; #允许客户端请求的最大单文件字节数
    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服务器传
}

缓存配置(/usr/local/nginx/conf/nginx.conf-> http{} - server{}

location~ .*\.(jpg|png|gif)$ {
    #配置到图片上级目录
    #如页面访问的是http://127.0.0.1/public/6DD309BF50C11AC5DE277A5F5C147330.png
    #配置为root D:\\_webapp\\ParityPlatform\\WEB-INF\\classes\\static;
    #完整路径如下D:\_webapp\ParityPlatform\WEB-INF\classes\static\public\6DD309BF50C11AC5DE277A5F5C147330.png
    root /app/webapps/;
    # 2天后自动清除缓存
    expires    2d;
}
 
location~ .*\.(js|css)$ {
    root /app/webapps/;
    expires    1h;
}

查看Nginx状态配置

#设定查看Nginx状态的地址
location /NginxStatus {
    # Turn on nginx stats
    stub_statuson;
    # I do not need logs for stats
    access_log   off;
    # Security: Only allow access from 192.168.1.100 IP #
    #allow 192.168.1.100;
    # Send rest of the world to /dev/null #
    #deny all;
}

负载均衡时session处理

1. 利用nginx中upstream为ip_hash策略(简单快速,业务场景允许非重要性)
2. 网络广播session同步(缺陷:数据量大时性能低下、网络容易造为性能瓶颈、集群环境中容器过多时性能下降)
  2.1 tomcat中,/tomcat/conf/server.xml
        <Enginename=“”。。。>
          添加如下代码
          `<ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster" />`
          <!-- <channel>...</channel> 对应配置信息,防止一台服务器多个tomcat造成异常-->
        </Engine>
  2.2 在应用添加信息,通知tomcat/告知应用是处于集群环境中,支持分布式部署
         应用的web.xml中添加如下
           `<distributable />`
3. 共享空间保存session信息(分布式缓存技术【redis\memcached】)
    3.1 安装memcached

 

 

Nginx反向代理+负载均衡(案例)

 

HttpProxyModule      代理模块

HttpUpstreamModule   负载均衡模块

注:以上两个模块为Nginx默认加载模块。

 

反向代理(Reverse Proxy)方式是指以前端的代理服务器来接受internet上的连接请求,然后将请求转发给后端内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。


整体思路构架:

nginx.conf全局设置

http {

         upstream  backend {  定义一个名称为backend的服务器池

                   server  192.168.20.11;

                   server  192.168.20.12;

                   server  192.168.20.13;

                   ....

         }

         server{

                   listen  80;    #监听端口

                   server_name  www.up.com;     #nginx调度器FQDN域名

                   location  /  {

                            proxy_pass  http://backend;      代理转发给名称为backend的服务器池

                            proxy_set_header  X-Real-IP $remote_addr;   #记录客户端真实IP

                            proxy_set_header  Host  $Host;       #记录代理服务器IP

                            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;   #记录上一级代理服务器IP

                   }

         }

}       

说明:可以用upstream指令定义多个不同名称的服务器池,将不同域名的网站调度给不同的后端web服务器池。

 

实施步骤:

1、  环境搭建

3web主机IP信息

功能

安装软件

IP地址

主机名

调度器

nginx

eth0192.168.10.25

eth1192.168.20.8

node25.example.com

Web1

nginxapache

192.168.20.11

node11.example.com

Web2

nginxapache

192.168.20.12

node12example.com

 

wKioL1mY8jrDoMpWAACamhq9N3k355.png

 

2、  调度器设置

vim  /usr/local/nginx/conf/nginx.conf

http {    找到此行,添加如下绿色内容

         upstream  servers {

                   server  192.168.20.11:80  max_fails=3 fail_timeout=30s  weight=1;

                   server  192.168.20.12:80  max_fails=3 fail_timeout=30s  weight=2;

                   server  192.168.20.13:80  max_fails=3 fail_timeout=30s  weight=3;

         }

         server{

                   listen  8088;

                   server_name  www.up.com;

                   location  /  {

                            proxy_pass  http://servers;

                            proxy_set_header  X-Real-IP $remote_addr;

                            proxy_set_header  Host  $Host;

                            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

                   }

         }

 

说明:1max_fails=3fail_timeout=30s是对后端服务器做健康检测,weight是权重,数字越大优先级越高。

2max_fails是错误的最大次数。fail_timeout是指max_fails次后的暂停时间。

3、  后端web服务器设置

说明:后端的web服务器分别为192.168.20.11192.168.20.12,我们用apache实现。

 

 

web1服务器192.168.20.11执行以下任务(复制代码执行)

yum  install   -y   httpd

echo  "ServerName  www.up.com"  >  /etc/httpd/conf.d/srv.conf

service  httpd   restart

chkconfig  httpd   on

echo  "www.up11.com"  > /var/www/html/index.html

curl  127.0.0.1

 

web1服务器192.168.20.12执行以下任务(复制代码执行)

yum  install   -y   httpd

echo  "ServerName  www.up.com"  >  /etc/httpd/conf.d/srv.conf

service  httpd   restart

chkconfig  httpd   on

echo  "www.up12.com"  > /var/www/html/index.html

curl  127.0.0.1

 

 

4、  客户端访问测试。

1步:修改hosts文件。

vim   /etc/hosts  添加如下内容

192.168.10.25   www.up.com

测试:ping  -c  2  www.up.com

 

2步:访问调度器。

curl   192.168.10.25           curl   www.up.com

curl   192.168.10.25           curl   www.up.com

firefox  192.168.10.25  &      firefox www.up.com  &

说明:在firefox浏览器中刷新操作,看到页面有变化说明负载均衡调度成功

HTTP协议的header头部字段,常见的如下:

X-Real-IP

<转发请求>中,设置:记录真实发出请求的客户端IP地址$remote_addr客户端IP变量)。

如: <客户端请求头>中的<X-Real-IP>信息,被添加了<192.168.100.2\r\n>客户端真实IP地址)

Host

<转发请求>中,设置:HTTPheader头部的Host值。$Host是记录代理服务器的IP

如果<不设置proxy_set_header Host>,则:

       <客户端请求头><HOST>信息,默认等于<proxy_pass指令值>,如<Host: 192.168.100.12\r\n>后端服务器IP地址)

如果<设置proxy_set_header Host  $Host>,则:

       <客户端请求头><HOST>信息,被设置为<代理服务器IP地址>,如<Host: 192.168.100.11\r\n>代理服务器IP地址)

X-Forwarded-For

<转发请求>中,设置:记录上一级代理服务器IP地址($proxy_add_x_forwarded_for变量)。

X-Forwarded-For头信息可以有多个,中间用逗号分隔,第一个为真实的客户端ip,剩下的就是曾经经过的代理或负载均衡的ip地址,经过几个就会出现几个。

如: <客户端HTTP请求头>中的<X-Forwarded-For>信息,被添加了<X-Forwarded-For: 192.168.100.2\r\n>

5、抓包分析

## 在后端服务器上(192.168.20.11)执行tcpdump -i eth0 -w tcp.pcap,然后用Wireshark来查看分析tcp.pcap文件

推送tcp.pcap包文件到物理:scp   tcp.pcap root@192.168.20.1:/root/

#yum  install  -y  wireshark   wireshark-gnome

#wireshark  &   如下图


##抓到的tcp.pcap内容如下:

Hypertext Transfer Protocol

    GET / HTTP/1.0\r\n

    X-Real-IP: 192.168.10.1\r\n  

    Host: 192.168.20.8\r\n

    X-Forwarded-For: 192.168.10.1\r\n

    Connection: close\r\n

    Accept: text/html, application/xhtml+xml, image/jxr,*/*\r\n

    Accept-Language: zh-CN\r\n

    Accept-Encoding: gzip, deflate\r\n

    DNT: 1\r\n

    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64;Trident/7.0; rv:11.0) like Gecko LBBROWSER\r\n

    If-Modified-Since: Sat, 22 Oct 2016 02:31:03GMT\r\n

    If-None-Match: "580acf67-264"\r\n

    \r\n

    [Full request URI: http://192.168.10.1/]

    [HTTP request 1/1]

    [Response in frame: 58]

 

nginxhttps功能

nginx中文文档:http://www.nginx.cn/doc/

官方文档:http://www.nginx.cn/doc/optional/ssl.html

待续。。。





      本文转自rshare 51CTO博客,原文链接:http://blog.51cto.com/1364952/1957763,如需转载请自行联系原作者






网友评论

登录后评论
0/500