error: command 'gcc' failed with exit status 1 on CentOS7 错误解决办法

安装 pip3 install mysqlclient 的时候报错


Collecting mysqlclient
Downloading https://pypi.doubanio.com/packages/ec/fd/83329b9d3e14f7344d1cb31f128e6dbba70c5975c9e57896815dbb1988ad/mysqlclient-1.3.13.tar.gz (90kB)
100% |████████████████████████████████| 92kB 4.1MB/s
Installing collected packages: mysqlclient
Running setup.py install for mysqlclient ... error
Complete output from command /usr/bin/python3.6 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-vzxpixzp/mysqlclient/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-hfv6f_7w-record/install-record.txt --single-version-externally-managed --compile:
/usr/lib64/python3.6/distutils/dist.py:261: UserWarning: Unknown distribution option: 'long_description_content_type'
warnings.warn(msg)
running install
running build
running build_py
creating build
creating build/lib.linux-x86_64-3.6
copying _mysql_exceptions.py -> build/lib.linux-x86_64-3.6
creating build/lib.linux-x86_64-3.6/MySQLdb
copying MySQLdb/__init__.py -> build/lib.linux-x86_64-3.6/MySQLdb
copying MySQLdb/compat.py -> build/lib.linux-x86_64-3.6/MySQLdb
copying MySQLdb/connections.py -> build/lib.linux-x86_64-3.6/MySQLdb
copying MySQLdb/converters.py -> build/lib.linux-x86_64-3.6/MySQLdb
copying MySQLdb/cursors.py -> build/lib.linux-x86_64-3.6/MySQLdb
copying MySQLdb/release.py -> build/lib.linux-x86_64-3.6/MySQLdb
copying MySQLdb/times.py -> build/lib.linux-x86_64-3.6/MySQLdb
creating build/lib.linux-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/__init__.py -> build/lib.linux-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/CLIENT.py -> build/lib.linux-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/CR.py -> build/lib.linux-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/ER.py -> build/lib.linux-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/FIELD_TYPE.py -> build/lib.linux-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/FLAG.py -> build/lib.linux-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/REFRESH.py -> build/lib.linux-x86_64-3.6/MySQLdb/constants
running build_ext
building '_mysql' extension
creating build/temp.linux-x86_64-3.6
gcc -pthread -Wno-unused-result -Wsign-compare -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -Dversion_info=(1,3,13,'final',0) -D__version__=1.3.13 -I/www/server/mysql/include -I/usr/include/python3.6m -c _mysql.c -o build/temp.linux-x86_64-3.6/_mysql.o -g -DNDEBUG
_mysql.c:37:20: fatal error: Python.h: No such file or directory
#include "Python.h"
^
compilation terminated.
error: command 'gcc' failed with exit status 1

----------------------------------------
Command "/usr/bin/python3.6 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-vzxpixzp/mysqlclient/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-hfv6f_7w-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-vzxpixzp/mysqlclient/
You are using pip version 9.0.1, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

 

阅读剩余部分 -

Nginx设置expires设定页面缓存时间 不缓存或一直使用缓存

配置expires
expires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求
要配置expires,可以在http段中或者server段中或者location段中加入

       location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
           root /var/www/img/;
           expires 30d;
       }

控制图片等过期时间为30天,当然这个时间可以设置的更长。具体视情况而定
比如

       location ~ \.(wma|wmv|asf|mp3|mmf|zip|rar|swf|flv)$ {
               root /var/www/upload/;
               expires max;
       }

expires 指令可以控制 HTTP 应答中的“ Expires ”和“ Cache-Control ”的头标(起到控制页面缓存的作用)
语法:expires [time|epoch|max|pff]
默认值:off
expires指令控制HTTP应答中的“Expires”和“Cache-Control”Header头部信息,启动控制页面缓存的作用
time:可以使用正数或负数。“Expires”头标的值将通过当前系统时间加上设定time值来设定。
time值还控制"Cache-Control"的值:
负数表示no-cache
正数或零表示max-age=time

阅读剩余部分 -

王者荣耀兵线刷新时间

00:10.0 
00:43.2 
01:16.5 
01:49.8 
02:23.0 
02:56.2 
03:29.5 
04:02.7 

04:05后


04:36.0 
05:09.3 
05:42.5 
06:15.7 
06:49.0 
07:22.3 
07:55.5 
08:28.7 

09:00后


09:02.0 
09:35.2 
10:08.5 
10:41.8 
11:15.0 
11:48.2 
12:21.5 
12:54.8 

13:00后

阅读剩余部分 -

解决Python3下打印utf-8字符串出现UnicodeEncodeError的问题

最近在对bismarck进行升级,主要是从Python2迁移到Python3,并更换爬取方案。

结果出师不利,在将爬取到的商品标题print出来时,抛出错误:

  root@fb6e7c6fbe5c:/home/binss# python3 amazon_test.py
  Traceback (most recent call last):
  File "amazon_test.py", line 30, in
  print(s)
  UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128)

Python2时代最怕就是这个UnicodeEncodeError,没想到到了Python3,又见到它了。

查看第一个字符,发现为'\u8266',于是测试以下代码:

  >>> print('\u8266')

果然报错

  Traceback (most recent call last):
  File "", line 1, in
  UnicodeEncodeError: 'ascii' codec can't encode character '\u8266' in position 0: ordinal not in range(128)

尝试了各种姿势,结果还是没能解决。

最后突发奇想,print不行,那我把其输出到文件捏?

阅读剩余部分 -

通过修改http请求的header请求头来伪造ip

在正常的tcp/ip协议中是很难伪造ip的,因为在tcp/ip正式通信之前是有一个三次握手的过程,通过三次握手建立了tcp/ip连接之后再进行正常的通信,所以我之前想用python的scapy库来伪造其他ip的请求包,但是因为三次握手的时候,我的ip是伪造的,我发出去的请求包就没有办法正确的返回找到我,所以无法三次握手就没有tcp/ip正常通信,就失败了。

只要能够在tcp/ip层伪造ip,就是完全的伪造ip,没有任何办法判断,不过我这次的是在http层伪造ip,所以还是可能被发现的,而且也只有在http协议中有用,无法利用在其他地方。

那么如何在http层伪造协议呢?我们先来了解一些http请求中的请求头header,比如说我们在chrome中登陆百度,打开chrome的开发者工具,查看network,就能够看到这次请求百度的header请求头。

Requests Headers

  1. Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
  2. Accept-Encoding:gzip, deflate, sdch
  3. Accept-Language:zh-CN,zh;q=0.8
  4. Connection:keep-alive
  5. Cookie:BIDUPSID=XXX; PSTM=XXX; BAIDUID=XXX:FG=1; BDUSS=XXX; __cfduid=XXX; ispeed_lsm=2; BD_HOME=1; BDRCVFR[Ups602knC30]=XXX; BD_CK_SAM=1; H_PS_PSSID=XXX; BD_UPN=XXX; H_PS_645EC=XXX; locale=XXX; BDSVRTM=0; BD_LAST_QID=XXX
  6. Host:www.baidu.com
  7. Upgrade-Insecure-Requests:1
  8. User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/49.0.2623.108 Chrome/49.0.2623.108 Safari/537.36

可以看到这里有很多的请求参数,在我们打开百度的时候,我们先要向百度服务器发送一个请求,而这个请求包含很多附加的关于我们自己的信息,比如说浏览器信息,cookie,接受数据格式等等,百度服务器收到我们的请求之后,返回给我们百度的页面。

在我们发送http请求之前,就已经先进行了tcp/ip三次握手,然后再发送http请求,三次握手的过程是非常迅速的,可以用抓包工具 wireshark 查看。

所以 header 请求头主要是一些我们发送请求时附带的我们自己的信息,同时,在看到 header 请求头的时候,也会发现在服务器返回数据的时候也会带有一个 header ,这是返回数据格式的一些信息,包括返回数据的格式,大小,时间等。

阅读剩余部分 -

宝塔面板中WordPress的权限解决方法

有一段时间没有用了wordpress了,今天有空折腾了一下宝塔面板。在安装玩wordpress后,发现无法直接操作文件,比如无法删除/安装插件和主题,提示需要ftp。实际上这个是因为权限没有给到位,导致wordpress无法读写所在目录。
首先,肯定不能使用chmod +777 -R这种简单粗暴的方法,不仅不安全,还有可能直接影响到部分使用apache的人。详情可以点击这里,查看官方的说明。
既然777行不通,那就使用define(“FS_METHOD”, “direct”);,通过使用FS_METHOD配合tmp来完成,但是等写完配置文件后发现还是不可以,还是权限有问题,具体原因也没有去想了。在查看的时候,想到宝塔面板默认的账户是www,那就一步到位,使用以下的命令实现了功能:

chown -R www:www /www/wwwroot/domain.com

通过直接给www用户权限,让它接手所有文写的读写和执行,而root权限则只给到755。

阅读剩余部分 -

Caddy proxy指令详解

简介

Caddy的proxy可以用于配置:

  1. 普通的反向代理
  2. 负载均衡:支持多策略,健康检查,故障转移
  3. WebSocket代理

开启该指令后,Caddy的proxy中间件会添加一个可用于 {upstream} 的占位符,用于记录哪一个代理的处理的请求.

proxy完整语法格式为:

proxy from to... {
policy name [value]
fail_timeout duration
max_fails integer
max_conns integer
try_duration duration
try_interval duration
health_check path
health_check_port port
health_check_interval interval_duration
health_check_timeout timeout_duration
header_upstream name value
header_downstream name value
keepalive number
without prefix
except ignored_paths...
upstream to
insecure_skip_verify
preset
}
  • from 被代理的请求的路径
  • to 代理的断点,可以是多个,支持 http/https/quic/srv/unix/quic, 如果是 srv:// 或者 srv+https:// 则被认为是一个服务定位器,Caddy将通过SRV DNS去解析
  • policy 负载均衡策略,必须有多个后端.如果后端是服务定位器则不可以,可选的有random, least_conn, round_robin, first, ip_hash, uri_hash 和 header, 默认为random
  • fail_timeout 失败了的请求记住多久.如果在这期间达到了max_fails,则被考虑为挂掉了,不会再有请求发送过去,除非失败的请求被忘记了.默认为0,总是可用.
  • max_fails 如果fail_timeout为0则无效,默认为1
  • max_conns 每一个后端的最大请求数,默认0,没有限制,如果达到了返回502错误.
  • try_duration 第一个上游失败了,挂起外面来的请求多久
  • try_interval 某一个上游服务器挂了之后等待多久切换下一个上有服务器,默认250ms. 设置为0并且设置了duration可能占满cpu
  • health_check 设置一个路径,Caddy将定期发出请求,如果返回200和399就认为正常,否则就不正常,然后提前定义的interval间隔里他就是被考虑不正常的.
  • health_check_port 设置一个额外的检查端口,如果是服务定位器就无效
  • health_check_interval 健康检查间隔,默认30s
  • health_check_timeout 检查超时时间,默认60s
  • header_upstream 传递到后方的头,可以多个,也可以用请求占位符
  • header_downstream 修改返回的响应头
  • keepalive 保持多少和后端之间闲置的连接,设置为0关闭keepalive
  • without 去掉的前缀(/api/foo without /api 将访问 /foo. )
  • except设置不代理的路径
  • upstream 基本等同于to配置
  • insecure_skip_verify 重载后端TLS认证,禁用HTTPS的安全功能
  • preset 支持的有websocket和transparent

阅读剩余部分 -

伪造IP 请求网站

在 http 头中有一个字段:X-Forwarded-For,该字段是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。

假设一个场景,你的网站使用了 CDN 加速, CDN 会隐藏掉你源站的真实 IP, 当请求到达时,会先请求到 CDN 边缘节点,而后转发到源站,此时你可以把 CDN 当做是一个代理服务器,事实上,它也确实是一个代理服务器。

字段介绍

X-Forwarded-For 请求头格式非常简单,就这样:

X-Forwarded-For: client, proxy1, proxy2

其内容由英文逗号 + 空格隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。

如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,服务端最终会收到以下信息:

X-Forwarded-For: IP0, IP1, IP2

阅读剩余部分 -

最新文章

归档

其它

链接

meiyoutongji