Openresty最佳案例 | 第4篇:OpenResty常见的api

获取请求参数

vim /usr/example/example.conf
 location /lua_var {
        default_type 'text/plain';
        content_by_lua_block {
         ngx.say(ngx.var.arg_a)
        }
   }

重新加载nginx配置文件: nginx -s reload

在浏览器上访问http://116.196.177.123/lua_var?a=323,浏览器显示:

323

在上述代码中,涉及到了2个api, 一是ngx.say(直接返回请求结果);二是ngx.var,它是获取请求的参数,比如本例子上的?a=323,获取之后,直接输出为请求结果。

获取请求类型

vim /usr/example/example.conf
  location /lua_request{
       default_type 'text/html';
       lua_code_cache off;
       content_by_lua_file  /usr/example/lua/lua_request.lua;
   }

vim /usr/example/lua/lua_request.lua ,添加一下代码:

local arg = ngx.req.get_uri_args()
for k,v in pairs(arg) do
   ngx.say("[GET ] key:", k, " v:", v)
end

ngx.req.read_body() -- 解析 body 参数之前一定要先读取 body
local arg = ngx.req.get_post_args()
for k,v in pairs(arg) do
   ngx.say("[POST] key:", k, " v:", v)
end

在上述例子中有以下的api:

  • ngx.req.get_uri_args 获取在uri上的get类型参数,返回的是一个table类型的数据结构。
  • ngx.req.read_body 读取body,这在解析body之前,一定要先读取body。
  • ngx.req.get_post_args 获取form表单类型的参数,返回结果是一个table类型的数据。
    使用curl模拟请求:
curl ‘http://116.196.177.123/lua_request?a=323&b=ss’ -d ‘c=12w&d=2se3’

返回的结果:

[GET ] key:b v:ss
[GET ] key:a v:323
[POST] key:d v:2se3
[POST] key:c v:12w

获取请求头

vim /usr/example/lua/lua_request.lua ,在原有的代码基础上,再添加一下代码:

local headers = ngx.req.get_headers()
ngx.say("headers begin", "<br/>")
ngx.say("Host : ", headers["Host"], "<br/>")
ngx.say("user-agent : ", headers["user-agent"], "<br/>")
ngx.say("user-agent : ", headers.user_agent, "<br/>")
for k,v in pairs(headers) do
    if type(v) == "table" then
        ngx.say(k, " : ", table.concat(v, ","), "<br/>")
    else
        ngx.say(k, " : ", v, "<br/>")
    end
end

重新加载nginx -s reload

使用curl模拟请求:

curl ‘http://116.196.177.123/lua_request?a=323&b=ss’ -d ‘c=12w&d=2se3’
[GET ] key:b v:ss
[GET ] key:a v:323
[POST] key:d v:2se3
[POST] key:c v:12w
headers begin<br/>
Host : 116.196.77.157<br/>
user-agent : curl/7.53.0<br/>
user-agent : curl/7.53.0<br/>
host : 116.196.77.157<br/>
content-type : application/x-www-form-urlencoded<br/>
accept : */*<br/>
content-length : 12<br/>
user-agent : curl/7.53.0<br/>

获取http的其他方法

vim /usr/example/lua/lua_request.lua ,在原有的代码基础上,再添加一下代码:

ngx.say("ngx.req.http_version : ", ngx.req.http_version(), "<br/>")  
--请求方法  
ngx.say("ngx.req.get_method : ", ngx.req.get_method(), "<br/>")  
--原始的请求头内容  
ngx.say("ngx.req.raw_header : ",  ngx.req.raw_header(), "<br/>")  
--请求的body内容体  
ngx.say("ngx.req.get_body_data() : ", ngx.req.get_body_data(), "<br/>")  
ngx.say("<br/>") 

重新加载nginx -s reload

使用curl模拟请求:

curl ‘http://116.196.177.123/lua_request?a=323&b=ss’ -d ‘c=12w&d=2se3’
//....
ngx.req.http_version : 1.1<br/>
ngx.req.get_method : POST<br/>
ngx.req.raw_header : POST /lua_request?a=323&b=ss HTTP/1.1
Host: 116.196.77.157
User-Agent: curl/7.53.0
Accept: */*
Content-Length: 12

输出响应

vim /usr/example/example.conf,添加一个location,代码如下:

 location /lua_response{
        default_type 'text/html';
        lua_code_cache off;
        content_by_lua_file /usr/example/lua/lua_response.lua ;
  }

vim /usr/example/lua/lua_response.lua 添加一下代码:

ngx.header.a="1"
ngx.header.b={"a","b"}
ngx.say("hello","</br>")
ngx.print("sss")
return ngx.exit(200)

上述代码中有以下api:

  • ngx.header 向响应头输出内容
  • ngx.say 输出响应体
  • ngx.print输出响应体
  • ngx.exit 指定http状态码退出

使用curl模拟请求, curl ‘http://116.196.177.123/lua_response’ ,获取的响应体如下:

hello
sss

日志输出

在配置文件vim /usr/example/example.conf 加上以下代码:

 location /lua_log{
       default_type 'text/html';
       lua_code_cache off;
       content_by_lua_file  /usr/example/lua/lua_log.lua;
  }

vim /usr/example/lua/lua_log.lua ,加上以下代码:

local log="i'm log"
local num =10
ngx.log(ngx.ERR, "log",log)
ngx.log(ngx.INFO,"num:" ,num)

重新加载配置文件nginx -s reload

curl ‘http://116.196.177.123/lua_log’

打开nginx 的logs目录下的error.log 文件:

tail -fn 1000 /usr/servers/nginx/logs/error.log

可以看到在日志文件中已经输出了日志,这种日志主要用于记录和测试。

日志级别:

  • ngx.STDERR – 标准输出
  • ngx.EMERG – 紧急报错
  • ngx.ALERT – 报警
  • ngx.CRIT – 严重,系统故障,触发运维告警系统
  • ngx.ERR – 错误,业务不可恢复性错误
  • ngx.WARN – 告警,业务中可忽略错误
  • ngx.NOTICE – 提醒,业务比较重要信息
  • ngx.INFO – 信息,业务琐碎日志信息,包含不同情况判断等
  • ngx.DEBUG – 调试

内部调用

vim /usr/example/example.conf 添加以下代码:

location /lua_sum{
      # 只允许内部调用
      internal;
      # 这里做了一个求和运算只是一个例子,可以在这里完成一些数据库、
      # 缓存服务器的操作,达到基础模块和业务逻辑分离目的
      content_by_lua_block {
         local args = ngx.req.get_uri_args()
         ngx.say(tonumber(args.a) + tonumber(args.b))
      }
  }

internal 关键字,表示只允许内部调用。使用curl模拟请求,请求命令如下:

$ curl ‘http://116.196.177.123/lua_sum?a=1&b=2’

由于该loction是一个内部调用的,外部不能返回,最终返回的结果为404,如下:

<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>openresty/1.11.2.4</center>
</body>
</html>

vim /usr/example/example.conf 添加以下代码:

location = /lua_sum_test {
   content_by_lua_block {
      local res = ngx.location.capture("/lua_sum", {args={a=3, b=8}})
      ngx.say("status:", res.status, " response:", res.body)
   }  
}

上述的代码通过ngx.location.capture去调用内部的location,并获得返回结果,最终将结果输出,采用curl模拟请求:

$ curl ‘http://116.196.177.123/lua_sum_test’

返回结果如下:

status:200 response:11

重定向

vim /usr

location /lua_redirect{
    default_type 'text/html';
    content_by_lua_file  /usr/example/lua/lua_redirect.lua;
}  
ngx.redirect("http://www.fangzhipeng.com", 302)

http://116.196.177.123/lua_redirect

共享内存

vim /usr/servers/nginx/cong/nginx.conf

在http模块加上以下:

lua_shared_dict shared_data 1m;
 location /lua_shared_dict{
     default_type 'text/html';
     content_by_lua_file /usr/example/lua/lua_shared_dict.lua;
  }
local shared_data = ngx.shared.shared_data
local i = shared_data:get("i")
if not i then
  i = 1
  shared_data:set("i",i)
end
i = shared_data:incr("i",1)
ngx.say("i:",i)

多次访问 http://116.196.177.123/lua_shared_dict,浏览器打印:

i:1
i:2
i:3
i:4
i:5

OpenResty执行阶段的概念

以下内容来自于《openresty 最佳实践》

未分类

如上图所示,openresty的执行阶段分为

这样我们就可以根据我们的需要,在不同的阶段直接完成大部分典型处理了。

  • set_by_lua* : 流程分支处理判断变量初始化
  • rewrite_by_lua* : 转发、重定向、缓存等功能(例如特定请求代理到外网)
  • access_by_lua* : IP 准入、接口权限等情况集中处理(例如配合 iptable 完成简单防火墙)
  • content_by_lua* : 内容生成
  • header_filter_by_lua* : 响应头部过滤处理(例如添加头部信息)
  • body_filter_by_lua* : 响应体过滤处理(例如完成应答内容统一成大写)

执行阶段概念:

  • log_by_lua* : 会话完成后本地异步完成日志记录(日志可以记录在本地,还可以同步到其 他机器)
    实际上我们只使用其中一个阶段
  • content_by_lua* ,也可以完成所有的处理。但这样做,会让 我们的代码比较臃肿,越到后期越发难以维护。把我们的逻辑放在不同阶段,分工明确,代 码独立,后期发力可以有很多有意思的玩法。

Openresty最佳案例 | 第3篇:Openresty的安装

我的服务器为一台全新的centos 7的服务器,所以从头安装openresty,并记录了安装过程中出现的问题,以及解决办法。

1. 首先安装openresty

cd /usr
mkdir servers
mkdir downloads 

yum install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl 

cd /usr/servers

wget https://openresty.org/download/openresty-1.11.2.4.tar.gz
tar -zxvf openresty-1.11.2.4.tar.gz
cd /usr/servers/bunble/LuaJIT-2.1-20170405

安装Lua
make clean && make && make install  

安装过程中出现以下的错误:

gcc: Command not found

2. 安装gcc

yum -y install gcc automake autoconf libtool make

3. 重新make

make clean && make && make install

ln -sf luajit-2.1.0-alpha /usr/local/bin/luajit  

4. 下载ngx_cache_purge模块,该模块用于清理nginx缓存

cd /usr/servers/ngx_openresty–1.11.2.4/bundle 
wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz 
tar -xvf 2.3.tar.gz

5. 下载nginx_upstream_check_module模块,该模块用于ustream健康检查

cd /usr/servers/ngx_openresty-1.11.2.4/bundle 
wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz 
tar -xvf v0.3.0.tar.gz

6. 重新安装opresty

cd /usr/servers/ngx_openresty-1.11.2.4

./configure --prefix=/usr/servers --with-http_realip_module  --with-pcre  --with-luajit --add-module=./bundle/ngx_cache_purge-2.3/ --add-module=./bundle/nginx_upstream_check_module-0.3.0/ -j2 

提示错误,安装pcre库

yum install -y pcre pcre-devel

gcc 安装

安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:

yum install gcc-c++

PCRE pcre-devel 安装

PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:

yum install -y pcre pcre-devel

zlib 安装

zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。

yum install -y zlib zlib-devel

OpenSSL 安装

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。

nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。

yum install -y openssl openssl-devel

.重新安装OpenResty

cd /usr/servers/ngx_openresty-1.11.2.4

./configure --prefix=/usr/servers --with-http_realip_module  --with-pcre  --with-luajit --add-module=./bundle/ngx_cache_purge-2.3/ --add-module=./bundle/nginx_upstream_check_module-0.3.0/ -j2 

make && make install  

.启动Nginx

/usr/servers/nginx/sbin/nginx

浏览器访问http://116.196.177.123:

Welcome to OpenResty!

If you see this page, the OpenResty web platform is successfully installed and working. Further configuration is required.

For online documentation and support please refer to openresty.org.

Thank you for flying OpenResty.

安装成功了。

6. 配置nginx

vim /usr/servers/nginx/conf/nginx.conf  

错误提示没有安装vim

yum -y install vim*

1、在http部分添加如下配置

lua模块路径,多个之间”;”分隔,其中”;;”表示默认搜索路径,默认到/usr/servers/nginx下找

lua_package_path “/usr/servers/lualib/?.lua;;”; #lua 模块 
lua_package_cpath “/usr/servers/lualib/?.so;;”; #c模块

2、在nginx.conf中的http部分添加include lua.conf包含此文件片段

Java代码 收藏代码

include lua.conf;

在/usr/server/nginx/conf下

vim lua.conf
#lua.conf  
server {  
    listen       80;  
    server_name  _;  

    location /lua {  
    default_type 'text/html';  
        content_by_lua 'ngx.say("hello world")';  
    } 
}  

7. 环境变量

vim /etc/profile
JAVA_HOME=/usr/local/jdk/jdk1.8.0_144
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/dt.jar
export JAVA_HOME JRE_HOME PATH CLASSPATH
export PATH=$PATH:/usr/servers/nginx/sbin

source /etc/profile

测试:

nginx -t

nginx: the configuration file /usr/servers/nginx/conf/nginx.conf syntax is ok 
nginx: configuration file /usr/servers/nginx/conf/nginx.conf test is successful

nginx -s reload

浏览器访问http://116.196.177.123/lua
,浏览器显示:

hello world

8. 将Lua项目化

mkdir /usr/example 
cp -r /usr/servers/lualib/ /usr/example/ 
mkdir /usr/example/lua

cd /usr/example 
vim example.conf
server {  
    listen       80;  
    server_name  _;  

    location /lua {  
        default_type 'text/html';  
        lua_code_cache off;  
        content_by_lua_file /usr/example/lua/test.lua;  
    }  
}
vim /usr/example/lua/test.lua
ngx.say("hello world");  
cd /usr/servers/nginx/conf/
````

vim nginx.conf


http模块:

http {
include mime.types;
default_type application/octet-stream;
lua_package_path “/usr/example/lualib/?.lua;;”; #lua 模块
lua_package_cpath “/usr/example/lualib/?.so;;”; #c模块
include /usr/example/example.conf;
….
….

}


nginx -t

nginx: [alert] lua_code_cache is off; this will hurt performance in /usr/example/example.conf:7
nginx: the configuration file /usr/servers/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/servers/nginx/conf/nginx.conf test is successful


nginx -s reload 浏览器访问http://116.196.177.123/lua ,

hello world


导出history的所有命令:

在你的账户目录下 输入命令
ls -a
找到 .bash_history
这个就是记录命令文件。
输入命令:
cat .bash_history >> history.txt
“`

Openresty最佳案例 | 第2篇:Lua入门

什么是lua

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。
—摘抄 http://www.runoob.com/lua/lua-tutorial.html

环境搭建

注意: 在上一篇文章中,OpenResty已经有了Lua的环境,这里安装的是单独的Lua环境,用于学习和开发Lua。大多数的电脑是Windowds版本的电脑,Windows版本下载地址http://luaforge.net/projects/luaforwindows/。

Linux和Mac电脑下载地址:http://luajit.org/download.html,安装命令如下:

wget http://luajit.org/download/LuaJIT-2.1.0-beta1.tar.gz

tar -xvf LuaJIT-2.1.0-beta1.tar.gz
cd LuaJIT-2.1.0-beta1
make
sudo make install

使用IDEA开发的同学,可以通过安装插件的形式来集成Lua的环境,插件名为EmmyLua,安装插件后,在Idea的右侧栏就会出现Lua的图标,点击图标,就会出现运行Lua代码的窗口。建议使用该插件,可以免去安装Lua环境的麻烦。

第一个Lua程序

安装好环境后,我采用EmmyLua插件的形式,对Lua的入门语法进行一个简单的讲解。
打开EmmyLua的终端,在终端上输入:

print("hi you")

按ctrl+enter,终端显示:

hi you

Lua基本数据类型

lua的基本数据类型有nil、string、boolean、number、function类型。

nil 类型

nil类似于Java中的null ,表示空值。变量第一次赋值为nil。

local num
print(num)
num=100
print(num)

终端输出:

nil

100

number (数字)

Number 类型用于表示实数,和 Java里面的 double 类型很类似。可以使用数学函数
math.floor(向下取整) 和 math.ceil(向上取整) 进行取整操作。

local order = 3.99
local score = 98.01
print(math.floor(order))
print(math.ceil(score))

输出:

3

99

string 字符串

Lua 中有三种方式表示字符串:
1、使用一对匹配的单引号。例:’hello’。
2、使用一对匹配的双引号。例:”abclua
3.字符串还可以用一种长括号(即[[ ]]) 括起来的方式定义

ocal str1 = 'hello world'
local str2 = "hello lua"
local str3 = [["addname",'hello']]
local str4 = [=[string have a [[]].]=]
print(str1) -->output:hello world
print(str2) -->output:hello lua
print(str3) -->output:"addname",'hello'
print(str4) --

table (表)

Table 类型实现了一种抽象的“关联数组”。“关联数组”是一种具有特殊索引方式的数组,索引通常是字符串(string) 或者 number 类型,但也可以是除 nil 以外的任意类型的值。

local corp = {
    web = "www.google.com", --索引为字符串,key = "web",
                              -- value = "www.google.com"
    telephone = "12345678", --索引为字符串
    staff = {"Jack", "Scott", "Gary"}, --索引为字符串,值也是一个表
    100876, --相当于 [1] = 100876,此时索引为数字
            -- key = 1, value = 100876
    100191, --相当于 [2] = 100191,此时索引为数字
    [10] = 360, --直接把数字索引给出
    ["city"] = "Beijing" --索引为字符串
}

print(corp.web) -->output:www.google.com
print(corp["telephone"]) -->output:12345678
print(corp[2]) -->output:100191
print(corp["city"]) -->output:"Beijing"
print(corp.staff[1]) -->output:Jack
print(corp[10]) -->output:36

function(函数)

在 Lua 中,函数 也是一种数据类型,函数可以存储在变量中,可以通过参数传递给其他函
数,还可以作为其他函数的返回值。

local function foo()
   print("in the function")
   --dosomething()
   local x = 10
   local y = 20
   return x + y
end
local a = foo --把函数赋给变量
print(a())

--output:
in the function
30

表达式

~= 不等于

未分类

  • a and b 如果 a 为 nil,则返回 a,否则返回 b;
  • a or b 如果 a 为 nil,则返回 b,否则返回 a。
local c = nil
local d = 0
local e = 100
print(c and d) -->打印 nil
print(c and e) -->打印 nil
print(d and e) -->打印 100
print(c or d) -->打印 0
print(c or e) -->打印 100
print(not c) -->打印 true
print(not d) --> 打印 false

在 Lua 中连接两个字符串,可以使用操作符“..”(两个点).

print("Hello " .. "World") -->打印 Hello World
print(0 .. 1) -->打印 01

控制语句

单个 if 分支 型

x = 10
if x > 0 then
    print("x is a positive number")
end

两个分支 if-else 型

x = 10
if x > 0 then
    print("x is a positive number")
else
    print("x is a non-positive number")
end

多个分支 if-elseif-else 型:

score = 90
if score == 100 then
    print("Very good!Your score is 100")
elseif score >= 60 then
    print("Congratulations, you have passed it,your score greater or equal to 60")
    --此处可以添加多个elseif
else
    print("Sorry, you do not pass the exam! ")
end

for 控制结构

Lua 提供了一组传统的、小巧的控制结构,包括用于条件判断的 if 用于迭代的 while、repeat
和 for,本章节主要介绍 for 的使用.

for 数字型

for 语句有两种形式:数字 for(numeric for) 和范型 for(generic for) 。
数字型 for 的语法如下:

for var = begin, finish, step do
--body
end

实例1:

for i = 1, 5 do
    print(i)
end
-- output:
1 2 3 4 5

实例2:

for i = 1, 10, 2 do
    print(i)
end
-- output:
1 3 5 7 9

for 泛型

泛型 for 循环通过一个迭代器(iterator) 函数来遍历所有值:

-- 打印数组a的所有值

local a = {"a", "b", "c", "d"}
for i, v in ipairs(a) do
    print("index:", i, " value:", v)
end

-- output:
index: 1 value: a
index: 2 value: b
index: 3 value: c
index: 4 value: d

lua的入门就到这里,因为lua语法虽少,但细节有很多,不可能花很多时间去研究这个。入个门,遇到问题再去查资料就行了。另外需要说明的是本文大部分内容为复制粘贴于OPenResty 最佳实践,感谢原作者的开源电子书,让我获益匪浅。更多内容请参考:

lua入门教程:http://www.runoob.com/lua/lua-tutorial.html

OPenResty 最佳实践: https://moonbingbing.gitbooks.io/openresty-best-practices/content/index.html

Openresty最佳案例 | 第1篇:Nginx介绍

Nginx 简介

Nginx是一个高性能的Web 服务器,同时是一个高效的反向代理服务器,它还是一个IMAP/POP3/SMTP
代理服务器。

由于Nginx采用的是事件驱动的架构,能够处理并发百万级别的tcp连接,高度的模块化设计和自由的BSD许可,使得Nginx有着非常丰富的第三方模块。比如Openresty、API网关Kong。

BSD开源协议是一个给予使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。

Nginx的优点

  • 高并发响应性能非常好,官方Nginx处理静态文件并发5w/s
  • 反向代理性能非常强。(可用于负载均衡)
  • 内存和cpu占用率低。(为Apache的1/5-1/10)
  • 对后端服务有健康检查功能。
  • 支持PHP cgi方式和fastcgi方式。
  • 配置代码简洁且容易上手。

Nginx的安装

Centos系统安装,请参考这里http://www.linuxidc.com/Linux/2016-09/134907.htm。先复制粘贴下它的文章。

1. gcc 安装

安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:

yum install gcc-c++

2. PCRE pcre-devel 安装

PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:

yum install -y pcre pcre-devel

3. zlib 安装

zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。

yum install -y zlib zlib-devel

4. OpenSSL 安装

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。

yum install -y openssl openssl-devel

5. 官网下载

(1). 直接下载.tar.gz安装包,地址:https://nginx.org/en/download.html

(2). 使用wget命令下载(推荐)。

wget -c https://nginx.org/download/nginx-1.10.1.tar.gz

6. 解压

依然是直接命令:

tar -zxvf nginx-1.10.1.tar.gz 
cd nginx-1.10.1

7. 配置

其实在 nginx-1.10.1 版本中你就不需要去配置相关东西,默认就可以了。当然,如果你要自己配置目录也是可以的。
使用默认配置

./configure

8. 编译安装

make 
make install

查找安装路径:

whereis nginx

Nginx的模块组成

Nginx的模块从结构上分为核心模块、基础模块和第三方模块:

  • 核心模块:HTTP模块、EVENT模块和MAIL模块
  • 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块,
  • 第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。

Nginx的高并发得益于其采用了epoll模型,与传统的服务器程序架构不同,epoll是linux内核2.6以后才出现的。Nginx采用epoll模型,异步非阻塞,而Apache采用的是select模型。

  • Select特点:select 选择句柄的时候,是遍历所有句柄,也就是说句柄有事件响应时,select需要遍历所有句柄才能获取到哪些句柄有事件通知,因此效率是非常低。
  • epoll的特点:epoll对于句柄事件的选择不是遍历的,是事件响应的,就是句柄上事件来就马上选择出来,不需要遍历整个句柄链表,因此效率非常高。

Nginx常用命令

nginx 环境变量配置:

export PATH=$PATH:/usr/servers/nginx/sbin
  • 查看nginx进程
    ps -ef|grep nginx

  • 启动nginx
    nginx
    启动结果显示nginx的主线程和工作线程,工作线程的数量跟nginx.conf中的配置参数worker_processes有关。

  • 平滑启动nginx
    kill -HUP cat /var/run/nginx.pid
    或者
    nginx -s reload

  • 强制停止nginx
    pkill -9 nginx

  • 检查对nginx.conf文件的修改是否正确
    nginx -t

  • 停止nginx的命令
    nginx -s stop或者pkill nginx

  • 查看nginx的版本信息
    nginx -v

  • 查看完整的nginx的配置信息
    nginx -V

Nginx的配置

通常情况下,Nginx的配置在Ngix的安装目录下的/conf/config.default 文件里,基本配置如下:

worker_process # 表示工作进程的数量,一般设置为cpu的核数

worker_connections # 表示每个工作进程的最大连接数

server{} # 块定义了虚拟主机
    listen # 监听端口
    server_name # 监听域名
    location {} # 是用来为匹配的 URI 进行配置,URI 即语法中的“/uri/”
    location /{} # 匹配任何查询,因为所有请求都以 / 开头
        root # 指定对应uri的资源查找路径,这里html为相对路径,完整路径为
        # /opt/nginx-1.7.7/html/
        index # 指定首页index文件的名称,可以配置多个,以空格分开。如有多
        # 个,按配置顺序查找。

location 常用配置如下:

未分类

Nginx的常用配置非常多,以下内容摘自于布尔教育课件,仅供参考:

#定义Nginx运行的用户和用户组
user  www www;
#启动进程,通常设置成和cpu的数量相等
worker_processes  8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。
worker_rlimit_nofile 102400;
#这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打
#开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀
#,所以最好与ulimit -n的值保持一致。

#全局错误日志及PID文件
error_log  /usr/local/nginx/logs/error.log; 
#错误日志定义等级,[ debug | info | notice | warn | error | crit ]
pid        /usr/local/nginx/nginx.pid;

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀.
#所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

#工作模式及连接数上限
events {
    use   epoll;                #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
    worker_connections  102400; #单个后台worker process进程的最大并发链接数 (最大连接数=连接数*进程数)
    multi_accept on; #尽可能多的接受请求
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    #设定mime类型,类型由mime.type文件定义
    include       mime.types;
    default_type  application/octet-stream;
    #设定日志格式
    access_log    /usr/local/nginx/log/nginx/access.log;
     sendfile      on;
    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用必须设为 on
    #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    #autoindex  on;  #开启目录列表访问,合适下载服务器,默认关闭。
    tcp_nopush on; #防止网络阻塞
    keepalive_timeout 60;
    #keepalive超时时间,客户端到服务器端的连接持续有效时间,当出现对服务器的后,继请求时,keepalive-timeout功能可避免建立或重新建立连接。
    tcp_nodelay   on; #提高数据的实时响应性
   #开启gzip压缩
   gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2; #压缩级别大小,最大为9,值越小,压缩后比例越小,CPU处理更快。
    #值越大,消耗CPU比较高。
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    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)

    #设定请求缓冲
    large_client_header_buffers  4 4k;
    client_header_buffer_size 4k;
    #客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k
    #不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
    open_file_cache max=102400 inactive=20s;
    #这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
    open_file_cache_valid 30s;
    #这个是指多长时间检查一次缓存的有效信息。
    open_file_cache_min_uses 1;
    #open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive
    #包含其它配置文件,如自定义的虚拟主机
    include vhosts.conf;
}

配置详解2如下:

    #这里为后端服务器wugk应用集群配置,根据后端实际情况修改即可,tdt_wugk为负载均衡名称,可以任意指定
    #但必须跟vhosts.conf虚拟主机的pass段一致,否则不能转发后端的请求。weight配置权重,在fail_timeout内检查max_fails次数,失败则剔除均衡。
    upstream tdt_wugk {
        server   127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;
        server   127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=30s;
    }
   #虚拟主机配置
    server {
        #侦听80端口
        listen       80;
        #定义使用www.wuguangke.cn访问
        server_name  www.wuguangke.cn;
        #设定本虚拟主机的访问日志
        access_log  logs/access.log  main;
            root   /data/webapps/wugk;  #定义服务器的默认网站根目录位置
        index index.php index.html index.htm;   #定义首页索引文件的名称
        #默认请求
        location ~ /{
          root   /data/www/wugk;      #定义服务器的默认网站根目录位置
          index index.php index.html index.htm;   #定义首页索引文件的名称
          #以下是一些反向代理的配置.
          proxy_next_upstream http_502 http_504 error timeout invalid_header;
          #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
          proxy_redirect off;
          #后端的Web服务器可以通过X-Forwarded-For获取用户真实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;
           proxy_pass  http://tdt_wugk;     #请求转向后端定义的均衡模块
       }

        # 定义错误提示页面
            error_page   500 502 503 504 /50x.html;  
            location = /50x.html {
            root   html;
        }
        #配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。
        location ~ .*.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
        {
            root /data/www/wugk;
            #expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力。
            expires      3d;
        }
        #PHP脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
        location ~ .php$ {
            root /root;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /data/www/wugk$fastcgi_script_name;
            include fastcgi_params;
        }
        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status  on;
        }
     }
}

Nginx 内置绑定变量

未分类

  • documenturi|与uri相同; 比如 /test2/test.php

  • host|请求信息中的”Host”,如果请求中没有Host行,则等于设置的服务器名hostname | 机器名使用 gethostname系统调用的值

  • httpcookie|cookie信息http_referer | 引用地址

  • httpuseragent|客户端代理信息http_via | 最后一个访问服务器的Ip地址。

  • http_x_forwarded_for | 相当于网络访问路径is_args | 如果请求行带有参数,返回“?”,否则返回空字符串

  • limitrate|对连接速率的限制nginx_version |当前运行的nginx版本号

  • pidworker|进程的PIDquery_string | 与args相同realpath_root | 按root指令或alias指令算出的当前请求的绝对路径。其中的符号链接都会解析成真是文件路径,使用 Nginx 内置绑定变量

  • 207remoteaddr|客户端IP地址remote_port | 客户端端口号

  • remoteuser|客户端用户名,认证用request | 用户请求

  • requestbody|这个变量(0.7.58+)包含请求的主要信息。在使用proxypass或fastcgipass指令的location中比较有意义
    request_body_file | 客户端请求主体信息的临时文件名

  • requestcompletion|如果请求成功,设为”OK”;如果请求未完成或者不是一系列请求中最后一部分则设为空request_filename | 当前请求的文件路径名,比如/opt/nginx/www/test.php

  • requestmethod|请求的方法,比如”GET”、”POST”等request_uri | 请求的URI,带参数

  • scheme|所用的协议,比如http或者是httpsserver_addr | 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费)

  • servername|请求到达的服务器名server_port | 请求到达的服务器端口号

  • serverprotocol|请求的协议版本,”HTTP/1.0”或”HTTP/1.1”uri| 请求的URI,可能和最初的值有不同,比如经过重定向之类的。

Nginx+uwsgi 安装配置

在前面的章节中我们使用 python manage.py runserver 来运行服务器。这只适用测试环境中使用。
正式发布的服务,我们需要一个可以稳定而持续的服务器,比如apache, Nginx, lighttpd等,本文将以 Nginx 为例。

安装基础开发包

Centos 下安装步骤如下:

未分类

CentOS 自带 Python 2.4.3,但我们可以再安装Python2.7.5:

未分类

安装Python包管理

easy_install 包 https://pypi.python.org/pypi/distribute

安装步骤:

未分类

pip 包: https://pypi.python.org/pypi/pip

安装 pip 的好处是可以用 pip list、pip uninstall 管理 Python 包, easy_install 没有这个功能,只有 uninstall。

安装 uwsgi

uwsgi:https://pypi.python.org/pypi/uWSGI
uwsgi 参数详解:http://uwsgi-docs.readthedocs.org/en/latest/Options.html

未分类

测试 uwsgi 是否正常:
新建 test.py 文件,内容如下:

未分类

然后在终端运行:

未分类

在浏览器内输入:http://127.0.0.1:8001,查看是否有”Hello World”输出,若没有输出,请检查你的安装过程。

安装 Django

未分类

测试 django 是否正常,运行:

未分类

在浏览器内输入:http://127.0.0.1:8002,检查django是否运行正常。

安装 Nginx

安装命令如下:

未分类

你可以阅读 Nginx 安装配置 了解更多内容。

uwsgi 配置

uwsgi支持ini、xml等多种配置方式,本文以 ini 为例, 在/ect/目录下新建uwsgi9090.ini,添加如下配置:

未分类

Nginx 配置

找到nginx的安装目录(如:/usr/local/nginx/),打开conf/nginx.conf文件,修改server配置:

未分类

你可以阅读 Nginx 安装配置 了解更多内容。

设置完成后,在终端运行:

未分类

在浏览器输入:http://127.0.0.1,你就可以看到 django 的 “It work” 了。

Nginx错误日志分析及防护脚本

  • 关于iptables定时策略、crontab设置请自行去了解,建议使用”nohup &”方式执行crontab任务;

  • 该脚本可以扩展对iptables日志进行分析、某个IP在1天(或1小时)内出现多次被限制则进行更长时间限制或永久拒绝访问;

  • 对于nginx error日志可以做大小限制进行截断以减少脚本读取日志文件耗时。

# !/bin/bash
# 脚本用于Nginx错误日志检测,若30秒内来源IP地址超出10次错误视为攻击源并自动加入防火墙
# sh -x weblog_black.sh 进行跟踪调试

NGLOG="/data/nginx/log/error.log"
LOG1="/data/shell/$(date +%Y%m%d)_w$$.txt0"
LOG2="/data/shell/$(date +%Y%m%d)_w$$.txt1"
LOG3="/data/shell/$(date +%Y%m%d)_w$$.txt2"
IPTAB="/data/shell/w$$_iptables"
SHLOG="/data/shell/$(date +%Y%m%d)_w$$.run"

find /data/shell/ -type f -name "*.*" -mmin +3 -exec rm -f {} ;
grep -v -i '/undefined' $NGLOG | grep "[error]" | cut -d',' -f2 | cut -d':' -f2 | sort -b | uniq -cd | sort -nr > $LOG1
sleep 30
grep -v -i '/undefined' $NGLOG | grep "[error]" | cut -d',' -f2 | cut -d':' -f2 | sort -b | uniq -cd | sort -nr > $LOG2

#for line in `cat "$LOG2"`
cat $LOG2 | while read line
  do
    ip=`echo $line | awk -F" " '{print $2}'`
    nume=`echo $line | awk -F" " '{print $1}'`        #结束访问次数
    nums=`grep $ip $LOG1 | awk -F" " '{print $1}'`    #开始访问次数
    num30=`expr $nume - $nums`
    #num30=$((nume - nums)) || num30=$[ nume - nums ]
    echo $ip $nume $nums $num30 >> $SHLOG
  if [ "$num30" -gt 10 ]; then
    /sbin/iptables -nvL IN_NGBLACK
    if [ "$?" -eq 1 ]; then
      /sbin/iptables -N IN_NGBLACK
      /sbin/iptables -I INPUT -j IN_NGBLACK
    else
      chain_sum=`/sbin/iptables -nvL IN_NGBLACK | tail -n +3 | wc -l`
      if [ "$chain_sum" -gt 100 ]; then
        /sbin/iptables -D IN_NGBLACK $chain_sum
        /sbin/iptables -D IN_NGBLACK `expr $chain_sum - 1`
      fi
    fi

    /sbin/iptables -nvL IN_NGBLACK | grep $(echo $ip) | grep DROP
    if [ "$?" -eq 1 ]; then
      /sbin/iptables -I IN_NGBLACK 1 -s $ip -p tcp -m multiport --dports 80,443 -m time --timestart `date +%H:%M` --timestop `date -d '+10 min' +%H:%M` -j DROP
      /sbin/iptables -I IN_NGBLACK 1 -s $ip -p tcp -m multiport --dports 80,443 -m limit --limit 10/min --limit-burst 10 -j ACCEPT
      #/sbin/iptables -I IN_NGBLACK 1 -s $ip -p tcp -m multiport --dports 80,443 -j DROP
      #sleep 600 && /sbin/iptables -D IN_NGBLACK -s $ip -p tcp -m multiport --dports 80,443 -j DROP && /sbin/iptables -D IN_NGBLACK -s $ip -p tcp -m multiport --dports 80,443 -m limit --limit 10/min --limit-burst 10 -j ACCEPT & #主进程会在后台等待子进程执行完成后退出
    else
      chain_num=`/sbin/iptables -nvL IN_NGBLACK --line-numbers | grep $(echo $ip) | grep DROP | cut -d' ' -f1`
      /sbin/iptables -D IN_NGBLACK $chain_num
      /sbin/iptables -D IN_NGBLACK `expr $chain_num - 1`
      /sbin/iptables -I IN_NGBLACK 1 -s $ip -p tcp -m multiport --dports 80,443 -m time --timestart `date +%H:%M` --timestop `date -d '+15 min' +%H:%M` -j DROP
      /sbin/iptables -I IN_NGBLACK 1 -s $ip -p tcp -m multiport --dports 80,443 -m limit --limit 10/min --limit-burst 10 -j ACCEPT
    fi
    /sbin/iptables-save > $IPTAB
  fi
done

sleep 30
grep -v -i '/undefined' $NGLOG | grep "[error]" | cut -d',' -f2 | cut -d':' -f2 | sort -b | uniq -cd | sort -nr > $LOG3

cat $LOG3 | while read line
  do
    ip=`echo $line | awk -F" " '{print $2}'`
    nume=`echo $line | awk -F" " '{print $1}'`        #结束访问次数
    nums=`grep $ip $LOG1 | awk -F" " '{print $1}'`    #开始访问次数
    num60=`expr $nume - $nums`
    echo $ip $nume $nums $num60 >> $SHLOG
  if [ "$num60" -gt 15 ]; then
    /sbin/iptables -nvL IN_NGBLACK
    if [ "$?" -eq 1 ]; then
      /sbin/iptables -N IN_NGBLACK
      /sbin/iptables -I INPUT -j IN_NGBLACK
    else
      chain_sum=`/sbin/iptables -nvL IN_NGBLACK | tail -n +3 | wc -l`
      if [ "$chain_sum" -gt 100 ]; then
        /sbin/iptables -D IN_NGBLACK $chain_sum
        /sbin/iptables -D IN_NGBLACK `expr $chain_sum - 1`
      fi
    fi

    /sbin/iptables -nvL IN_NGBLACK | grep $(echo $ip) | grep DROP
    if [ "$?" -eq 1 ]; then
      /sbin/iptables -I IN_NGBLACK 1 -s $ip -p tcp -m multiport --dports 80,443 -m time --timestart `date +%H:%M` --timestop `date -d '+10 min' +%H:%M` -j DROP
      /sbin/iptables -I IN_NGBLACK 1 -s $ip -p tcp -m multiport --dports 80,443 -m limit --limit 10/min --limit-burst 10 -j ACCEPT
      #/sbin/iptables -I IN_NGBLACK 1 -s $ip -p tcp -m multiport --dports 80,443 -j DROP
      #sleep 600 && /sbin/iptables -D IN_NGBLACK -s $ip -p tcp -m multiport --dports 80,443 -j DROP && /sbin/iptables -D IN_NGBLACK -s $ip -p tcp -m multiport --dports 80,443 -m limit --limit 10/min --limit-burst 10 -j ACCEPT & #主进程会在后台等待子进程执行完成后退出
    else
      chain_num=`/sbin/iptables -nvL IN_NGBLACK --line-numbers | grep $(echo $ip) | grep DROP | cut -d' ' -f1`
      /sbin/iptables -D IN_NGBLACK $chain_num
      /sbin/iptables -D IN_NGBLACK `expr $chain_num - 1`
      /sbin/iptables -I IN_NGBLACK 1 -s $ip -p tcp -m multiport --dports 80,443 -m time --timestart `date +%H:%M` --timestop `date -d '+15 min' +%H:%M` -j DROP
      /sbin/iptables -I IN_NGBLACK 1 -s $ip -p tcp -m multiport --dports 80,443 -m limit --limit 10/min --limit-burst 10 -j ACCEPT
    fi
    /sbin/iptables-save > $IPTAB
  fi
done

Nginx优化之php-fpm使用socket方式连接提高性能

在服务器压力不大的情况下,tcp和socket差别不大,但在压力比较满的时候,用套接字方式,效果确实比较好。

注意路径,由于每个人的环境配置不同路径也可能不同.

将TCP改成socket方式的配置方法:

第一步: 修改php-fpm.conf

;listen = 127.0.0.1:9000
listen = /dev/shm/php-cgi.sock

第二步:修改nginx配置文件server段的配置,将http的方式改为socket方式

location ~ [^/].php(/|$) {
    #fastcgi_pass 127.0.0.1:9000;
    fastcgi_pass unix:/dev/shm/php-cgi.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
}

第三步:重启php-fpm与nginx

service nginx restart
service php-fpm restart
ls -al /dev/shm

可以看到php-cgi.sock文件unix套接字类型。

如何隐藏Linux中的Nginx服务器版本

在这篇简短的文章中,我们将向您展示如何在错误页面和Linux的“ 服务器HTTP ”响应头字段中隐藏Nginx服务器版本。 这是保护您的Nginx HTTP和代理服务器的主要推荐实践之一。

另请参阅 : 如何隐藏Apache版本号和其他敏感信息

本指南假设您已经在您的系统上安装了Nginx,或者根据您的Linux发行版遵循以下任何教程来设置完整的LEMP:

如何在Debian 9 Stretch上安装LEMP(Linux,Nginx,MariaDB,PHP-FPM)
如何在FreeBSD上安装Nginx,MariaDB和PHP(FEMP)
如何在16.10 / 16.04安装Nginx,MariaDB 10,PHP 7(LEMP)
在RHEL / CentOS 7/6和Fedora上安装最新的Nginx 1.10.1,MariaDB 10和PHP 5.5 / 5.6
“ server_tokens ”指令负责在错误页面和“服务器”HTTP响应头字段中显示Nginx版本号和操作系统,如下图所示。

Nginx版本号

要禁用此功能,您需要关闭/etc/nginx/nginx.conf配置文件中的server_tokens指令。

# vi /etc/nginx/nginx.conf
OR
$ sudo nano /etc/nginx/nginx.conf

在下面的屏幕截图中将下面的行添加到http上下文中作为shwon。

server_tokens off;

Nginx+Tomcat实现负载均衡

如题所说,今天说一说如何使用Nginx和Tomcat实现反向代理及负载均衡。

1、Nginx是俄罗斯人开发的一种高性能的http反向代理服务器,Tomcat则是Apache基金会免费开源的一种web服务器,这两者结合即可实现web服务的反向代理和负载均衡。

2、那么,直接来看一看怎么实现吧:

1)、工具准备:nginx1.12.0、两个同版本的tomcat(我用的是tomcat8).

2)、分别修改两个tomcat的默认端口配置并启动好这两个tomcat,找到tomcat的server.xml文件,分别修改端口配置如下:
第一个tomcat如下配置端口:

<Server port="8005" shutdown="SHUTDOWN">
<Connector connectionTimeout="20000" port="8888" protocol="HTTP/1.1" redirectPort="8443"/>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

第二个tomcat如下配置端口:

<Server port="8006" shutdown="SHUTDOWN">
<Connector connectionTimeout="20000" port="9999" protocol="HTTP/1.1" redirectPort="8443"/>
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443"/>

端口配置好以后,分别启动起来先放着。

3)、接下来就要配置nginx的反向代理和负载均衡了,下载地址:http://nginx.org/en/download.html,具体配置还是找到nginx的配置文件nginx.conf如下配置:

upstream server_lb {
    #以下标识启动的那两个tomcat,端口号对应,weight标识分配的权重
    server 127.0.0.1:8888 weight=10;
    server 127.0.0.1:9999 weight=5;
}

server {
    #监听nginx的默认端口号80
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   html;
        #这一句很重要,意思是当用户访问localhost上的80端口时转发到以上定义的两个tomcat
    proxy_pass http://server_lb;
        index  index.html index.htm;
    }
}

4)、接下来就是要启动nginx服务器了,直接双击nginx这个应用程序就可以启动了。

5)、然后访问:http://localhost:80,因为第一个tomcat配置的权重是第二个tomcat权重的2倍,所以每次访问都会是第一个tomcat优先被访问2次,第三次第二个tomcat才会被访问到。

注:本篇文章由ECode1024原创撰写,未经允许,不得修改转载,否则追究相关责任。
ECode1024,一个分享软件与编程知识的精简网站。

Nginx root和alias的区别

root的使用

  location /assets/ {
    root /git/shortUrl/dist/;
  }

当user访问 http://domain/assets/a.js 时,nginx把请求映射为/git/shortUrl/dist/assets/a.js

alias的使用

  location /assets/ {
    alias /git/shortUrl/dist/;
  }

当user访问 http://domain/assets/a.js 时,nginx把请求映射为/git/shortUrl/dist/a.js