nginx(web)应用实践

nginx的配置:
    nginx的主要目录介绍:
        conf (这要配置文件)
        sbin(命令)
        logs(日志文件)
        html网站的主要目录的存放位置(一般安装后查找nginx下面的 HTML目录)该目录默认放置网站的代码。)
    Nginx的主配置文件nginx.conf 整个文件是以块状的形式组织的。
        我们过滤掉#和空格来看下主配置文件内容
        # grep -Ev "#|^$" nginx.conf | cat -n
             1  worker_processes  1;    #worker进程的数量
             2  events {
             3      worker_connections  1024;  #每个worker进程支持的最大连接数
             4  }
             5  http {
             6      include       mime.types;  #nginx支持的媒体类型库文件
             7      default_type  application/octet-stream;
             8      sendfile        on;         #开启高速传输模式
             9      keepalive_timeout  65;      #连接超时
            10      server {                    #表示一个独立虚拟主机站点。如果配置多个需要操作配置server
            11          listen       80;        #提供服务的端口
            12          server_name  localhost; #提供服务的主机域名
            13          location / {            
            14              root   html;        #虚拟主机的根目录。nginx安装目录下的html目录
            15              index  index.html index.htm;   #默认的首页文件。多个用空格隔开
            16          }
            17          error_page   500 502 503 504  /50x.html;
                                                #出现对应的http状态码时,使用50x.html回应客户。
            18          location = /50x.html {
            19              root   html;
            20          }
            21      }
            22  }
        第1行为:main 区域  第2-4行是events区域。这2个区域是nginx的核心
        5-22为nginx http的核心区域 其中包括10-21是server区域(而 13-16和18-20这2个location被server包含)
        每个区域块以{大括号 开始  以 } 大括号结束。
    nginx虚拟主机配置:
        所谓虚拟主机,在web服务器里就是一个独立的网站站点。这个站点对应独立的域名(或者端口也或者ip和端口),
        具有独立的程序和目录,可以独立地对外提供服务供用户访问。
        apache下每个虚拟主机由<VirtualHost></VirtualHost>包含,而Nginx软件由server{}来标记。
        虚拟主机的类型包含三类:
        1.基于域名的虚拟主机 2.基于端口的虚拟主机 3.基于ip的虚拟主机
    1.配置基于域名的虚拟主机实验:
        #    server {
        #        listen       80;
        #        server_name  localhost;
        #        location / {
        #            root   html;
        #            index  index.html index.htm;
        #        }   
        #        error_page   500 502 503 504  /50x.html;
        #        location = /50x.html {
        #            root   html;
        #        }   
        #    }   
            server {

listen       80;
                server_name  www.swallow.com;  #修改域名
                location / {
                    root   html/www;       #修改虚拟主机的根目录
                    index  index.html index.htm;
                }   
                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                    root   html/www;        #修改虚拟主机的根目录
                }   
            }   
    配置基于 www.swallow.com 的虚拟主机目录:
        # tree /application/nginx/html/
            /application/nginx/html/
            ├── 50x.html
            ├── index.html
            └── www
                ├── 50x.html
                └── index.html
    # mkdir  -p   ../html/wwww
    # cp ./html/*.html ./html/www  (根据配置文件创建目录和文件)
    # echo "this is swallow" >./html/www/index.html
    检测nginx配置文件并,平滑重启
        # ./sbin/nginx -t
        nginx: the configuration file /application/nginx-1.6.3//conf/nginx.conf syntax is ok
        nginx: configuration file /application/nginx-1.6.3//conf/nginx.conf test is successful
        [[email protected] nginx]# ./sbin/nginx -s reload
    构建本地hosts
    # echo "192.168.1.120 www.swallow.com">> /etc/hosts
    # curl www.swallow.com
    this is swallow
    配置多个基于域名的虚拟主机:
        只需要修改server{}里面的 servername      root
        创建 新增域名对应的站点目录及文件。# vim ./conf/nginx.conf
        server {
        listen       80;
        server_name  blog.swallow.blog;
        location / {
            root   html/blog;
            index  index.html index.htm;
        }   
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html/blog;
        }   
        }   
        server {
            listen       80  
            server_name  bbs.swallow.com;
            location / {
                root   html/bbs;
                index  index.html index.htm;
            }   
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html/bbs;
            }   
        }   
    # for n in blog bbs; do mkdir -p ./html/$n; echo "http://$n.swallow.com" > ./html/$n/index.html; cp ./html/50x.html ./html/$n/; done
    将新域名加入/etc/hosts 解析
    检查配置文件重新平滑启动nginx
    测试结果:
    # curl www.swallow.com blog.swallow.com bbs.swallow.com
    http:www.swallow.com
    http:blog.swallow.com    
    http:bbs.swallow.com  
    curl的扩展:(-I 是提取返回状态的头部信息。利用这个头部信息的检测可以知道nginx是否成功开启)
    # curl -I -s --connect-timeout 2 www.swallow.com |head -1
    HTTP/1.1 200 OK   
    2.配置基于端口的虚拟主机:
    修改nginx.conf 配置文件里面的server{}下的 listen 改成 任意数值(不可与应用的端口冲突。)
    检测nginx配置文件,平滑重启:测试的时候需要 域名:端口 或者 ip:端口
    3.配置基于ip的的虚拟主机;
    修改nginx.conf 配置文件在多域名的基础上修改server{}的listen  改成ip:端口
    (因为每个虚拟主机在启动时,要占用一个端口。多个一起启动时,要开启多个端口。

优化多域名的虚拟主机配置:
        优点是:方便管理虚拟主机。减少配置文件之间的耦合性,避免因为一个虚拟主机的修改错误影响整个nginx服务。
        原理是:将写在一个配置文件的多个虚拟主机拆分成独立的配置文件。然后在住配置文件中进行引用(include)。
        # cd ./conf
        # mkdir extra
        # sed -n ‘22,33p‘ nginx.conf   (查看虚拟主机www的配置文件)
            server {
                listen       80;
                server_name  www.swallow.com;
                location / {
                    root   html/www;
                    index  index.html index.htm;
                }
                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                    root   html/www;
                }
            }
        # sed -n ‘22,33p‘ nginx.conf > ./extra/www.conf (生成新的配置文件)
        # sed -n ‘34,45p‘ nginx.conf>./extra/blog.conf   
        # sed -n ‘46,57p‘ nginx.conf>./extra/bbs.conf
        最后在源文件中删除 这些配置文件模块,并且使用include 将他们引用进去。
        # sed -i ‘22,57d‘ nginx.conf
        # sed -i ‘ 22 i include extra/www.conf;\ninclude extra/bbs.conf;\ninclude extra/blog.conf;‘ nginx.conf
        查看新的配置文件:(注释部分是模版。新的虚拟主机就是在这个基础上改成的)
            # cat nginx.conf -n
             1  worker_processes  1;
             2  events {
             3      worker_connections  1024;
             4  }
             5  http {
             6      include       mime.types;
             7      default_type  application/octet-stream;
             8      sendfile        on;
             9      keepalive_timeout  65;
            10  #    server {
            11  #        listen       80;
            12  #        server_name  localhost;
            13  #        location / {
            14  #            root   html;
            15  #            index  index.html index.htm;
            16  #        }
            17  #        error_page   500 502 503 504  /50x.html;
            18  #        location = /50x.html {
            19  #            root   html;
            20  #        }
            21  #    }
            22  include extra/www.conf;
            23  include extra/bbs.conf;
            24  include extra/blog.conf;
            25  }

# ../sbin/nginx -t
        nginx: the configuration file /application/nginx-1.6.3//conf/nginx.conf syntax is ok
        nginx: configuration file /application/nginx-1.6.3//conf/nginx.conf test is successful
        # ../sbin/nginx -s reload
        # curl www.swallow.com bbs.swallow.com blog.swallow.com
        http:www.swallow.com
        http:bbs.swallow.com
        http:blog.swallow.com
    优化成功。这个可以避免频繁修改主配置文件的繁琐。如果那个虚拟主机需要更改配置。可以简单的修改单个文件,
        然后include 进入住文件。在多个虚拟主机时。方便管理。

错误日志功能:nginx错误日志一般分为 debug |info|notice |warn |error|crit|alert|emerg 这几个级别。
        一般 运行 warn |error|crit 这2个级别。默认开启 crit 级别。建议开启error。
        这里不要把级别调的太低。会产生大量的日志。消耗磁盘I/O。更多的查看访问日志。
        可以配置在 main  ,http , server , location 这几个区域快中。
        在主配置文件的main区域 添加一行  error_log logs/error.log error;

访问日志功能;
        # sed -n ‘21,23 s/#//gp‘ nginx.conf.default
        log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                      ‘$status $body_bytes_sent "$http_referer" ‘
                      ‘"$http_user_agent" "$http_x_forwarded_for"‘;
        将这段格式信息加载到http模块中
        worker_processes  1;
        error_log logs/error.log;
        events {
            worker_connections  1024;
        }
        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"‘;
            sendfile        on;
            keepalive_timeout  65;
        #    server {
        #        listen       80;
        #        server_name  localhost;
        #        location / {
        #            root   html;
        #            index  index.html index.htm;
        #        }
        #        error_page   500 502 503 504  /50x.html;
        #        location = /50x.html {
        #            root   html;
        #        }
        #    }
        include extra/www.conf;
        include extra/bbs.conf;
        include extra/blog.conf;
        }   
    简要解析访问日志格式参数:
        $remote_addr 记录访问网站的客户端地址
        $remote_user 远程客户端名称
        $time_Local 记录访问时间和时区
        $request 用户http请求起始行信息
        $status http 请求返回状态码
        $body_bytes_sents 服务器发送给客户端的响应body字节数
        $http_referer 记录此次请求是从哪个链接访问过来的。根据 referer防盗链
        $http_user_agent 记录客户端访问信息
    然后在 虚拟主机中开启访问日志:(在单个的虚拟机配置:在server的最后面添加
                                    access_log logs/access_$name.log main;

# vim extra/www.conf
            server {
                listen       80;
                server_name  www.swallow.com;
                location / {
                    root   html/www;
                    index  index.html index.htm;
                }
                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                    root   html/www;
                }
                access_log logs/access_www.log main;
            }
    在开启访问日志后,日志文件的体积会越来越大。不便于对日志分析和处理。需要轮询切割日志。
        思路是:把每日的文件以日期重命名。写入crond 。按时执行。
        # vim cut_nginx_bbs.sh
        #!/bin/bash
        Dateformat=`date +%Y%m%d`
        Basedir="/application/nginx"
        Lognginxdir="$Basedir/logs"
        Logname="access_bbs"
        [ -d ${Lognginxdir} ] && cd ${Lognginxdir} || exit 1
        [ -f ${Logname}.log ] || exit 2
        /bin/mv ${Logname}.log ${Dateformat}_${Logname}.log
        $Basedir/sbin/nginx -s reload

location作用:根据用户请求的URL来执行不同的应用。根据用户请求网址的URL进行匹配。匹配成功,进程相应的操作
      匹配的两种特殊字符"~"或"~*" "~"区分大小写 "~*" 不区分大小写."!"表示取反
      "^~"作用:在进行常规匹配后不做正则表达式的检查。


用户请求的URL说明及顺序


用户请求的URL


设置的状态码


说明


这里省略所有的前缀:http://www.swallow.com


当为空或/时


Location = / {

}


=精确匹配,优先级最高


/images/1.gif


Location ^~ /images/ {

}


匹配常规字符,不做正则匹配^~作用:优先匹配路径,而不会匹配1.gif


/docment/1.jpg


Location ~* \.(gif|jpg|jpeg)$ {

}


这里是正则匹配。匹配了

1.jpg


/document/document.html


Location /document/ {

}


常规匹配,如果有正则则优先匹配正则。匹配了/document


/index.html或是任何不匹配location模块的字符串


Location / {

}


/默认匹配,所有location都匹配不上后的,默认匹配

Nginx rewrite
        主要功能实现URL地址重写。(需要pcre支持)
        语法指令:   rewrite regex  replacement [flag];
        应用位置: server  location  if
        rewrite 是实现URL重写的关键指令,根据regex(正则表达式)的部分的内容,重定向到replacement部分,结尾是flag标记。


Regex常用正则表达式


字符


描述


\


将后面接着的字符标记为一个特殊字符或一个原以字符或一个向后引用  。例如”\n”匹配一个换行符


^


匹配输入字符的起始位置


$


匹配输入字符串的结束位置


*


匹配0个或多个字符。等价于 {0,}(贪婪模式)


+


匹配1个或多个字符。等价于{1,}(贪婪模式)


?


匹配0个或1个,如果根贪婪模式一起,会限制贪婪模式。

例如“0000”,“0+?”则匹配“0”。而“0+”则匹配“0000”


.


匹配除”\n”外的任意单个字符,如果要匹配”\n”要使用[.\n]


(pattern)


匹配括号内的pattern,可以在后面获取对应的匹配。常用$0..$9属性获取小括号中的匹配内容,要匹配圆括号字符需要,\(  \)


Rewrite最后一项参数flag标记的说明


Flag标记符号


说明


Last


浏览器地址栏不变,服务器的路径改变


本条规则匹配完成后,向下匹配新的location URL规则


Break


本条规则匹配完成后,不再匹配后面的任何规则


Redirect


302临时重定向,浏览器地址栏会显示跳转后的URL地址


Permanent


301永久重定向,浏览器地址栏后显示跳转后的URL地址

案例实现301跳转
        server {
        listen 80;
        server_name swa.com;
        rewrite ^/(.*) http://www.swa.com/$1 permanent;
        }
     server {
        listen 80;
        server_name www.swa.com;
        location /{
                root html;
                index index.html index.htm;
        }
        }
    测试结果:
    # curl -I swa.com
    HTTP/1.1 301 Moved Permanently
    Server: nginx/1.6.3
    Date: Tue, 31 Jan 2017 23:47:26 GMT
    Content-Type: text/html
    Content-Length: 184
    Connection: keep-alive
    Location: http://www.swa.com/
实现不同域名的URL跳转:
    要求网站访问http://blog.swallow.com 时,跳转至http://www.swallow.com/blog/blog.com
    在 conf/extra/blog.conf 添加:
     12    if ( $http_host ~* "^(.*)\.swallow\.com$"){
     13         set $domain $1;
     14         rewrite ^(.*) http://www.swallow.com/$domain/blog.html break;
     15       }
    测试结果:
    # curl -I blog.swallow.com
    HTTP/1.1 302 Moved Temporarily
    Server: nginx/1.6.3
    Date: Wed, 01 Feb 2017 00:14:18 GMT
    Content-Type: text/html
    Content-Length: 160
    Connection: keep-alive
    Location: http://www.swallow.com/blog/blog.html
    要求网站访问:访问http://www.swallow.com/blog时,跳转至http://blog.swallow.com
    在 conf/extra/www.conf 添加
    rewrite ^(.*)/blog http://blog.swallow.com break;
    测试结果:
    # curl -I www.swallow.com/blog
    HTTP/1.1 302 Moved Temporarily
    Server: nginx/1.6.3
    Date: Wed, 01 Feb 2017 00:37:37 GMT
    Content-Type: text/html
    Content-Length: 160
    Connection: keep-alive
    Location: http://blog.swallow.com

nginx 访问认证:
    在主配置文件 中加入
    auth_basic "swallow training" ;#提示信息,说明网站需要访问认证
    auth_basic_user_file /application/nginx/conf/htpasswd;  #存放用户名和密码的地方
    生成认证帐号和生成密码
    htpasswd (如果没有可以  # yum install httpd -y  是apache服务带来的命令)
    # htpasswd -bc /application/nginx/conf/htpasswd swa 555555
    # chmod 400 /application/nginx/conf/htpasswd
    # chown nginx /application/nginx/conf/htpasswd

时间: 2024-10-12 20:39:35

nginx(web)应用实践的相关文章

Nginx入门到实践-Nginx 中间件

第1章 课程前言总览课程,介绍课程学习须知,环境准备,了解课程意义.1-1 课程介绍1-2 学习环境准备 第2章 基础篇讲解Nginx的快速部署安装.模块.基础配置语法.Nginx的日志输出.Nginx默认配置模块.Nginx对于请求的处理,访问控制模块使用,并区别介绍连接限制与请求限制.2-1 什么是Nginx2-2 常见的中间件服务2-3 Nginx优势多路IO复用2-4 Nginx使用Epoll模型的优势介绍2-5 Nginx-CPU亲和2-6 Nginx-sendfile2-7 Ngin

nginx web日志介绍和分析

nginx web日志介绍和分析 Nginx访问日志打印的格式可以自定义,例如Nginx日志打印格式配置如下,Log_format 用来设置日志格式,Name(模块名) Type(日志类型),可以配置多个日志模块,分别供不同的虚拟主机日志记录所调用: log_format log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                   '$status $body_b

构建高效安全的Nginx Web服务器

一 一.为什么选择Nginx搭建Web服务器 Apache和Nginx是目前使用最火的两种Web服务器,Apache出现比Nginx早. Apache HTTP Server(简称Apache)是世界使用排名第一的Web服务器软件, 音译为阿帕奇,是Apache软件基金会的一个开放源码Web服务器, 可以运行几乎所有的计算机平台,其次开放的API接口, 任何组织和个人都可以在它上面扩展和增加各种需要功能,达到为自己量身定制的功能. Nginx("engine x")是一个高性能的HTT

20步打造最安全的Nginx Web服务器

转自:http://www.open-open.com/solution/view/1319455592515 Nginx是一个轻量级的,高性能的Web服务器以及反向代理和邮箱 (IMAP/POP3)代理服务器.它运行在UNIX,GNU /linux,BSD 各种版本,Mac OS X,Solaris和Windows.根据调查统计,6%的网站使用Nginx Web服务器.Nginx是少数能处理C10K问题的服务器之一.跟传统的服务器不同,Nginx不依赖线程来处理请求.相反,它使用了更多的可扩展

实现最安全的Nginx Web服务器

原文地址:http://www.phpthinking.com/archives/414 Nginx是一个轻量级的,高性能的Web服务器以及反向代理和邮箱(IMAP/POP3)代理服务器.它运行在UNIX,GNU/Linux,BSD各种版本,Mac OS X,Solaris和Windows.根据调查统计,6%的网站使用Nginx Web服务器.Nginx是少数能处理C10K问题的服务器之一.跟传统的服务器不同,Nginx不依赖线程来处理请求.相反,它使用了更多的可扩展的事件驱动(异步)架构.Ng

Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》

首先,简单介绍:Redis是一个基于内存的键值对存储系统,常用作数据库.缓存和消息代理. 支持:字符串,字典,列表,集合,有序集合,位图(bitmaps),地理位置,HyperLogLog等多种数据结构. 支持事务.分片.主从复之.支持RDB(内存数据保存的文件)和AOF(类似于MySQL的binlog)两种持久化方式.3.0加入订阅分发.Lua脚本.集群等特性. 命令参考:http://doc.redisfans.com 中文官网:http://www.redis.net.cn 安装(都大同小

《响应式Web设计实践》学习笔记

原书: 响应式Web设计实践 第2章 流动布局 1. 布局选项 传统的固定布局中存在很多问题, 随着屏幕大小的越来越多元化, 固定布局已经不能适用了. 在流动布局中, 度量的单位不再是像素, 而是变成了百分比. 弹性布局与流动布局类似, 但是通常情况下, 弹性布局中会以em来作为单位. 带来一个好处是随着用户增大或减小字体, 适用弹性布局的元素的宽度也会等比例地变化. 但是其也可能出现水平滚动条 混合布局 媒体查询: 媒体查询允许根据设备的信息----诸如屏幕宽度, 方向或者分辨率等属性来使用不

Nginx web服务器 安装 配置PHP SSL 反向代理 负载均衡 web缓存 URL 重写 写分离

[Nginx web服务器] 安装 为nginx提供SysV init脚本 优先级 让Nginx支持站点用户认证访问 Nginx SSL 配置 打开防火墙443 端口 基于主机名的 虚拟主机 源码安装 PHP Nginx反向代理 Nginx负载均衡 Nginx web缓存 Nginx URL 重写 Nginx读写分离 [Nginx web服务器] 支持5万高并发,实际3万 负载均衡  LVS 反向代理 200第一次连接 302 缓存里面来的 [[email protected] home]# d

NGINX Web Server Nginx web 服务器

原文地址:http://nginx.com/resources/admin-guide/web-server/ NGINX Web Server Nginx web 服务器 This section describes: the most common configuration of a web server how to set up virtual servers and define locations for request processing how to use variable

ASP.NET Web API实践系列04,通过Route等特性设置路由

ASP.NET Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程.在"ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置"一文中,体验了通过模版.惯例.HTTP方法来设置路由,这种做法的好处是把路由模版统一放在了App_Start文件夹下的WebApiConfig类中,方便管理,但缺点是不够灵活. REST把一切都看成资源,有时候,一个资源连带子资源,比如Customer和Orders密切关联,我们可能希望输入这样的请求:cust