nginx解决方案

1.方案场景

现有多台应用服务器,要实现所有的访问先访问到反向代理服务器上再转内部对应的应用。

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简而言之就是隐藏所有的服务器,与之相对的是正向代理,如我们常用的vpn,目的是隐藏访问客户端。

我们在这里打算采用Nginx作为方向代理的服务器

2.什么是nginx

Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

在高连接并发的情况下,Nginx是Apache服务器不错的替代品。

3.nginx安装

在/usr/local/src下进行,否则后面会编译错误

3.1 安装编译工具和库文件

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

3.2 安装PCRE

PCRE 作用是让 Nginx 支持 Rewrite 功能。

下载 PCRE 安装包,下载地址: http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz

wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz

解压安装包

tar zxvf pcre-8.35.tar.gz

进入安装包目录

cd pcre-8.35

编译安装

./configure
make && make install

查看pcre版本

 pcre-config --version

若有版本显示,表明安装成功

3.3 安装Nginx

下载 Nginx,下载地址:http://nginx.org/download/nginx-1.6.2.tar.gz

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

解压安装包

tar zxvf nginx-1.6.2.tar.gz

进入安装包目录

 cd nginx-1.6.2

编译安装

./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
make
make isntall

注意,编译安装的路径要按照实际安装的路径来,本次是在/usr/local/src下

查看nginx版本

/usr/local/webserver/nginx/sbin/nginx -v

若有版本显示,表明安装成功

4.nginx的配置

nginx的配置文件在/usr/local/webserver/nginx/conf/nginx.conf下,我们只要修改nginx.conf的内容就可以修改Nginx的配置

配置文件的格式如下

main # 全局设置
events { # Nginx工作模式
....
}
http { # http设置
....
upstream myproject { # 负载均衡服务器设置
.....
}
server { # 主机设置
....
location { # URL匹配
....
}
}
server {
....
location {
....
}
}
....
}

4.1 main模块

main区域是一个全局设置

#user 来指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。
user nobody;
#指定了Nginx要开启的子进程数。每个Nginx进程平均耗费10M~12M内存。根据经验,一般指定1个进程就足够了,如果是多核CPU,建议指定和CPU的数量一样的进程数即可。我这里写2,那么就会开启2个子进程,总共3个进程。
worker_processes 1; #error_log 来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
#pid 来指定进程id的存储文件位置。
pid logs/nginx.pid;

4.2 events模块

events模块来用指定nginx的工作模式和工作模式及连接数上限,一般是这样

events {
use kqueue; #用来指定Nginx的工作模式
#指定Nginx的单个进程的最大连接数,即接收到的前端的最大请求数,默认为1024
worker_connections 1024;
}

4.3 http模块

http是Nginx的核心模块,它负责http服务器相关属性的配置,里面的server和upstream子模块至关重要,我们在设置方向代理、负债均衡以及虚拟目录等的时候,就是依赖于这两个模块的配置

http {
#设定mime类型,类型由mime.type文件定义
include /etc/nginx/mime.types;
#设定了默认的类型为二进制流,也就是当文件类型未定义时使用这种方式
default_type application/octet-stream; #用于设置日志的格式,和记录哪些参数,这里设置为main,刚好用于access_log来纪录这种类型。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#设定日志文件,后面的main是日志的格式样式,对应于log_format的main。
access_log /var/log/nginx/access.log main; #用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞。
sendfile on;
tcp_nopush on;
tcp_nodelay on; #设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。
keepalive_timeout 10; #设定负载均衡的服务器列表
upstream load_balance_server {
......
} #HTTP服务器
server {
......
}
}

4.3.1 upstream模块

upstream主要负责负载均衡,通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。

upstream test.com{
ip_hash;
server 123.206.117.62:80;
server 123.206.117.62:80 down;
server 123.206.117.62:8080 max_fails=3 fail_timeout=20s;
server 123.206.117.62:8080;
}
  • 上面的代码,test.com是upstream指定的负载均衡器的名称,这个名称可以任意指定,在后面需要的地方直接调用即可。

  • ip_hash这是其中的一种负载均衡调度算法,Nginx的负载均衡模块目前支持4种调度算法:

  1. weight 轮询(默认)。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。weight。指定轮询权值,weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。

  2. ip_hash。每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。

  3. fair(第三方)。比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。

  4. url_hash(第三方)。按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx的hash软件包。

  • server指定的是各种服务器,包括服务器的ip、端口以及每个后端服务器在负载均衡中的状态,常用的状态有:
  1. down,表示当前的server暂时不参与负载均衡。
  2. backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
  3. max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
  4. fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。

注意:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。其它情况可以是weight,表示负载的权重,默认为1,weight越大,权重越大。

4.3.2 server模块

server模块是http的子模块,它用来定一个虚拟主机,它的基本配置如下

server {
#指定虚拟主机的服务端口
listen 8080;
#用来指定IP地址或者域名,多个域名之间用空格分开。
server_name localhost 123.206.117.62 www.test.com;
# 全局定义,如果都是这一个目录,这样定义最简单。
root /Users/marscheng/www; #示在这整个server虚拟主机内,全部的root web根目录。注意要和locate {}下面定义的区分开来。
index index.php index.html index.htm; #全局定义访问的默认首页地址。注意要和locate {}下面定义的区分开来。
charset utf-8;#网页的默认编码格式
#用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式
access_log usr/local/var/log/host.access.log main;
#错误日志文件
error_log usr/local/var/log/host.error.log error;
#用于定位的配置
location / {
....
} }

location模块

location模块一般是在server中定义的,它在Nginx中用的最多,无论是负载均衡、反向代理还是虚拟域名,都跟它的配置有关。

location是用来定位,解析url,定位URL,所以,它也提供了强大的正则匹配功能,也支持条件判断匹配,用户可以通过location指令实现Nginx对动态、静态网页进行过滤处理。

  1. 设定默认首页和虚拟机目录
location / {
#指令用于指定访问根目录时,虚拟主机的web目录,这个目录可以是相对路径(相对路径是相对于nginx的安装目录)。也可以是绝对路径。
root /Users/marscheng/www;
#用于设定我们只输入域名后访问的默认首页地址,有个先后顺序:index.php index.html index.htm,如果没有开启目录浏览权限,又找不到这些默认首页,就会报403错误。
index index.jsp index.html index.htm;
}
  1. 用正则表达式匹配
location ~ \.html$ { #匹配.html结尾的URL,用来解析html文件。里面的root也是一样,用来表示虚拟主机的根目录。
root /Users/marscheng/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.html;
include fastcgi.conf;
}

这里只是简单介绍,详细的配置可以参考这篇文章:

http://seanlook.com/2015/05/17/nginx-location-rewrite/

网上还有一篇介绍Nginx比较好的,文章,地址如下:

http://www.jianshu.com/p/bed000e1830b

5.方案设计

根据场景设计了如下的配置方案:

http {
#此处省略一些基本配置 upstream product_server{
server 9.236.2.35:8081;
} upstream admin_server{
server 9.236.2.36:8082;
} upstream finance_server{
server 9.236.2.37:8083;
} server {
#此处省略一些基本配置
#根据不同正则匹配默认指向不同的的server
location / {
proxy_pass http://product_server;
} location /product/{
proxy_pass http://product_server;
} location /admin/ {
proxy_pass http://admin_server;
} location /finance/ {
proxy_pass http://finance_server;
}
}
}

nginx解决方案的更多相关文章

  1. Keepalived+Nginx解决方案实现高可用的API网关(nginx)

    一. 采用Keepalived+Nginx解决方案实现高可用的API网关. 2.1 Nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP ...

  2. 采用Keepalived+Nginx解决方案实现高可用的API网关(下)

    1 Keepalived 3.1Keepalived介绍 Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx ...

  3. nginx开启后主机无法访问虚拟机的nginx解决方案

    如果IP可以通的话 一般是防火墙引起 方法1.cat /etc/sysconfig/iptables # Generated by iptables-save v1. :: *filter :INPU ...

  4. nginx,控浏览器缓存,前端优化方案

    1,困惑 做web项目,对于开发者来说,一个最头痛的问题就是浏览器缓存,有缓存,js更改了,html更改了,发布服务器以后用户往往无法通过浏览器访问到最新的类容,需要用户主动去刷新页面, 因为一直做企 ...

  5. 转载:负载均衡器技术Nginx和F5的优缺点对比

    https://blog.csdn.net/zxc456733/article/details/78861100 nginx(一) nginx详解 nginx是一个被广泛使用的集群架构组件,我们有必要 ...

  6. 记录一次Nginx跳转报错的问题

    错误信息如下: An error occurred. Sorry, the page you are looking for is currently unavailable. Please try ...

  7. nginx(一) nginx详解

    nginx是一个被广泛使用的集群架构组件,我们有必要对它有足够的了解.下面将先认识nginx:包括应用场景.nginx基本架构.功能特性.并发模型以及配置说明,最后我们再总结下,为什么选择nginx的 ...

  8. Spring Boot 利用 nginx 实现生产环境的伪热更新

    当我们在服务器部署Java程序,特别是使用了 Spring Boot 生成单一 Jar 文件部署的时候,单一文件为我们开发单来的极大的便利性,保障程序的完整性.但同时对我们修改程序中的任何一处都带来重 ...

  9. linux中nginx、mysql安装碰到的问题

    服务器到期新买了一台服务器,记录一下重新安装基本环境碰到了一些问题 安装nginx 1. 启动失败 403 forbidden nginx 解决方案:(个人使用直接用了root账号,修改对应nginx ...

随机推荐

  1. 关于用css实现文本和图片垂直水平居中

    关于用css实现文本和图片垂直水平居中   一直相信好记性不如烂笔头,最近遇到很多用到垂直居中的,整理一下以便日后查阅. 一.文本垂直水平居中 1.水平居中: 文字水平居中没什么好说的,用text-a ...

  2. 关于ASP.NET WebForm与ASP.NET MVC的比较

      WebForm的理解 1. WebForm概念 ASP.NETWebform提供了一个类似于Winform的事件响应GUI模型(event-drivenGUI),隐藏了HTTP.HTML.Java ...

  3. React-Native集成到已有项目中的总结

    安装Python 从官网下载并安装python 2.7.x(3.x版本不行) 安装node.js 从官网下载node.js的官方V6.X.X版本或更高版本.安装完成后检测是否安装成功:node -v ...

  4. 用java来实现验证码功能(本帖为转载贴),作为个人学习收藏用

    一.关于为何使用验证的解释 在目前的网页的登录.注册中经常会见到各种验证码.其目的便是为了:防止暴力破解  .因为只要CPU性能较强,便可以在慢慢尝试密码的过程中来破解用户账号,因而导致的结果是用户信 ...

  5. selenium+python元素操作

    1.判断元素的属性if i.get_attribute('type') == 'checkbox' 2.获取当前窗口的坐标 driver.get_window_position 获取当前窗口的长宽 d ...

  6. 编写一个简单的Web Server

    编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...

  7. 信号处理——卷积(convolution)的实现

    作者:桂. 时间:2017-03-07  22:33:37 链接:http://www.cnblogs.com/xingshansi/p/6517301.html 前言 信号时域.频域对应关系,及其D ...

  8. 初学unslider

    1.关于unslider下载 官方提供的下载页面是http://www.bootcss.com/p/unslider/,但总是进不了下载页面,所以我就查看主页的源码,找到unslider.min.js ...

  9. dd的用法

    1.生成一个空的,大小为1G的文件(有洞的文件)$ dd if=/dev/zero of=winxp.img bs=1k seek=1024k count=1 2.读软盘,并以16进制保存到文件中#d ...

  10. Jmeter元件运行顺序

    JMeter执行顺序逻辑如下: 1.配置元件(如果存在) 2.前置处理器(如果存在) 3.定时器(如果存在) 4.取样器(如果存在) 5.后置处理器(如果存在且取样器的结果不为空) 6.断言(如果存在 ...