搭建开始前,我们先来梳理下web服务工作流程,先看下图:
1、用户(PC)向web服务器发起http请求
2、web服务器判断用户请求文件是否为静态文件,是则直接读取静态文件并返回给用户,不是则通过WSGI协议将请求丢给web框架(django)代码处理
3、看web框架是否启动django中间件,如果启用,则依据中间件对请求进行修改,如果不启用,则进入下一步
4、web框架中的路由程序将根据请求中的url文件名将请求路由至相应py文件
5、相应py文件收到请求后根据用户提交的参数进行计算(期间可能会调用数据库),然后返回计算后的结果和自定义头部信息以及状态码返回
6、web框架将返回的数据打上通用标识符(头部信息)后返回给web服务器
7、web服务器打上web服务器的通用标识符(头部信息)后返回给用户
8、用户收到返回的数据
通过上面可以看到django框架基于WSGI协议和web服务器进行交互,那么WSGI协议又是什么呢? 咱们用代码来说明(伪代码。
写一个简易的遵循WSGI协议的web服务器软件和django程序):
WSGI服务器的程序:
class WSGI_WEB(object):
def __init__(self):
# 1. 创建套接字
self.tcp_server_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 2. 绑定
self.tcp_server_socket.bind(("", 7890))
# 3. 变为监听套接字
self.tcp_server_socket.listen(128)
def set_response_header(self, status, headers):
self.status=status
self.headers=[("server", "WSGI_simple_web v1.0")]
self.headers +=headers
def run(self):
new_socket, client_addr=self.tcp_server_socket.accept()
env=new_socket.recv(1024)
body=application(env, set_response_header) # env是web服务器接收到浏览器发送来的数据包;set_response_header为web服务器的一个方法地址,目的是让django帮web服务器生成http头部(不是以return的形式给web服务器);此外还有这里调用django里的应用还有一个最核心的任务,就是获取返回数据的body!
header=self.status + self.headers
response=header + body
new_socket.send(response.encode("utf-8"))
django的app程序:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
问题:
在生产环境中使用django提供的简易web服务器性能太差,一般只用于调试。强大的nginx又不支持WSGI,那么怎么办呢?
方案:
在nginx和python应用之间加一层支持WSGI协议的web服务器。以后静态文件由nginx进行处理,动态文件丢给WSGI服务器,然后WSGI服务器再丢给web框架处理。最理想的支持WSGI协议的web服务器就是uWSGI。
下面来详细介绍下搭建uWSGI服务器以及与nginx联动的方法:
1、安装uWSGI(支持WSGI的WEB服务器):
centos下python3.6安装uWSGI方法:
yum install -y gcc* pcre-devel openssl-devel python36-devel.x86_64
pip3.6 install uwsgi
2、开启uWSGI服务
方式一:
uwsgi --http 192.168.31.123:80 --file teacher/wsgi.py --static-map=/static=static
--http 监听IP端口
--file 项目wsgi.py文件路径
--static-map 静态文件路径
注意: 执行这条命令的时候:一定要在这个项目目录中~
方式二(使用配置文件):
vi uwsgi.ini:
[uwsgi]
# 监听端口(nginx采用反向代理模式时必填)
http=0.0.0.0:8888
# 项目目录
chdir=/opt/test/test1/
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 指定项目的application(我猜是这里的“test1.wsgi”拼接上面的项目目录后,就将项目中的wsgi.py文件和uWSGI服务器关联起来了)
module=test1.wsgi:application
# 指定sock的文件路径(nginx采用本地模式时必填)
socket=/opt/test/script/uwsgi.sock
# 启用主进程
master=true
# 进程个数
workers=5
pidfile=/opt/test/script/uwsgi.pid
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/opt/test/script/uwsgi.log
# 设置隔多久加载一次项目代码
py-autoreload=1
执行配置文件(注意:这里用什么账户执行的,以后渗透进来获取到的就是什么账户。所以这一步切忌不要用root执行。):
uwsgi --ini uwsgi.ini
彩蛋:
重启uWSGI进程: uwsgi --reload uwsgi.pid # 代码做变更后uWSGI进程不会立即加载,此时可以重启一下uWSGI进程让它生效。。。是不是感觉有点坑,没事,可以在配置文件中设置py-autoreload
关闭uWSGI进程: uwsgi --stop uwsgi.pid
3、配置nginx
方式一(反向代理模式):
upstream uwsgi{
server 10.10.10.29:8888;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://uwsgi; # 通过反向代理和uWSGI服务器关联
}
}
方式二(本地模式):
server {
listen 8080;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
include uwsgi_params; # 指定nginx和uWSGI服务器的通信方式
uwsgi_connect_timeout 30;
uwsgi_pass unix:/opt/test/script/uwsgi.sock; # 通过sock文件和uWSGI服务器关联! 因为nginx会去读取.sock文件,所以需要关闭selinux才行!!!
}
}
4、此时访问django的admin管理后台时,静态资源会调取失败。这时可以将该项目所有静态资源统一收集到一个文件夹下,然后由nginx统一去调取,真正做到动静分离(动的给uWSGI,静的由nginx直接调取):
在settings.py中加入:
TATIC_ROOT=os.path.join(BASE_DIR, 'static_file')
执行如下命令(搜集项目中所有静态文件至'static_file'目录):
python3.6 manage.py collectstatic --noinput
此时会在项目目录下生成一个'static_file'文件夹,内含admin和所有app涉及的静态文件 。
在nginx中配置静态文件路径(如果nginx和uWSGI不属同一台服务器可以使用反向代理的方式来调取静态文件):
location /static/ {
alias /opt/test/test1/static_file/;
}
此时就可以访问基于python后台的web网站了。
当然不能只为游戏外挂去学习,学习多个技术,提升自己,你会发现其中很多小秘密都是贯通的,在此小编帮助大家整理了一套python教程,如果自己零基础或者进阶的基本都有合适的,下面展示了部分,希望也能帮助对编程感兴趣,如果能帮到你请点赞、点赞、点赞:
电子书系列:
点赞,收藏并转发文章后,进入小编主页,看以下图片操作:
一、前言】
本文章主要讲解Nginx的基础搭建(如果有不知道web服务器的可以百度,或者我再做一篇图解web)。
Nginx在互联网中作为一个不可或缺的组件,我们看到LNMP集成环境。LNMP(Linux+Nginx+Mysql+Php);如果只知道这个不知道Nginx的搭建过程的话我们有Nginx的主要特性会错过。比如Nginx的优点:
高可用(一个组件可以服务上千人)
热部署(可以做到不停机就能升级基础设施服务)
反向代理(通常可以,上游反向代理,下游负载均衡处理外部请求)
【二、Nginx搭建】
1、首先先下载一个版本。
2、Nginx版本分支
3、版本如下:
1)MainLine Version(主线版本开发)
2)Stable(稳定版本)
3)Legacy Version(历史版本)-- 如果项目需要上到选定版本可以选这个
4、下载(我们以Nginx Stable Version为例子)。我们能看到Stable Version底下有三个栏目:
1)CHANGE-1.16 是介绍这个版本和上个版本的区别
2)Nginx-1.16 pgp 这个是Linux版本下载选项,将会下载倒tar.gzNginx/Windows
3)1.16.1 这个是Windows系统下载的,将会下载window包
【三、Nginx文件目录(如下)】
1、文件目录如下所示:
2、文件内容解析如下:
1)conf(存放配置文件):Nginx.conf(主要的建站配置文件夹)
2)contrib(是一些Linux的Vim配置文件):作用是将整个vim文件移动到~/.vim/profile目录底下,就会在vim下有高亮表现
3)doc (documentation 文档目录):一些日志改变以及readme文档还有License授权
4)html(默认的html,网站的入口):
5)logs(默认的日志文件夹)
6)temp(临时文件目录)
【四、Windows下搭建】
首先需要解决如何对下一页的网址进行请求的问题。可以点击下一页的按钮,观察到网站的变化分别如下所示:
1、Windows下我们直接点击Nginx根目录下的Nginx.exe即可立即使用了。闪退是正常现象,之后检查端口查看是否被占用,第一次启动推荐使用命令行启用 :
.\nginxpath\nginx.exe(一直停留不变则说明开启成功)
2、 然后我们打开网址:
http://localhost:80
3、这样就是成功 如果失败了看下面。使用Windows + R启动命令行,拥有最高权限,输入命令:
netstart -ano | findstr 80 #找到占用的pid号。
4、然后将其kill掉,命令如下:
taskkill /F /pid
5、之后在使用最开始的方法启动即可。
【五、Linux环境下(Centos下)搭建】
2、首先先安装被依赖的插件,命令如下:
yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
3、之后依次如此下列的命令,记得看注释噢~
tar -zxvf Nginx-1.16.1.tar.gz
cd Nginx-1.16.1
# 这下面几步骤是进行加载vim插件的,使其在修改conf的时候可以进行常亮
cd contrib
mv contrib ~/.vim
cd ..
# path自己需要安装的地方
./configure -prefix=/path/Nginx
# configure完成后即可,make && make install去
# configure 是进行配置化操作
# make 是进行编译操作
# make install 是进行编译后文件的部署行为
# 为了方便就将make && make install 一起进行
4、之后运行Nginx,命令如下:
cd /nginxInStallPath
./Nginx
#没有任何信息则是运行成功了。Linux的没有任何消息就是最好的消息
curl http://localhost
5、至此Nginx搭建完成。下列命令是一些常规的操作命令:
./Nginx -s reload #重新加载(Nginx能做到热部署的一个原因)
./Nginx -s stop #关闭服务器
./Nginx -t # 可以测试刚修改的Nginx.conf能否生效
【六、Nginx.conf配置】
1、下面是进行Nginx.conf配置,命令如下:
# 下面是进行Nginx.conf配置
cd conf
vim Nginx.conf
2、修改文件中的内容如下所示:
worker_processes number;
# error_log path #错误日志文件位置
# error_log path notice 提醒错误文件位置
# error_log path info 一些Logger::info的输出位置
events {
work_connections 1024; #定义最大连接数量
}
# http 定义http的位置(高难度配置下章在讲解)
http {
include mine.types; #定义包含类型,网页请求request_type的地方属性值设置地方在mine.types文件里卖你
default_type:application/ocet-stream #设置属性流
sendfile on; #从一个 buffer到另一个 buffer的拷贝用于优化速度
#tcp_nopush on;
keepalive_timeout 60; #设置请求超时时间
server {
listen 80 # 设置监听的端口
server_name localhost # 设置监听的域名
charset koi8-r #设置字符集
#access_log logs/host.access.log main #设置主访问日志存储
location / { #设置正则表达式匹配localhost/底下的目录按照此位置进行处理,
#下篇文章配置php会用到
root html; #设置网站根目录为html路径
index index.html index.htm; #设置没有确定的资源文件下,会自动访问index.hmtl例如
# 例如访问http://localhost会实际访问http://localhost/index.html
# 或者 http://localhost/index.htm
}
error_page 404 /404.html #自定义错误页面代码下访问的页面
error_page 500 502 503 504 /50x.html
location=/50.html { #访问路径为50x.html 无论是500, 502, 503, 504, 505这些页面
root html;
}
# location ~\.php$ {
# proxy_pass http://127.0.0.1;
# }
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
#location ~/\.ht {
# deny all;拒绝所有用户访问
# }
}
# 底下是配置https,https是现在还在比较流行的一种安全web服务器的基本要求
https {
}
}
【七、总结】
1、Nginx是现代互联网企业中不可缺少的一门技术,在微服务中也极为重要,尤其反向代理所带来的抗风险能力极为重要,热部署能力。
2、本文主要讲述了Nginx在windows和Linux系统下的搭建过程,希望对搭建的学习有帮助。
想学习更多Python网络爬虫与数据挖掘知识,可前往专业网站:http://pdcfighting.com/
批量导出当前开发环境的包信息
pip freeze > requirements.txt
下载requirements内的包及其依赖到【某文件夹】
pip download -r requirements.txt
.whl文件
只有本地对应版本的Python才能安装这些包,如果想要要搭建pip镜像站并兼容更多版本的Python怎么办呢?
这里有一个网站
https://www.lfd.uci.edu/~gohlke/pythonlibs/
里面有常用的532个包,每一个对应的有各种版本的whl文件,一共6000+
这就要爬虫了,我写了一个,代码就不贴了,已上传github
https://github.com/tjxj/whlFilesCrawler
本地安装pip2pi
pip install pip2pi
命令行切换到下载的 .whl文件夹,建立索引(自动生成了index.html)
dir2pi -S 【某文件夹】
然后文件夹内就出现了一个simple文件夹,这里的内容就和阿里、清华、豆瓣的源差别没那么大了。
准备好Linux or Windows 的 Nginx 安装程序
http://nginx.org/en/download.html
将【某文件夹】和Nginx 安装包一起copy到内网的服务器
Nginx 安装很简单,Terminal里执行nginx不报错就算大功告成。
找到nginx.conf文件,仅需修改如下几个内容,其他的都不需要动:
server{
listen 80;
server_name 你的IP地址
root 【某文件夹】的路径
}
重启nginx服务器
# Linux
sudo systemctl restart nginx
# Windows
nginx -s reload
浏览器打开 http://你的IP/simple
现在如果内网的服务器墙是通的,其他机器应该也能访问这个网址,pip 镜像站就搭建好了,so easy。
如果内网内的主机想要pip安装所需的包,还需要配置一下pip
在 Linux & macOS 中,配置需要写到 ~/.pip/pip.conf 文件中;Windows 中,配置文件位置为 %HOMEPATH%\pip\pip.ini,%HOMEPATH% 即你的用户文件夹,一般为“\Users<你的用户名>”,具体值可以使用 echo %HOMEPATH% 命令查看。
通常你需要手动创建对应的目录和文件,然后写入下面的内容:
[global]
index-url=http://你的IP/simple
[install]
trusted-host=你的IP
内网的主机安装Python的包及其依赖
pip install [所需的包名]
*请认真填写需求信息,我们会在24小时内与您取得联系。