配置app.conf

app.conf是BAE提供的部署配置文件,用户通过配置app.conf提供的如下功能,实现对所托管Web应用的高级定制:

  • handlers: 自定义Web服务器规则
  • crond: 定时任务
  • environment: 环境变量
  • sshd: 远程登陆

注意: app.conf须严格遵照YAML语法规范,任何不合规范的配置,如使用中文、Tab或不符合缩进规则等,均会导致发布失败。

handlers

注意

Java应用中的所有请求都会从lighttpd直接转给tomcat或jetty,app.conf中handlers下的所有规则都不起作用,需通过修改web.xml解决。

handlers支持如下规则:

  • url与regex_url: 设置路由规则
  • errordoc: 自定义错误页面
  • expire: 设置过期时间
  • mime: 设置某类扩展名对应的文件类型
  • check_exist: 检查文件或目录是否存在
  • ipblacklist与ipwhitelist: 设置黑白名单

如下为一个简单的app.conf文件handlers示例:

handlers:
  - regex_url : /
    script: index.php
  - regex_url : ^/index\.html$
    script : index.php

  - errordoc : 404 /error/404.html
  - errordoc : 0 /error/default.html

  - expire : .jpg modify 10 years
  - expire : .swf modify 10 years
  - expire : .png modify 10 years
  - expire : .gif modify 10 years
  - expire : .JPG modify 10 years
  - expire : .ico modify 10 years

关于上述规则的解释如下:

  • 指定默认首页为index.php
  • 当访问的URL匹配“/index.html”时,指向“index.php”
  • 对于404错误的提示页面指向“/error/404.html”
  • 对于除了404以外的错误,提示页面指向“/error/default.html”
  • 对于扩展名为.jpg/.swf/.png/.gif/.JPG/.ico的文件,其缓存失效时间为10年

url与regex_url

  • 作用

    设置路由规则。当用户输入的URL字符串的子串与“url”所匹配的字符串一致时,执行script指定的操作;“regex-url”规则的功能与“url”规则相同,支持标准正则表达式,可与script、status_code及location规则配合使用,推荐使用regex-url规则。

  • 语法

    handlers :
      - url : <Regex>
        script : <File_Path>
      - url : <Regex>
        static_files : <File_Path>
      - regex_url : <Regex>
        script : <File_Path>
      - regex_url : <Regex>
        status_code : {301 | 302 | 403 | 404}
        [location : <Redirection_Page>]
    

    注意:

    [location: <Redirection_Page\>]仅能在status_code设为301或302时使用。

  • 代码示例

handlers :
      - url : /
        script : home.php
      - url : /index\.html
        script : home.php
      - url : /(aaa)/(.*\.gif)
        static_files : static/$2
      - url : /admin/.* 
        script : admin.php
      - regex_url : ^/[a-z0-9]*\.html$
        script : /index.php       
      - regex_url : ^/secure_page$
        status_code : 403
      - regex_url : ^/secure_page$
        status_code : 302
        location : http://example.com/error.html
示例解释
- url : /
  script : home.php
指定默认首页为home.php
- url : /index\.html
  script : home.php
当访问的URL包含“/index.html”时,指向home.php
- url : /(aaa)/(.*\.gif)
  static_files : static/$2
当访问的URL包含“/aaa/xxx.gif”时,指向“static/xxx.gif”,其中“xxx”为不包含换行在内的任意字符串
- url : /admin/.*
  script : admin.php
当访问的URL包含“/admin/xxx”时,指向“admin.php”,其中“xxx”为不包含换行在内的任意字符串
- regex_url : ^/[a-z0-9]*\.html$
  script : /index.php
当访问的URL匹配“/xxx.html”时,指向“index.php”,其中“xxx”必须为小写字母或者数字。
- regex_url : ^/secure_page$
  status_code : 403
当访问的URL匹配“/secure_page”时,返回403错误。
- regex_url : ^/secure_page$
  status_code : 302
  location : http://example.com/error.html
当访问的URL匹配“/secure_page”时,返回302错误,并转移至http://example.com/error.html

errordoc

  • 作用

    自定义错误页面,设定Web服务器在处理用户请求发生错误时所返回的错误页面。

  • 语法

    handlers :
      - errordoc : <Error_Code> <Error_Response_Page>
    

    注意:

    为“0”时表示任意错误。

  • 代码示例

    handlers :
      - errordoc : 403 /error/403.html
      - errordoc : 404 /error/404.html
      - errordoc : 0 /error/default.html
    

expire

  • 作用

    设置过期时间,指导浏览器对其进行缓存和失效操作。

  • 语法

    handlers :
      - expire : <File_Extension> {access | modify} <Number> {years | months | weeks | days | hours | minutes | seconds}
    
  • 代码示例

    handlers :
      - expire : .pdf access 1 months
    

mime

  • 作用

    设置某类扩展名对应的文件类型。

  • 语法

    handlers :
      - mime : <File_Extension> <Content_Type>
    
  • 代码示例

    handlers :
      - mime: .txt text/plain
    

check_exist

  • 作用

    检查文件和目录是否存在,并根据判断结果进行处理,可与script、status_code、location规则配合完成使用。

  • 语法

    handlers :
      # 格式一
      - check_exist : {file_exist | dir_exist | not_exist}
        script : <File_Path>  
      # 格式二 
      - check_exist : {file_exist | dir_exist | not_exist}
        status_code : {301 | 302 | 403 | 404}
        [location : <Redirection_Page>]
    

    注意:

    [location: ]仅能在status_code设为301或302时使用。

  • 代码示例

    # example 1
    handlers :
      - check_exist : not_exist
             script : /index.php   
    
    # example 2
    handlers :
      - check_exist : not_exist
        status_code: 403
    
    # example 3
    handlers :
      - check_exist : not_exist
        status_code : 302
           location : http://example.com/error.html
    

ipblacklist与ipwhitelist

  • 作用
    • 黑名单:设置禁止通过的用户,黑名单以外的用户均能通过。
    • 白名单:设置能通过的用户,白名单以外的用户均不能通过。
  • 语法

    handlers :
      - ipblacklist : [<Regex_URL_Pattern>] <IP_Pattern>
      - ipwhitelist : [<Regex_URL_Pattern>] <IP_Pattern>
    

    注意:

    • [<Regex_URL_Pattern>]省略时表示所有URL地址。
    • <IP_Pattern>可以使用IP地址、IP地址/掩码、正则表达式,之间用逗号隔开。
  • 代码示例

    # 设置黑名单
    handlers :
      - ipblacklist : 192.168.1.* 
      - ipblacklist : 192.168.1.0/24
      - ipblacklist : /critical\.html 192.168.0.*    
    
    # 设置白名单
    handlers :
      - ipwhitelist : 192.168.1.0/24
      - ipwhitelist : 192.168.0.10,192.168.1.*,192.168.2.0/24
    

crond

  • 作用

    定时执行Shell命令或脚本。

  • 语法

    crond :
      service : {on | off}
      crontab :
        - "<Cron_Expression> <Shell_Command>"
    

    <Cron_Expression>的语法如下图所示:

    <Cron_Expression>包括5个部分,每个部分均代表一个时间单位,分别是分、时、日、月、周。每个部分的取值范围如上图所示。

    时间单位是否必选取值范围允许的特殊字符
    必选0-59* , -
    必选0-23* , -
    必选1-31* , - L W
    必选1-12或JAN-DEC* , -
    必选0-6或SUN-SAT* , - L #
    可选1970–2099* , -
* "*":代表取值范围内所有数字
* ",":用于分隔多个取值,例如:"MON,WED,FRI"
* "-":用于定义一个时间范围,例如:2010-2020
* "L":代表“最后的”,例如:在“周”中填写5L,代表每个月最后一个周五
* "W":代表距离当前最近的工作日,例如:15W,若15日为周日,则15W代表周一,即16日
* "#":代表指定周的一个指定的日子,例如:5#3代表每个月第三周的周五
* "/":代表“每”

举例:

* "0 12 * * *":每日12:00PM触发
* "15 10 * * *":每日10:15AM触发
* "\*/5 14 * * *":从14:00PM开始,每5分钟触发一次,至14:55PM结束
* "\*/5 14,18 * * *":从14:00PM开始,每5分钟触发一次,至14:55PM结束;从18:00PM开始,每5分钟触发一次,至18:55PM结束
* "15 10 L * *":每月最后一天10:15AM触发
* "15 10 * * 6L":每月最后一个周六10:15AM触发
* "15 10 * * 6#3":每月第三个周六10:15AM触发

>**注意:**
>
>-   最多支持10条<Shell\_Command\>,每条均需用“crontab”包起来。
>-   如果<Shell\_Command\>执行的是shell脚本,建议增加“sh”以确保命令被顺利执行。
>-   系统对<Shell\_Command\>执行的文件类型没有要求,用户只需确保该文件是可执行的。
  • 代码示例

    crond :
      service : on
      crontab :
        - "*/1 * * * * sh /home/bae/app/do.sh >> /home/bae/log/do_err.log"
        - "*/1 * * * * python /home/bae/app/test.py >> /home/bae/log/test.log"
    

通过crond定时执行Python脚本触发异常

在BAE Python Web部署中,通过crond定时执行Python脚本时,可能出现无法加载用户自定义依赖包问题。导致该问题的原因如下:

在Python Web部署中,用户自定义依赖配置文件requirements.txt,用于配置编译时的依赖包。开发者部署代码时,requirements.txt中指定的依赖包会下载安装到应用根目录:/home/bae/app/deps。在Python Web中已将”/home/bae/app/deps”添加到Python默认的模块搜索路径,而定时任务并没有添加该目录到默认的模块搜索路径中。

针对该问题的解决方法是在定时任务运行的python脚本中,将”/home/bae/app/deps”添加到Python默认的模块搜索路径中。可以采用以下操作:

方案一,在python脚本的开头为Python添加默认模块搜索路径如下:

import sys
sys.path.append('/home/bae/app/deps')

方案二,将需要Python运行的定时任务封装成api,在定时任务中curl该api。同时需要注意为该api增加权限验证。

environment

  • 作用

    用户自定义环境变量。

  • 语法

    environment :
      <Variable_Name> : <Variable_Value>
    
  • 代码示例

    environment :
      USER_ENV1 : 1000
      USER_ENV2 : "hahaha"
    

sshd

  • 作用

    设置ssh远程登录。

  • 语法

    sshd :
      service : {on | off}
      public_keys :
       - "<Developer's_Public_Key_List>"
    
  • 代码示例

    sshd :
      service : on
      public_keys :
        - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLN0nt9xejhtI38ajvpJEUij3k2cIAZlrSLtGn3zZEjKXsHNG7YwucFGIW2mTmaibHRjNQhQRwS0NJZz1xrwBgD0flmgAhan/wVw9mnJfWzblh8bPF5yn6453hIBDwXrh2ZTUE53a1WEF4xZzqmO/Aoa7vtfb87fHw6joKEWJ9X8PN7GuiXtdG0AdYlSlRMfBEEoOId4J9BvirCvr9bLSBcWisAYU6fsHIZf+keV/eT2HdNDhwYIfzDcs04y2CLBx7KjK4yqw/q8Uug0yiAyBqgTBZtC95rXjIBWdcfNAuydVWkHEqWpbCLWVXNyxk2aN8AjKMc7veIFeflyx2cIZZ lvrui@390CB9E1897E3D2"