背景
最近由 MAC 换成了 Windows 零碎了, 在写博客的时候发现没有相似于 Mac 上的 iPic 这样好用的图床工具, 本着本人入手饥寒交迫的准则, 筹备本人实现一个, 具体过程是在 cmd 中能够上传指定图片, 而后生成 md 格局的图片门路, 并复制到剪切板, 在应用的时候能够间接粘贴即可
用到的技术
本次所用到的技术如下:
\- Python3.6
\- 阿里云 OSS
\- 阿里云 ECS
\- nginx
OSS
首先图床利用须要抉择图片存储的地位, 恰好在双十一的时候, 阿里云赠送了 40G 的 OSS 资源包, 于是就抉择了阿里云的 OSS
创立 Bucket
阿里云的 OSS 在应用的时候首先须要创立 Bucket, 能够简略的了解为 40G 是咱们硬盘的总大小, 而 Bucket 是磁盘分区,Bucket 创立的时候, 须要配置拜访权限
这里须要留神的是区域须要抉择和你的 ECS 服务器是同一个区域的, 因为这样内网拜访才不会走流量, 否则依照文档上的说法, 是只能走公网拜访, 而读写权限这里, 我抉择的是公共读, 我的了解是能够拜访图片, 而不能上传图片
Python 代码
接下来是 Python 的代码局部, 需要是上传图片, 而后将合乎 MD 格局的图片文本写入剪切板中, 首先是代码
import oss2
import uuid
import pyperclip #用来操作粘贴板
# 获取近程文件名
def get_remote_file_name(local_name):
name = uuid.uuid4().__str__().replace("-", "").upper()
local_name = str(local_name).rsplit(".")
return "pics/%s.%s" % (name, local_name[-1])
BUCKET_NAME = "cfy-pic"
PRE = "http://**.**.**.**:88/img/"
ENDPOINT = "http://oss-cn-beijing.aliyuncs.com"
ACCESS_KEY_ID = "******"
ACCESS_KEY_SECRET = "*************"
PIC_STYLE = "?x-oss-process=style/CfyInfo"
src_file = sys.argv[1] # 获取文件门路
auth = oss2.Auth(ACCESS_KEY_ID, ACCESS_KEY_SECRET)
bucket = oss2.Bucket(auth, ENDPOINT, BUCKET_NAME)
remote_file_name = get_remote_file_name(src_file)
bucket.put_object_from_file(remote_file_name, src_file) # 上传文件
result_str = "![](%s%s%s)" % (PRE, remote_file_name,PIC_STYLE)
pyperclip.copy(result_str) # 将后果复制到粘贴板不便间接应用
print(result_str)
首先解释一下用到的三个库
oss2
这是阿里云的 pythonsdk, 能够通过 pip 进行装置
pip install oss2
在这里阐明一下我遇到的坑, 因为是刚换的 Windows, 默认的 pip 门路是在 User/ 用户名下的, 而我的用户名设置的是中文的,Python3 曾经默认是 utf8 编码了, 然而 windows 零碎的默认编码是 gbk, 所以导致 pip 简直不可用的状态, 尽管能够改编码格局, 然而起初我在生成 exe 文件的时候又遇到坑了, 在将用户名批改为英文的之后就好了
pyperclip
这是一个读写剪切板的库, 应用起来非常简单, 然而只能读写文本类型
pip install pyperclip
它的外围办法就两个, 一个是 paste 粘贴, 一个 copy 将文本内容复制剪切板, 示例代码
import pyperclip
pyperclip.copy("Hello World") # 这个时候你能够应用 ctrl+ v 测试一下
s = pyperclip.paste()
print(s)
uuid
这里抉择 uuid 作为文件名, 因为上传到 oss 上是基于文件名的, 为了避免重名, 所以上传的图片, 都应用 uuid 进行命名
代码
pre 是我的 ECS 服务器的 IP 地址,nginx 监听的是 88 端口, 这前面再说,ENDPOINT 和 ACCESS\_KEY\_ID 以及 ACCESS\_KEY\_SECRET 均能够在阿里云的网站上找到
而最初的参数是图片的水印
整体的思路就是通过 oss 的 sdk 进行上传, 在上传时通过 uuid 生成一个云端的文件名, 并最初与 ECS 的地址进行拼接, 最初生成合乎 MD 的格局, 写入到剪切板中
生成 EXE
目前的代码曾经可能应用了, 然而应用的时候是 Python 脚本, 须要在终端进入脚本寄存的文件夹, 很不不便, 所以想要生成一个 exe 文件, 并退出到环境变量中, 这样应用起来就会不便很多, 对于把 python 脚本打包成 exe 文件, 应用了 Pyinstaller
首先是通过 Pip 进行装置
pip install pyinstaller
而后在终端中进入脚本所在的文件夹, 执行命令
pyinstaller --onefile upload.py
这样就会将 upload.py 打包成 exe 文件, 生成的 exe 文件目录在 dist 文件夹中, 接着把这个 exe 文件复制一份到 d:\scripts 门路中, 并把这个 scripts 退出到环境变量中, 成果是在任何地位, 终端中输出 upload 都能够应用这个命令例如
ps: 我的终端应用的 cmder, 比 window 自带的 cmd 或者 powerShell 的益处是命令与 linux 是一样的, 例如显示以后文件的文件命令是 ls, 而不是 windows 下的 dir, 并且自带 ssh
nginx
最开始实现的时候, 并没有想到要应用 nginx 进行代理, 而是间接应用了 oss 提供的公网域名, 然而用了 1 天阿里云给我来了短信, 通知我欠费了, 起初才晓得, 资源包只能是文件存储, 而不包含公网流量, 阿里云的客服通知我, 上传时不须要付费的, 然而公网拜访是须要按流量付费, 然而如果是阿里云的服务器应用内网拜访则不须要付费, 恰好我有一个测试用的小服务器, 于是配置了一下 nginx 来进行代理
nginx 的装置
装置编译工具及库文件
yum -y install mak zlib zlib-devel gcc-c++ libtool openssl openssl-devel
装置 PCRE
PCRE 作用是让 Nginx 反对 Rewrite 性能
-
下载 PCRE 安装包
wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
-
解压安装包
tar zxvf pcre-8.35.tar.gz
-
进入装置目录
cd pcre-8.35
-
编译装置
./configure make && make install
装置 Nginx
-
下载 Nginx
wget http://nginx.org/download/nginx-1.6.2.tar.gz
-
解压安装包
tar zxvf nginx-1.6.2.tar.gz
-
进入安装包目录
cd nginx-1.6.2
-
编译装置
./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=pcre 的装置门路 /pcre-8.35 make make install
至此 Nginx 就装置完了
Nginx 的配置
首先创立 Nginx 运行应用的用户 www
/usr/sbin/groupadd www
/usr/sbin/useradd -g www www
而后是配置 nginx, 找到你的 nginx 的配置文件 nginx.conf
user www www;
worker_processes 2; #设置值和 CPU 外围数统一
error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志地位和日志级别
pid /usr/local/webserver/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
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';
#charset gb2312;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m;
#上面是 server 虚拟主机的配置
server {
listen 88;
location /img/ {proxy_pass http://***.**-cn-**-internal.aliyuncs.com/;}
error_page 500 502 503 504 /50x.html;
location = /50x.html {root html;}
}
}
重点是 server 中示意了监听 88 端口, 而后当门路是 /img/ 的就会匹配, 并通过 proxy\_pass 来转发到 oss 的内网地址, 这样就实现了 nginx 的代理
至此, 全副的性能就实现了
罕用的 Nginx 命令
/usr/local/webserver/nginx/sbin/nginx # 启动 Nginx
/usr/local/webserver/nginx/sbin/nginx -t # 查看配置文件 nginx.conf 的正确性
/usr/local/webserver/nginx/sbin/nginx -s reload # 从新载入配置文件
/usr/local/webserver/nginx/sbin/nginx -s reopen # 重启 Nginx
/usr/local/webserver/nginx/sbin/nginx -s stop # 进行 Nginx