分类 我爱编程 下的文章

简单记录squid搭建一个透明代理缓存服务器

外网:

eth0 Link encap:Ethernet HWaddr 00:0C:29:02:DC:6B
inet addr:192.168.96.132 Bcast:192.168.96.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe02:dc6b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:118 errors:0 dropped:0 overruns:0 frame:0
TX packets:89 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12283 (11.9 KiB) TX bytes:14421 (14.0 KiB)

内网:

eth1 Link encap:Ethernet HWaddr 00:0C:29:02:DC:75
inet addr:10.8.8.205 Bcast:10.8.8.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe02:dc75/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1496 errors:0 dropped:0 overruns:0 frame:0
TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:97417 (95.1 KiB) TX bytes:1608 (1.5 KiB)

 

主要实现原理:

当代理服务器中客户端需要的数据时:

a. 客户端向代理服务器发送数据请求;

b. 代理服务器检查自己的数据缓存;

c. 代理服务器在缓存中找到了用户想要的数据,取出数据;

d. 代理服务器将从缓存中取得的数据返回给客户端。

当代理服务器中没有客户端需要的数据时:

1. 客户端向代理服务器发送数据请求;

2. 代理服务器检查自己的数据缓存;

3. 代理服务器在缓存中没有找到用户想要的数据;

4. 代理服务器向Internet 上的远端服务器发送数据请求;

5. 远端服务器响应,返回相应的数据;

6. 代理服务器取得远端服务器的数据,返回给客户端,并保留一份到自己的数据缓存中。

 

安装squid:debian/ubuntu:apt-get update & apt-get install squid -y         centos:yum update & yum install squid -y

 

检查squid是否开机启动:chkconfig,若不是开机启动则设置为开机启动:chkconfig --level 35 squid on

 

squid 的主配置文件是 /etc/squid/squid.conf,红色为重点配置

 

http_port 3128      //设置监听的IP与端口号

cache_mem 64 MB      //额外提供给squid使用的内存,squid的内存总占用为 X * 10+15+“cache_mem”,其中X为squid的cache占用的容量(以GB为单位),
//比如下面的cache大小是100M,即0.1GB,则内存总占用为0.1*10+15+64=80M,推荐大小为物理内存的1/3-1/2或更多。
maximum_object_size 4 MB   //设置squid磁盘缓存最大文件,超过4M的文件不保存到硬盘

minimum_object_size 0 KB   //设置squid磁盘缓存最小文件

maximum_object_size_in_memory 4096 KB   //设置squid内存缓存最大文件,超过4M的文件不保存到内存

cache_dir ufs /var/spool/squid 100 16 256   //定义squid的cache存放路径 、cache目录容量(单位M)、一级缓存目录数量、二级缓存目录数量

logformat combined %&gt;a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}&gt;h" %Ss:%Sh //log文件日志格式

access_log /var/log/squid/access.log combined  //log文件存放路径和日志格式

cache_log /var/log/squid/cache.log   //设置缓存日志

logfile_rotate 60   //log轮循 60天

cache_swap_high 95  //cache目录使用量大于95%时,开始清理旧的cache

cache_swap_low 90   //cache目录清理到90%时停止。

acl localnet src 10.8.8.0/24  //定义本地网段

http_access allow localnet  //允许本地网段使用

http_access deny all  //拒绝所有

visible_hostname squid.david.dev  //主机名

cache_mgr mchina_tang@qq.com  //管理员邮箱

 

配置好squid后初始化:squid -z

 

启动squid:service squid start

 

打开浏览器-设置-更改代理服务器设置-局域网设置-代理服务器

地址:10.8.8.205   端口:3128     

勾上-确定

 

 

随便打开一个网页,能正常打开并刷新说明此事squid的正向代理是通的

 

接下来配置防火墙,利用防火墙透明代理:

debian7/ubuntu14.04:vi /etc/iptables.rules

centos6:vi /etc/sysconfig/iptables

注意:centos7与debian8默认不是iptables,而是firewalld,请关闭firewalld开机启动,并安装iptables设置开机启动

iptables -t nat -I PREROUTING -i eth0 -s 10.8.8.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128

保存:service iptables save

重启:service iptables restart

 

修改本地网关为:10.8.8.205

 

 

 

保存,重新打开网页,能正常打开网页说明透明代理已成功

 

若不能则尝试清空防火墙,清空时请先备份:

debian7/ubuntu14.04:cp /etc/iptables.rules /etc/iptables.rules.bak

centos6:cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak

iptables -F

保存:service iptables save

重启:service iptables restart

若此时透明代理正常,则判断是否受到FORWARD规则的影响,

删除空的防火墙规则,恢复备份:

debian7/ubuntu14.04:rm  /etc/iptables.rules & mv /etc/iptables.rules.bak /etc/iptables.rules

centos6:rm  /etc/sysconfig/iptables & mv /etc/sysconfig/iptables.bak /etc/sysconfig/iptables

 

编辑防火墙规则,并注释关于FORWARD的规则,

保存:service iptables save

重启:service iptables restart

若此时透明代理正常则说明FORWARD规则存在问题,请检查规则规则

若依然无法进行透明代理,则检查squid配置文件,或检查是否已开启路由模式:vi /etc/sysctl.conf    检查net.ipv4.ip_forward = 1

保存重启

Nginx+UWSGI+Django配置全过程

Nginx + uwsgi + Django 安装配置

一、安装Nginx uwsgi Django

安装tengine


yum install pcre-devel -y 
wget http://tengine.taobao.org/download/tengine-2.1.1.tar.gz
tar xf tengine-2.1.1.tar.gz
cd tengine-2.1.1
./configure
make
make installl


wget https://www.djangoproject.com/m/releases/1.4/Django-1.4.22.tar.gz
tar xf Django-1.4.22.tar.gz
cd Django-1.4.22
python setup.py install


安装uwsgi#安装位置默认在/usr/local/nginx

安装Django


pip install uwsgi



#!/usr/bin/env python
#coding:utf8
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["Hello World"]

执行命令:二、配置

1、测试uwsgi代理功能

测试文件test.py

uwsgi --http :8000 --wsgi-file test.py



在浏览器中访问,http://localhost:8000 如果出现Hello World 则说明uwsgi代理正常工作

2、测试uwsgi 启动django项目

创建项目:

# django-admin startproject myapp

在myapp/myapp/有一个wsgi.py文件

执行命令:

# cd myapp

# uwsgi --http :8000 --wsgi-file myapp/wsgi

在浏览器中访问http://localhost:8000

如果网页正常则一切顺利。。。。。。

说明:从客户商到 uWSGI 再到 Django 是正常的,uwsgi可以正常启动django项目

3、配置nginx + uwsgi + django

首先配置使用http的方式:

编辑配置文件/usr/local/nginx/conf/nginx.conf

内容如下:

user  nginx; #使用nginx用户
    worker_processes  2;
    events {
        use epoll;
        worker_connections  65535;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        tcp_nopush     on;
        keepalive_timeout  65;
        gzip  on;
        upstream django {
            server 127.0.0.1:8001;
        }
        server {
            listen       80;
            server_name  localhost;
            client_max_body_size 75M;
                location / {
                uwsgi_pass django;
                include uwsgi_params;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
     }
uwsgi --http :8001 --wsgi-file myapp/wsgi

使用浏览器访问http://localhost 应该用正常访问,出现以下图片:wKiom1XdTRTjyyPXAAGbKGgXMf4577.jpg用UNIX socket取代tcp port执行命令:

修改nginx.conf
    upstream django {
            #server 127.0.0.1:8001;
            server unix:///test/myapp.sock;
        }
uwsgi --socket /test/myapp.sock --wsgi-file myapp.wsgi

到此nginx+uwsgi+django已经初步实现了,下面来为uwsgi设置一个配置文件

4、配置myapp_uwsgi.ini

在Django项目目录下创建myapp_uwsgi.ini 内容如下:来创建/test这个目录

mkdir /test

chown nginx:nginx /test #如果不修改用户权限,nginx无法访问此socket 无法实现代理

会报如下错误:

connect() to unix:///test/myapp.sock failed (13: Permission denied)

启动:

[uwsgi]
uid = nginx  #使用nginx用户和组
gid = nginx
chdir = /usr/local/myapp #指定项目目录
module = myapp.wsgi #加载myapp/wsgi.py这个模块
master = true  #启动主进程。
processes = 2 #启动2个工作进程
listen = 120 #设置socket的监听队列大小(默认:100)
socket = /test/myapp.sock #指定socket文件
pidfile = /var/run/uwsgi.pid #指定pid文件
vacuum = true #当服务器退出的时候自动删除unix socket文件和pid文件。
enable-threads = true #允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程
buffer-size = 32768 #设置用于uwsgi包解析的内部缓存区大小为64k。默认是4k。
reload-mercy = 8 #设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了8秒就会被强行结束(忽略之前已经接收到的请求而直接结束)
max-requests = 5000 #为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用(重启)。你可以使用这个选项来默默地对抗内存泄漏
limit-as = 256 #通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数。这个配置会限制uWSGI的进程占用虚拟内存不超过256M。如果虚拟内存已经达到256M,并继续申请虚拟内存则会使程序报内存错误,本次的http请求将返回500错误。
harakiri = 60 #一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)
daemonize = /var/log/myapp_uwsgi.log # 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器
uwsgi --ini myapp_uwsgi.ini

测试是否正常,如果不正常,可以查看日志,排错。

到此Nginx  +  Uwsgi + Django配置完成 ,并正常使用。整个过程走了很坑,找了很文章和资料,uwsgi还有很多选项,参考了网友的文章

参考链接:

http://www.jianshu.com/p/e6ff4a28ab5a

http://heipark.iteye.com/blog/1847421

 

原文:http://zhou123.blog.51cto.com/4355617/1688434启动:

python之微信公众号上传多媒体素材

多媒体上传使用Post方式,用到requests第三方包

使用pip安装pip install requests

先根据AppID和AppSecret获取AccessToken

以下为已封装获取AccessToken方法

wechat = WeChat()
AccessToken = wechat.getAccessToken()

#上传临时素材接口
def uploadImage(request):
    type = 'image'
    filedata = {
        "image": open("D://PY/wechat-ss-panel-v3/static/image/1.jpg", "rb")
    }
    url = 'https://api.weixin.qq.com/cgi-bin/media/upload?access_token='+AccessToken+str('&type=')+str(type)
    msg = requests.post(url, files=filedata)
    return HttpResponse(msg)

上传成功返回:{"type":"image","media_id":"9Oupzm4rCWW4L52CRntGElzfi1ADJ70oSu3A1zqWPZbDLLk_24_SJwnaTGaRaMd1","created_at":1489023645}



微信公众号接口 添加菜单时中文的问题(errcode":40033 invalid charset)

错误:

{"errcode":40033,"errmsg":"invalid charset. please check your request, if include \\uxxxx will create fail!"}

由于dumps将dict转换成str时中文会被转换成unicode格式

所以在使用dumps转换时使用

ensure_ascii=False禁止中文转换

 

菜单参数:

menu={
 "button": [
 {
 "type": "click",
 "name": "随机电影",
 "key": "电影+随机"
 },
 {
 "type": "click",
 "name": "作者",
 "key": "作者"
 },
 {
 "name": "MarkSS",
 "sub_button": [
 {
 "type": "click",
 "name": "邀请码",
 "key": "邀请码"
 },
 {
 "type": "click",
 "name": "签到",
 "key": "签到"
 },
 {
 "type": "click",
 "name": "私有节点",
 "key": "私有节点"
 },
 {
 "type": "click",
 "name": "科学上网",
 "key": "科学上网"
 },
 ]
 }]
}

接口测试:
def createTable(request):
    param = Params.menu
    data = dumps(param, ensure_ascii=False) #dumps是将dict转化成str格式,loads是将str转化成dict格式
    data=bytes(data,'utf8')
    #params = urllib.parse.urlencode(param).encode('utf-8')
    url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='+AccessToken
    create_url = urllib.request.Request(url)
    msg = urllib.request.urlopen(create_url, data)
    return HttpResponse(msg)


Django运行访问项目出现的问题:DisallowedHost at / Invalid HTTP_HOST header

Django运行访问项目出现的问题:DisallowedHost at / Invalid HTTP_HOST header:

DisallowedHost at /

Invalid HTTP_HOST header: '10.211.55.6:8000'. You may need to add u'10.211.55.6' to ALLOWED_HOSTS.

 

Request Method: GET
Request URL: http://10.211.55.6:8000/
Django Version: 1.10.4
Exception Type: DisallowedHost
Exception Value:
Invalid HTTP_HOST header: '10.211.55.6:8000'. You may need to add u'10.211.55.6' to ALLOWED_HOSTS.
Exception Location: /usr/lib/python2.7/site-packages/django/http/request.py in get_host, line 113
Python Executable: /usr/bin/python
Python Version:

 

1,以上时我访问请求的时候出现的,原因在于Django框架中的创建的一个项目的时候,

2,跑下这个命令:Python manage.py runserver 10.211.55.5:8000

3,然后在我本机的浏览器中写入上述IP和端口请求过去:http://10.211.55.6:8000

4,于是就出现了最上面的那个问题;

5,于是就去django-admin.py startproject project-name创建的项目中去修改 setting.py 文件:

ALLOWED_HOSTS = ['*']  #在这里请求的host添加了*

6,于是就成功的访问到了Django的项目了;

 

原文:http://blog.csdn.net/will5451/article/details/53861092