目录

Nginx的概念

Nginx的系统架构

Nginx的服务过程


Nginx.conf配置讲解

自定义日志格式

Location语法

Nginx的具体应用

一、Nginx+Lua实现动态黑名单

二、基于Nginx 的静态缓存

三、基于Nginx 图片防盗链

四、子域名展示

五、多个config配置

六、动静态分离解决跨域

附录1:Nginx 日志格式变量说明

附录2:Nginx的安装

附录3:添加nginx服务

          • -

Nginx的概念

正向代理代理的是客户端
反向代理代理的是服务端

Nginx是一个高性能的HTTP和反向代理服务器,单台Nginx服务器最多能够支持高达50000的并发请求,所以一般情况下,会将Nginx作为静态资源的访问服务器或者作为访问流量分流的服务器
主要特点:占用内存少,并发能力强,扩展容易

Nginx的系统架构

nginx配置use epoll后,以异步非阻塞方式工作,能够轻松处理百万级的并发连接

nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程

Nginx的服务过程

从功能上来分有三种:
handlers 处理器模块
filter
proxies

Nginx.conf配置讲解

# 指定nginx 用户及用户组  user xx xx
#user  nobody;
# 指定nginx 工作进程 根据硬件调整 通常等于cpu 核数
worker_processes  1;
# 全局错误信息(warn)
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
# PID(进程标识符) 存储目录
#pid        logs/nginx.pid;



gzip on;
gzip_disable "msie6";#为指定的客户端禁用gzip功能
gzip_proxied any;#压缩所有的请求
gzip_min_length 1000;#数据启用压缩的最少字节数
gzip_comp_level 4;#设置数据的压缩等级

#设置需要压缩的数据格式
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss tex

#负载均衡
upstream demo {
        server 127.0.0.1:8080    weight=1;#权重,值越高,分配到的几率越高
        server 127.0.0.2:8081    down;#down表示这台机器不参与
        server 127.0.0.2:8081    backup;

 }
upstream moblie {
        server 192.168.80.123:8080;
        server 192.168.80.124:8080;
}
    
upstream img {
        server 192.168.80.123:8080;
        server 192.168.80.124:8080;
}




events {
    #连接上限 
    worker_connections  1024;
}

设定http服务器
http {
    # 文件扩展名与文件类型映射
    include       mime.types;
    # 默认文件类型
    default_type  application/octet-stream;
    # 设定日志格式
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    # 设置access log
    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    # 设定虚拟主机
    server {
        listen       80; # 监听端口号
        server_name  localhost; 域名 可以有多个 用空格隔开

        #charset koi8-r;
        # 设定虚拟主机访问的日志
        #access_log  logs/host.access.log  main;

        #手机站点与PC站点分离
        set $mobile_rewrite 1;

        if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino") {
            set $mobile_rewrite 0;
        }
        
        if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)") {
            set $mobile_rewrite 0;
        }

        location / {
            #proxy_pass http://demo;
            if ($mobile_rewrite = 0) {
                proxy_pass http://moblie;
            }
            proxy_pass http://demo;
            index  index.html index.htm;
        }

        #动静分离  **.do **.aciton  js css jpg gif html
         location ~ .*\.(jpg|gif)$ {
            root http://img;
        }
   }
    server {
        listen    80;
        server_name    www.demo.com;
        access_log    logs/dome.access.log;

        location / {
            proxy_pass http://demo;
            index index.html;
            root html;
        }
    }
    

}

自定义日志格式

使用系统默认处理起来非常的复杂,而且生成的日志格式字段可能我并不全需要或者不满足我现在要求。怎么解决?自定义日志格式

\# 1、去掉下面2部分注释
log\_format main '$remote\_addr - $remote\_user [$time\_local\] "$request" '
'$status $body\_bytes\_sent "$http\_referer" '
'"$http\_user\_agent" "$http\_x\_forwarded\_for"';

access\_log logs/access.log main;

# 2、添加自定义日志格式
log\_format bf\_log '$remote\_addr^A$http\_host^A$msec^A$request\_uri';(分号必不可少)

\# 3、 开启日志目录
location =/bf.gif{
default\_type image;(分号必不可少)
access\_log logs/bf.log bf\_log;(分号必不可少)
}

\# 4、生成的日志格式
172.16.100.35^Abigdata-spark04.ibeifeng.com^A1479985996.537^A/bf.gif

Location语法> 配置语法

location [= | ~* | ^~ ] /uri/ {...}

配置规则
location = /uri 精准匹配
location ^~ /uri 前缀匹配
location ~ /uri
location / 通用匹配

规则的优先级

1 location = /
2 location = /index
3 location ^~ /article/
4 location ^~ /article/files/
5 location ~ \.(gif|png|js|css)$
6 location /

http://192.168.11.154/
http://192.168.11.154/index ->2
http://192.168.11.154/article/files/1.txt ->4
http://192.168.11.154/mic.png ->5

  1. 精准匹配是优先级最高
  2. 普通匹配(最长的匹配)
  3. 正则匹配

实际使用建议
location =/ {
}
location / {
}
location ~* \.(gif|....)${
}

Nginx的具体应用

一、Nginx+Lua实现动态黑名单

1.安装Redis

wget http://download.redis.io/redis-stable.tar.gz

进入redis根目录执行 make PREFIX=/usr/local/redis install

mv redis.conf /usr/local/redis/etc

vi /usr/local/redis/etc/redis.conf //将daemonize no 改成daemonize yes

设置开机启动:/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

2.安装LuaJIT(可不安装)

LuaJIT 和 Lua 的一个区别是,LuaJIT 的运行速度比标准 Lua 快数十倍,可以说是一个 Lua 的高效率版本。

cd /usr/local/src
wget http://luajit.org/download/LuaJIT-2.1.0-beta2.tar.gz
tar zxf LuaJIT-2.1.0-beta2.tar.gz
cd LuaJIT-2.1.0-beta2
make PREFIX=/usr/local/luajit
make install PREFIX=/usr/local/luajit

配置lua的环境变量

export LUAJIT\_LIB=/usr/local/luajit/lib
export LUAJIT\_INC=/usr/local/luajit/include/luajit-2.1

3.下载lua-nginx-module 模块

yum -y update nss #nss版本过于陈旧,升级即可

cd /usr/local

git clone https://github.com/chaoslawful/lua-nginx-module.git

4.下载ngx\_devel\_kit(NDK)

cd /usr/local

wget https://github.com/simpl/ngx\_devel\_kit/archive/v0.2.19.tar.gz

tar -xzvf v0.2.19

5.安装lua-redis-parser,lua-resty-redis是openresty(1.9.15.1)的一个组件,简单来说,它提供一个lua语言版的redis API,使用socket(lua sock)和redis通信

git clone https://github.com/openresty/lua-resty-redis.git

mv lua-resty-redis /usr/local/nginx/lua/lua-resty-redis

6.进入之前安装nginx的解压目录,重新编译安装(引入LuaJIT并加入ngx\_devel\_kit-0.2.19和lua-nginx-module的目录)

sudo ./configure --with-ld-opt="-Wl,-rpath,/usr/local/luajit/lib" --add-module=/usr/local/ngx\_devel\_kit-0.2.19 --add-module=/usr/local/lua-nginx-module-0.10.2

编译安装

sudo make -j2

make install

7.nginx.conf的配置

http {

lua\_package\_path "/usr/local/nginx/lua/lua-resty-redis/lib/?.lua;;";

#由 Nginx 进程分配一块 1M 大小的共享内存空间,用来缓存 IP 黑名单
lua\_shared\_dict ip\_blacklist 1m;

server {
listen 8081;
server\_name hadoop.senior02;

location ~ .*(BfImg)\.(gif)$ {
default\_type image/gif;
access\_log /home/hadoop/access.log log\_format;
root /usr/local/nginx/conf/www/source;
}

location = /ipblacklist {
access\_by\_lua\_file conf/lua/ip\_blacklist.lua;
default\_type text/html;
content\_by\_lua 'ngx.say("

hello, lua

")';
}
}

}

ip\_blacklist.lua文件

local redis = require("resty.redis")
local ngx\_log = ngx.log
local ngx\_ERR = ngx.ERR
local ngx\_INFO = ngx.INFO
local ngx\_exit = ngx.exit
local ngx\_var = ngx.var

-- 黑名单缓存60秒
local cache\_idle = 60
local forbidden\_list = ngx.shared.forbidden\_list

local function close\_redis(red)
if not red then
return
end
-- 释放连接(连接池实现)
local pool\_max\_idle\_time = 100000 -- 毫秒
local pool\_size = 100 -- 连接池大小
local ok, err = red:set\_keepalive(pool\_max\_idle\_time, pool\_size)

if not ok then
ngx\_log(ngx\_ERR, "set redis keepalive error : ", err)
end
end

-- 从redis获取ip黑名单列表
local function get\_forbidden\_list()
local red = redis:new()
red:set\_timeout(10000)
local ip = "192.168.226.4"
local port = 6379
--local password = ""
local ok, err = red:connect(ip, port)
if not ok then
ngx\_log(ngx\_ERR, "connect to redis error : ", err)
close\_redis(red)
return
end

--local res, err = red:auth(password)
--if not res then
-- ngx\_log(ngx\_ERR, "failed to authenticate: ", err)
-- close\_redis(red)
-- return
--end

local resp, err = red:smembers("forbidden\_list")
if not resp then
ngx\_log(ngx\_ERR, "get redis connect error : ", err)
close\_redis(red)
return
end
-- 得到的数据为空处理
if resp == ngx.null then
resp = nil
end
close\_redis(red)

return resp
end

-- 刷新黑名单
local function reflush\_forbidden\_list()
local current\_time = ngx.now()
local last\_update\_time = forbidden\_list:get("last\_update\_time");

if last\_update\_time == nil or last\_update\_time < (current\_time - cache\_idle) then
local new\_forbidden\_list = get\_forbidden\_list();
if not new\_forbidden\_list then
return
end

forbidden\_list:flush\_all()
for i, forbidden\_ip in ipairs(new\_forbidden\_list) do
forbidden\_list:set(forbidden\_ip, true);
end
forbidden\_list:set("last\_update\_time", current\_time);
end
end

reflush\_forbidden\_list()
local ip = ngx\_var.remote\_addr
if forbidden\_list:get(ip) then
ngx\_log(ngx\_INFO, "forbidden ip refused access : ", ip)
return ngx\_exit(ngx.HTTP\_FORBIDDEN)
end

8.效果演示

redis-cli

\#添加黑名单

SADD forbidden\_list "127.0.0.1"

\#移除黑名单

SREM forbidden\_list "127.0.0.1"

访问http://hadoop.senior02:8081/ipblacklist

二、基于Nginx 的静态缓存

某电商平台商品详情页需要实现 700+ QPS,如何着手去做?

问题:当达到500QPS 的时候很难继续压测上去。
分析原因:一个详情页html 主体达平均150 kb 那么在500QPS 已接近局域网宽带极限。必须减少内网通信。

解决方案:

一、在http元素下添加缓存区声明。
proxy\_cache\_path /data/nginx/cache\_item levels=1:1:2 keys\_zone=cache\_item:500m
inactive=30d max\_size=10g;
二、为指定location 设定缓存策略。
proxy\_cache cache\_item;
proxy\_cache\_key $host$uri$is\_args$args;#以全路径md5值做做为Key
proxy\_cache\_valid 200 304 12h; #对不同的HTTP状态码设置不同的缓存时间
expires 7d; #总体缓存时间

缓存的清除:
该功能可以采用第三方模块 ngx\_cache\_purge 实现。

为nginx 添加 ngx\_cache\_purge 模块
#下载ngx\_cache\_purge 模块包 ,这⾥nginx 版本为1.6.2 purge 对应2.0版
wget http://labs.frickle.com/files/ngx\_cache\_purge-2.0.tar.gz#查看已安装模块
./sbin/nginx -V

\#进⼊nginx安装包⽬录 重新安装 --add-module为模块解压的全路径
./configure --prefix=/root/svr/nginx --with-http\_stub\_status\_module --with-http\_ssl\_module --
add-module=/root/svr/nginx/models/ngx\_cache\_purge-2.0

\#重新编译
make

\#拷⻉ 安装⽬录/objs/nginx ⽂件⽤于替换原nginx ⽂件
#检测查看安装是否成功
nginx -t

清除配置:
location ~ /purge(/.*) {
#允许访问的IP
allow 127.0.0.1;
allow 192.168.0.193;
#禁⽌访问的IP
deny all;
#配置清除指定缓存区和路径(与proxy\_cache\_key⼀⾄)
proxy\_cache\_purge cache\_item $host$1$is\_args$args;
}

三、基于Nginx 图片防盗链

什么是图片防盗链?意思是指本站内图片、CSS等资源只有本站点可以访问,不允许其它站点打开。该功能如果用JAVA如何实现?很单简单,只要判断一下 请求头当中的referer 属性是否为 指定域名即可。Nginx原理类似。
防盗链配置:
location ~* \.(gif|png|jpg|swf|flv)$ {
root html;
valid\_referers none *.tl.com;
if ($invalid\_referer) {
rewrite ^/ http://www.tl.com/image/403.png;
#return 404;
}
}

说明:如果 valid\_referers 条件判断未通过,nginx 则会赋值 invalid\_referer 为true
语法: valid\_referers none | blocked | server\_names | string ...;
参数说明:

none 不允许 “Referer” 来源头部为空的情况
blocked 不允许“Referer”值为空情况,有可能Referer的值被代理或者防火墙删除
server\_names “Referer”来源头部包必须含当前的server\_names (当前域名)可以多个

四、子域名展示

有时会有这样的需求,每个子域名对应一个静态站点(类似58到家、有赞商城等)。如果每天增加一个域名会相当麻烦。在nginx 当中可直接基于$host 连接到对应目录。具体配置实现如下:
server {
listen 80;
server\_name *.tl.com;
root /data/www/$host;
access\_log logs/$host.access.log;
location / {
index index.html;
}
}

五、多个config配置

在我们的一台服务器上,一个nginx服务器下面可能跑着许多许多的项目;那么就需要配置多个对应的配置 端口号 已经文件入库目录等等那么项目多了以后,把这些项目都写到一个文件里 到后期难以查看与管理我们只需要新建一个文件夹,下面全部存放 我们的子配置 然后在主配置中把这个子目录引入即可

include /etc/nginx/default.conf;     
include /etc/nginx/upstream/*.conf;     
include /etc/nginx/conf.d/*.conf; // 这里就是引入的子配置文件夹

一个范例 子配置的conf

server {
listen 832; // 端口号
server\_name localhost; // 域名
index index.html index.htm index.php;
root /home/www/ai/crm/web/public; //项目的入口文件夹

location ~ /.svn/ {
deny all;
}

location / {
rewrite ^/$ /index.php last;
rewrite ^/(?!index\.php|index\.html|layui|css|js|bootstrap|robots\.txt)(.*)$ /index.php/$1 last;
}

location ~/uploads/.*\.(php|php5)?$ {
deny all;
}
location ~/public/.*\.(php|php5)?$ {
deny all;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
}

location ~ .*\.(js|css)?$ {
expires 8d;
}
#access\_log /www/logs/access.log main;

}

六、动静态分离解决跨域

后端,用户通过 http://www.javaboy.org/jinlu/** 格式的地址就可以访问到我服务端的接口。

upstream zqq.com{
server 127.0.0.1:9999 weight=2;
}

location /jinlu/ {
proxy\_pass http://zqq.com;
tcp\_nodelay on;
proxy\_set\_header Host $host;
proxy\_set\_header X-Real-IP $remote\_addr;
proxy\_set\_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for;
}

前端 ,用户通过 http://www.javaboy.org/jinlu-admin/**格式的请求就可以访问到前端资源了。

location /jinlu-admin/ {
root /usr/local/nginx/html/jinlu-admin/;#所有静态文件直接读取硬盘
expires 30d; #缓存30天
}

备注:生产一般不用

https://mp.weixin.qq.com/s/okKU5VmBxwyht09TGTNdBQ

附录1:Nginx 日志格式变量说明变量名称 变量描述 举例说明$remote\_addr 客户端地址 113.140.15.90$remote\_user 客户端用户名称 $time\_local 访问时间和时区 18/Jul/2012:17:00:01 +0800$request\_time 请求的URI和HTTP协议 “GET /pa/img/home/logo-alipay-t.png HTTP/1.1″$http\_host 请求地址,即浏览器中你
输入的地址(IP或名) img.alipay.com 10.253.70.103$status HTTP请求状态 200$upstream\_status upstream状态 200$body\_bytes\_sent 发送给客户端文件内容大小 547$http\_referer 跳转来源 “https://cashier.alipay.com…/”

$http\_user\_agent

用户终端代理“Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;$ssl\_protocol SSL协议版本 TLSv1$ssl\_cipher 交换数据中的算法 RC4-SHA

$upstream\_addr

后upstream的地址, 即真正提供服务的主机地址 10.228.35.247:80$request\_time 整个请求的总时间 0.205$upstream\_response\_time 请求过程中upstream响应时间 0.002$msec 日志写入时间。单位为秒,精度是毫秒。 $request\_uri 从客户端发送来的原生请求URI,包括参数它不可以进行修改 "/foo/bar.php?arg=baz"$uri 变量指当前的请求URI,不包括任何参数 "/foo/bar.php"

附录2:Nginx的安装> yum install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl

openssl-devel
1)wget 官网下载地址
2)tar zxvf 源码包
3)cd /解压的nginx目录下
4)./configure 生成编译的makefile ./configure --prefix=...
5)make &&make install

/server/nginx/sbin/nginx nginx 启动
./nginx -v #可查看版本
nginx version: nginx/1.10.3

./nginx -V #可查看编译情况
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
configure arguments: --prefix=/server/nginx
./nginx -t
nginx: the configuration file /server/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /server/nginx/conf/nginx.conf test is successful
./nginx -s reload 重新加载配置文件
配置文件修改了,一定要重新启动
./nginx -c filename 用户指定启动时使用的其他配置文件
Nginx的停止方式:
快速停止,平滑停止
kill -TERM pid 快速停止,服务还没有停止,进程就已经停止(kill -9 pid)
kill -QUIT pid 平滑停止 把请求关掉之后,再把进程关掉(/nginx -s stop)

Nginx的升级
nginx可以实现平滑升级,既不影响现在的服务前提下实现升级
前提条件:新的安装路径和旧的安装路径保持一致,最好备份旧的服务器
1)安装新的服务器
2)发送USR2信号实现平滑升级
kill -USR2 pid 或者 /server/nginx/logs/nginx.pid
3)发送平滑停止旧的服务器信号
kill -WHICH pid信号 /nginx/logs/nginx.pid
-rw-r--r-- 1 root root 2656 Feb 24 16:30 nginx.conf
-rw-r--r-- 1 root root 2656 Feb 24 16:30 nginx.conf.default ##备份文件

附录3:添加nginx服务

1)在/etc/init.d目录下 touch nginx 创建一个nginx脚本文件,文件内容拷贝下面这个nginx.txt文件(注意不要直接将下面这个文件上传到/etc/init.d目录下,另外该文件里面指定的Nginx安装路径要改为实际安装路径)

2)chmod 755 /etc/init.d/nginx

3) 设置开机自启动 chkconfig nginx on && chkconfig --list | grep nginx

nginx.txt内容

#!/bin/bash
#
# chkconfig: - 85 15
# description: nginx is a World Wide Web server. It is used to serve
# Source function library.
. /etc/rc.d/init.d/functions
 
# Source networking configuration.
. /etc/sysconfig/network
 
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
 
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
 
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
 
#[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
 
lockfile=/var/lock/subsys/nginx
 
#make_dirs() {
#   # make required directories
#   user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
#   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
#   for opt in $options; do
#       if [ `echo $opt | grep '.*-temp-path'` ]; then
#           value=`echo $opt | cut -d "=" -f 2`
#           if [ ! -d "$value" ]; then
#               # echo "creating" $value
#               mkdir -p $value && chown -R $user $value
#           fi
#       fi
#   done
#}
 
start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
#    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
 
stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}
 
restart() {
    configtest || return $?
    stop
    sleep 1
    start
}
 
reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
#  -HUP是nginx平滑重启参数  
    killproc $nginx -HUP
    RETVAL=$?
    echo
}
 
force_reload() {
    restart
}
 
configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}
 
rh_status() {
    status $prog
}
 
rh_status_q() {
    rh_status >/dev/null 2>&1
}
 
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

标签: nginx, Nginx, http, log, ngx, redis, 原理, 案例, local

相关文章推荐

添加新评论,含*的栏目为必填