Nginx反向代理 负载均衡sky

简介:

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,如需转载请自行联系原作者






相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
7天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
25 0
|
1月前
|
负载均衡 应用服务中间件 Linux
|
2月前
|
tengine Rust 负载均衡
反向代理学习笔记(一) Nginx与反向代理绪论
反向代理学习笔记(一) Nginx与反向代理绪论
|
2月前
|
负载均衡 Java 应用服务中间件
|
2月前
|
负载均衡 监控 应用服务中间件
Nginx负载均衡:你的网站流量翻倍利器
Nginx负载均衡:你的网站流量翻倍利器
39 0
|
2月前
|
消息中间件 关系型数据库 MySQL
使用Nginx的stream模块实现MySQL反向代理与RabbitMQ负载均衡
使用Nginx的stream模块实现MySQL反向代理与RabbitMQ负载均衡
57 0
|
3月前
|
负载均衡 算法 前端开发
Ngnix之反向代理、负载均衡、动静分离
Nginx是一个高性能的开源Web服务器,它还可以用作反向代理、负载均衡器以及动静分离的工具。
|
缓存 运维 负载均衡
Nginx专题(2):Nginx的负载均衡策略及其配置
本文介绍了Nginx的负载均衡策略,一致性hash分配原理,及常用的故障节点的摘除与恢复配置。
|
8月前
|
负载均衡 应用服务中间件 Linux
百度搜索:蓝易云【Centos7系统Nginx负载均衡如何安装和配置?】
在本文中,我们将介绍如何在CentOS 7系统中安装和配置Nginx负载均衡。本教程适用于初学者和经验丰富的用户。
119 0
|
10月前
|
缓存 负载均衡 应用服务中间件
Nginx+Tomcat 反向代理负载均衡 配置 学习(1)
Nginx+Tomcat 反向代理负载均衡 配置学习 #user nobody; worker_processes 1;
118 0