整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

nginx搭建基于python的web环境的实现步骤

nginx搭建基于python的web环境的实现步骤

搭建开始前,我们先来梳理下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、首先先下载一个版本。

  1. 1)Nginx社区版2)Nginx企业版 两者没有太大区别,都支持主要几大功能。3)淘宝版本的Nginx对IO进行了优化,至今淘宝在使用的Tengine。

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,网站的入口):

  • index.html 默认网页
  • 50x.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下)搭建】

1、Linux环境下使用最高权限执行(不考虑用户权限)。

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文件夹,这里的内容就和阿里、清华、豆瓣的源差别没那么大了。

nginx发布镜像源

准备好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 [所需的包名]