2018年5月

写了个scrapy小爬虫准备放到闲置的那台windows服务器上跑一下,服务器环境 Windows Server 2012 R2 64位操作系统,先安装Python 3.6.5,直接官网下载64位安装包,安装完成,运行python时,结果弹出 api-ms-win-crt-runtime-l1-1-0.dll 丢失的错误,搜索了一下说是需要安装vc2015运行环境Visual C++ Redistributable Package,下载安装vc_redist.x64.exe 又报 0x80240017 的错误,尴尬了,说这个错误是需要安装 KB2999226 这个补丁程序,好吧,接着下载安装,结果又提示此更新不适用于您的计算机,好嘛,真是尴尬了,接着搜索,说是还需要按顺序安装几个更新,具体是哪些懒得研究了,直接打开系统更新,装了一堆更新重启了一回,然还不行,再手动检查系统更新,又出来3个更新,继续更新,不容易,终于可以了,接下来赶紧进入正题,安装scrapy。

Scrapy的安装

使用pip安装scrapy pip install scrapy

没有意外的报错了

building 'twisted.test.raiser' extension
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

这是电脑上没有安装Microsoft Visual C++ 14.0的编译工具,所以无法对源码进行编译,解决的办法一种就是安装Microsoft Visual C++ Build Tools,当然更省事的是直接安装已经预编译好的Twisted包。

可以在 https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 这里找到已经预编译好Twisted包的二进制安装包whl文件。

Twisted, an event-driven networking engine.
Twisted‑18.4.0‑cp27‑cp27m‑win32.whl
Twisted‑18.4.0‑cp27‑cp27m‑win_amd64.whl
Twisted‑18.4.0‑cp34‑cp34m‑win32.whl
Twisted‑18.4.0‑cp34‑cp34m‑win_amd64.whl
Twisted‑18.4.0‑cp35‑cp35m‑win32.whl
Twisted‑18.4.0‑cp35‑cp35m‑win_amd64.whl
Twisted‑18.4.0‑cp36‑cp36m‑win32.whl
Twisted‑18.4.0‑cp36‑cp36m‑win_amd64.whl
Twisted‑18.4.0‑cp37‑cp37m‑win32.whl
Twisted‑18.4.0‑cp37‑cp37m‑win_amd64.whl

选择我们需要的Twisted版本,cp后面是Python的版本号,cp36表示Python版本3.6,amd64表示64位。

下载完成之后,进入下载文件所在的文件夹运行以下命令安装Twisted,pip install Twisted-18.4.0-cp36-cp36m-win_amd64.whl,再运行pip install scrapy即可安装成功。

不过如果运行scrapy,一般还会出现如下的错误

    import win32api
ModuleNotFoundError: No module named 'win32api'

需要安装 pywin32,直接pip安装 pip install pywin32,当然如果pip安装失败的话,仍然是可以直接用预编译好的二进制安装包whl文件来安装的。

如果有下载图片的话,可能还会报如下错误

    import Image
ModuleNotFoundError: No module named 'PIL'

需要安装 pillow,直接pip安装 pip install pillow

windows环境下用pip安装一些带有c扩展的包时,可能会踩坑报错,这时直接下载预编译好的二进制安装包。

  1. https://www.lfd.uci.edu/~gohlke/pythonlibs/ 在这里下载预编译好的.whl文件,Ctrl + F 输入python包名查找,找到对应模块包,根据python版本选择下载。
  2. 进入下载.whl文件所在的文件夹,执行命令 pip install 带后缀的完整文件名 即可完成安装。

nginx禁止访问文件或目录的配置方法

nginx禁止访问指定后缀的文件

location ~ .*\.(ini|inc|conf|dat|txt)$ {
    # 正则表达式匹配,禁止访问后缀为ini,inc,conf,dat,txt的文件
    # 修饰符 ~ 表示正则匹配区分大小写,可以使用修饰符 ~* 表示不区分大小写
    deny all;
}

nginx禁止访问指定目录

location ^~ /path1/ {
    # 普通字符串前缀匹配,修饰符 ^~ 表示如果匹配到这条普通规则后,不再进行之后的正则搜索了
    deny all;
}

location ^~ /path2/ {
    deny all;
}

也可以使用正则匹配同时禁止访问多个指定目录

location ~ ^/(App|config|Include|Theme|vendor)/ {
    deny all;
}

nginx禁止访问指定目录中的特定后缀的文件

location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { 
    # 禁止访问这些指定目录中的php文件    
    deny all;
}

nginx location指令的uri匹配规则

nginx可以通过配置location指令来对用户请求的uri进行调度,执行不同的文件。

location指令有两种匹配模式,普通字符串前缀匹配和正则表达式匹配。

普通字符串前缀匹配必须以相应的uri开头,如下的匹配规则,必须以/some/path开头的uri才会被匹配,比如/some/path/document.html,而/my-site/some/path不会被匹配。

location /some/path/ {
    ...
}

匹配的顺序是先匹配普通字符串前缀,再匹配正则表达式,不过正则匹配优先级高于普通匹配除非使用修饰符 ^~

语法规则

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

location = /uri        =  开头表示精确匹配,只有完全匹配上才能生效,匹配成功则停止其他匹配。
location ^~ /uri       ^~ 开头对uri路径进行普通字符串前缀匹配,匹配成功则不再进行正则匹配。
location ~ pattern     ~  开头表示区分大小写的正则匹配。
location ~* pattern    ~* 开头表示不区分大小写的正则匹配。
location /uri          不带任何修饰符的普通字符串前缀匹配,优先级低于正则匹配。
location /             通用匹配,任何未匹配到其它location的请求都会匹配到。

匹配执行流程

  1. 查找普通字符串前缀的匹配规则
  2. 以修饰符 = 开头的普通字符串进行精确匹配,如果匹配到,则停止之后的规则查找
  3. 如果普通字符串以修饰符 ^~ 开头,并且是匹配到的最长普通字符串前缀,在匹配到这条规则后不再进行之后的正则查找了
  4. 存储匹配到的最长普通字符串前缀规则
  5. 查找正则表达式的匹配规则
  6. 在所有正则匹配规则中找到第一个匹配项后,就以此项为最终匹配结果
  7. 如果没有查找到正则表达式匹配,则以4中存储的普通匹配为最终匹配结果

普通字符串前缀匹配与配置文件中的前后定义顺序无关,匹配顺序从长到短,正则表达式匹配则受定义的前后顺序影响。