django-release-debug-apache-mod-wsgi-原理解析

文章目录

1.django-release

由于django处理静态资源的效率偏低,顾在release模式不支持静态资源,这种情况需要在apache下配置静态资源路径。在Apache24\conf目录下httpd.conf文件中,添加映射,如下所示:

powershell 复制代码
#设置静态和媒体文件路径
Alias /media C:/ZLComputeServer/Apache24/htdocs/backend/media
<Directory C:/ZLComputeServer/Apache24/htdocs/backend/media> 
    AllowOverride None
    Options None 
    Require all granted 
</Directory>

2.mod_wsgi

mod_wsgi作为apache的扩展模块,参数配置在主程序配置文件httpd.conf中修改即可,三种模式,参数设置。

2.1.winnt模式

设置processes=1,但是multiprocess为false:

powershell 复制代码
WSGIDaemonProcess example threads=25
wsgi.multithread	True
wsgi.multiprocess	False

如果显式地指出processes为1那么:

powershell 复制代码
WSGIDaemonProcess example processes=1 threads=25
wsgi.multithread	True
wsgi.multiprocess	True

2.2.worker模式

powershell 复制代码
WSGIDaemonProcess example processes=2 threads=25
wsgi.multithread	True
wsgi.multiprocess	True

2.3.preforker模式

powershell 复制代码
WSGIDaemonProcess example processes=5 threads=1
wsgi.multithread	False
wsgi.multiprocess	True

后台模式由于是与apache进程分离了,内存独立,而且可以独立重启,不会影响apache的进程,如果你有多个项目(django),可以选择建立多个后台或者共同使用一个后台。比如在同一个VirtualHost里面,不同的path对应不同的django项目,可以同时使用一个Daemon:

powershell 复制代码
WSGIDaemonProcess default processes=1 threads=1 display-name=%{GROUP} 
WSGIProcessGroup default 
WSGIScriptAlias /project1 "/home/website/project1.wsgi" 
WSGIScriptAlias /project2 "/home/website/project2.wsgi"

也可以把不同的项目分开,分开使用不同的后台,这样开销变大,但就不会耦合在一起了。display-name是后台进程的名字,这样方便重启对应的进程,而不需要全部杀掉。

powershell 复制代码
WSGIDaemonProcess site1 processes=1 threads=1 display-name=%{GROUP} 
WSGIDaemonProcess site2 processes=1 threads=1 display-name=%{GROUP} 
<Location "/project1">
WSGIProcessGroup site1
</Location>
WSGIScriptAlias /project1 "/home/website/project1.wsgi"
 
<Location "/project1">
WSGIProcessGroup site2
</Location>
WSGIScriptAlias /project2 "/home/website/project2.wsgi"

2.4.小节

对于django 1.0以下的版本,由于官方认定不是线程安全的,所以建议使用多进程单线程模式。

processes=n threads=1

对于django 1.0以后,就可以放心的使用多进程多线程模式。

processes=2 threads=64

这样子性能会更好。

3.apache配置参数

介绍apache常用参数设置,如下内容:

1)Global Environment---全局环境配置,决定Apache服务器的全局参数

2)Main server configuration---主服务配置,相当于是Apache中的默认Web站点,如果我们的服务器中只有一个站点,那么就只需在这里配置就可以。

3)Virtual Hosts---虚拟主机,虚拟主机不能与Main Server主服务器共存,当启用了虚拟主机之后,Main Server就不能使用。

3.1.全局参数

在出现错误页的时候是否显示服务器操作系统的名称,ServerTokens Prod为不显示。

powershell 复制代码
ServerTokens OS

用于指定Apache的运行目录,服务启动之后自动将目录改变为当前目录,在后面使用到的所有相对路径都相对这个目录。

powershell 复制代码
ServerRoot "/etc/httpd"

记录httpd守护进程的pid号码文件,这是系统识别一个进程的方法,系统中httpd进程可以有多个,但这个PID对应的进程是其它进程的父进程。

powershell 复制代码
PidFile run/httpd.pid

服务器与客户端断开的时间,单位秒。

powershell 复制代码
Timeout 60

是否持续连接(因为每次连接都得三次握手,如果是访问量不大,建议打开此项,如果网站访问量比较大关闭此项比较好),修改为:KeepAlive On 表示允许程序性联机。

powershell 复制代码
KeepAlive Off

表示一个连接的最大请求数。

powershell 复制代码
MaxKeepAliveRequests 100

服务器在持久连接上等待后续请求的时间量。Apache将在关闭连接之前等待后续请求的秒数。将KeepAliveTimeout设置为高值可能会在负载很大的服务器上造成性能问题。超时越高,就会有越多的服务器进程被占用,等待与空闲客户机的连接。

powershell 复制代码
KeepAliveTimeout 15

系统默认的模块,表示为每个访问启动一个进程(即当有多个连接公用一个进程的时候,在同一时刻只能有一个获得服务)。StartServer开始服务时启动8个进程,最小空闲5个进程,最多空闲20个进程。MaxClients限制同一时刻客户端的最大连接请求数量超过的要进入等候队列。MaxRequestsPerChild每个进程生存期内允许服务的最大请求数量,0表示永不结束。

powershell 复制代码
<IfModule prefork.c> 
StartServers      8 
MinSpareServers    5 
MaxSpareServers  20 
ServerLimit      256 
MaxClients      256 
MaxRequestsPerChild  4000 
</IfModule>

Apache配置线程访问,即每对WEB服务访问启动一个线程,这样对内存占用率比较小。ServerLimit服务器允许配置进程数的上限。ThreadLimit每个子进程可能配置的线程上限。StartServers启动两个httpd进程。MaxClients同时最多能发起250个访问,超过的要进入队列等待,其大小有ServerLimit和ThreadsPerChild的乘积决定。ThreadsPerChild每个子进程生存期间常驻执行线程数,子线程建立之后将不再增加。MaxRequestsPerChild每个进程启动的最大线程数,如达到限制数时进程将结束,如置为0则子线程永不结束。

powershell 复制代码
<IfModule worker.c> 
StartServers        4 
MaxClients        300 
MinSpareThreads    25 
MaxSpareThreads    75 
ThreadsPerChild    25 
MaxRequestsPerChild  0 
</IfModule>

监听的端口,如有多块网卡,默认监听所有网卡。

powershell 复制代码
Listen 80

启动时加载的模块。

powershell 复制代码
LoadModule auth_basic_module modules/mod_auth_basic.so 
...... 
LoadModule version_module modules/mod_version.so

加载配置文件。

powershell 复制代码
Include conf.d/*.conf

启动服务后转换的身份,在启动服务时通常以root身份,然后转换身份,这样增加系统安全。

powershell 复制代码
User apache 
Group apache

3.2.主机参数

powershell 复制代码
ServerAdmin root@localhost #管理员的邮箱
ServerName www.example.com:80 #域名端口
UseCanonicalName Off #规范名称
DocumentRoot "/var/www/html" #网页文件存放的目录

根目录的权限设置

powershell 复制代码
<Directory /> 
   Options FollowSymLinks 
   AllowOverride None 
</Directory>

对/var/www/html目录的一个权限的设置,options中Indexes表示当网页不存在的时候允许索引显示目录中的文件,FollowSymLinks是否允许访问符号链接文件。有的选项有ExecCGI表是否使用CGI,如Options Includes ExecCGI FollowSymLinks表示允许服务器执行CGI及SSI,禁止列出目录。SymLinksOwnerMatch表示当符号链接的文件和目标文件为同一用户拥有时才允许访问。AllowOverrideNone表示不允许这个目录下的访问控制文件来改变这里的配置,这也意味着不用查看这个目录下的访问控制文件,修改为:AllowOverride All 表示允许.htaccess。Order对页面的访问控制顺序后面的一项是默认选项,如allow,deny则默认是deny,Allow from all表示允许所有的用户,通过和上一项结合可以控制对网站的访问控制。

powershell 复制代码
<Directory "/var/www/html"> 
   Options Indexes FollowSymLinks 
   AllowOverride None 
   Order allow,deny 
   Allow from all 
</Directory>

是否允许用户访问其它目录,默认是不允许。

powershell 复制代码
<IfModule mod_userdir.c> 
   UserDir disabled 
</IfModule>

如果允许访问用户其它目录中的网页文件,则取消以上注释,并对其中进行修改。

powershell 复制代码
<Directory /home/*/public_html> 
    AllowOverride FileInfo AuthConfig Limit 
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec 
    <Limit GET POST OPTIONS> 
        Order allow,deny 
        Allow from all 
    </Limit> 
    <LimitExcept GET POST OPTIONS> 
        Order deny,allow 
        Deny from all 
    </LimitExcept> 
</Directory>

指定所要访问的主页的默认名称,默认首页文件名为index.html。

powershell 复制代码
DirectoryIndex index.html index.html.var

定义每个目录下的访问控制文件名,缺省为.htaccess。

powershell 复制代码
AccessFileName .htaccess

控制不让web上的用户来查看.htpasswd和.htaccess这两个文件。

powershell 复制代码
<Files ~ "^\.ht"> 
   Order allow,deny 
   Deny from all 
   Satisfy All 
</Files>

定义一些不在DocumentRoot下的文件,而可以将其映射到网页根目录中,这也是访问其他目录的一种方法,但在声明的时候切记目录后面加"/"

powershell 复制代码
<Directory "/var/www/icons"> 
   Options Indexes MultiViews FollowSymLinks 
   AllowOverride None 
   Order allow,deny 
   Allow from all 
</Directory>

4.总结

apache模块众多,是一款稳定的开源web服务器,其可以配置多进程和多线程,拥有广泛的市场。

相关推荐
一点媛艺2 小时前
Kotlin函数由易到难
开发语言·python·kotlin
魔道不误砍柴功3 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
_.Switch3 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
测开小菜鸟4 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
萧鼎6 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸6 小时前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农6 小时前
Python 继承、多态、封装、抽象
开发语言·python
Wx-bishekaifayuan6 小时前
django电商易购系统-计算机设计毕业源码61059
java·spring boot·spring·spring cloud·django·sqlite·guava
Python大数据分析@6 小时前
python操作CSV和excel,如何来做?
开发语言·python·excel
黑叶白树6 小时前
简单的签到程序 python笔记
笔记·python