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. java实现文件批量导入导出实例(兼容xls,xlsx)

    1.介绍 java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下. 目前我所接触过的导入导出技术主要有POI和iRepo ...

  2. JS 使用 splice() 对数组去重

    一 问题 有如下 js 数组 connect_clients,需要在去掉所有元素中 user_id, goods_id 这两者的值都相同的元素. [ { id: 'eff040fb-92bc-4f24 ...

  3. 生成JSON数据--官方方法

    官方生成方法: 1)需要什么就给什么,要属性就给属性,要对象就给对象,要集合就给集合 2)添加都是使用put()方法 要求: 1.生成如下JSON数据: {"age":4,&quo ...

  4. Java之枚举

    1.定义 enum 是一种数据类型,与 全局常量比较相似,都是全局的并且是可以通过类名调用的 与全局常量区别 枚举功能更强大,可以有属性和方法 枚举比全局常量更加的规范 2.枚举特性 1)可以有属性以 ...

  5. jQuery UI 入门之实用实例

    jQuery UI 入门 jQuery UI 简介 jQuery UI 是一个建立在 jQuery JavaScript 库上的小部件和交互库,您可以使用它创建高度交互的 Web 应用程序.无论您是创 ...

  6. cs6安装

    [按下面步骤操作 无需序列号] ·打上补丁 永远无需序列号 (现在网上没什么能用的序列号) ·1双击CS软件安装,选择试用 ·2创建ID 输入自己邮箱和密码,姓名可以随意输入 ·3安装完成后 运行一次 ...

  7. HTML面试题

    1.你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? 所谓的“浏览器内核”无非指的是一个浏览器最核心的部分-“Rendering Engine”,直译叫做“渲染引擎”,我们也常称为“排版引擎 ...

  8. Vulkan Tutorial 11 Shader modules

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 与之前的图像API不同,Vulkan中的着色器代码必须以二进制字节码的格式使用,而不 ...

  9. php注册登录源代码

    php注册登录源代码 链接数据库<?php$conn=mysql_connect('localhost','root','');mysql_select_db('ht',$conn);mysql ...

  10. 基于Petri网的工作流分析和移植

    基于Petri网的工作流分析和移植 一.前言 在实际应用场景,包括PEC的订单流程从下订单到订单派送一直到订单完成都是按照一系列预先规定好的工作流策略进行的. 通常情况下如果是采用面向过程的编程方法, ...