我是 Linux 新手。
我正在管理一个(Linux - Apache - mod_wsgi - Django)服务器,其中有多个 Python 安装。该站点目前正在运行,但我想找出使用哪个 Python 可执行文件来运行它。我知道这不是默认的。
另外,mod_wsgi 如何知道要使用哪个 Python 安装?该.wsgi脚本没有shebang行。
我已经使用 Debian 一年了,主要是作为我公司内部服务器的发行版。现在我正在制作一个公共电子商务网站,我计划为此目的在数据中心使用专用的 Debian 服务器。我将接受信用卡付款并将它们直接传输到银行网关,而不存储任何 CC 信息。
我将使用 Django 1.1.1、mod_wsgi、Apache2 来运行 django 和 nginx 来提供静态媒体服务。
我有一个处理“/admin/”和“/myapp/”的 Django 应用程序。所有其他请求都应该由 Apache 处理。
我试过使用 LocationMatch 但后来我不得不写一个负正则表达式。我已经尝试过带有 /admin/ 前缀的 WSGIScriptAlias,但是 wsgi_handler 收到了 /admin/ 部分被切断的请求。
有没有更干净的方法让 mod_wsgi 只处理某些请求?
我正在使用 Ubuntu 服务器,当我运行时,ps aux我得到以下进程表http://pastebin.com/NJsASBek,因为我们可以看到 apache 进程显示如下:
www-data 26487 0.0 0.9 245476 14920 ? SL 17:32 0:00 /usr/sbin/apache2 -k 开始
其中 2687 是 PID。我怎么知道我启用的网站属于那个过程?
这就是我的 apache 站点的定义方式http://pastebin.com/mcew79sH当然,如果需要,我愿意编辑我的 apache 站点。
我正在努力设置Trac使用wsgi,并且在使 mod_wsgi 工作时遇到了麻烦。我下载并安装了 mod_sgi。
[框]# apachectl configtest
httpd:/etc/httpd/conf/httpd.conf 的第 214 行语法错误:无法在文件 /etc/httpd/modules/mod_wsgi.so 中找到 API 模块结构“mod_wsgi”:/etc/httpd/modules/mod_wsgi .so:未定义符号:mod_wsgi
httpd.conf 的第 214 行:
LoadModule mod_wsgi modules/mod_wsgi.so
Run Code Online (Sandbox Code Playgroud)
这是在文件系统上找到的 mod_wsgi.so:
[box]# locate mod_wsgi.so
/usr/lib64/httpd/modules/mod_wsgi.so
Run Code Online (Sandbox Code Playgroud)
我可能会忽略什么?
当我运行时,ps aux我得到以下进程表http://pastebin.com/NJsASBek,它显示了每个子进程使用了多少内存。我们可以看到apache进程如下所示:
www-data 26487 0.0 0.9 245476 14920 ? Sl 17:32 0:00 /usr/sbin/apache2 -k start
Run Code Online (Sandbox Code Playgroud)
其中 2687 是 PID,但我不知道它是否属于 foo1.domain.com 或 foo2.domain.com 或 fooX.domain.com 等...
我怎么知道那些 PID 显示的站点(例如 ServerName)是哪个?
这就是我的 apache 站点的定义方式http://pastebin.com/mcew79sH当然,如果需要,我愿意编辑我的 apache 站点。
我正在调试MoinMoinCentOS 上抛出权限错误的问题,但我无法追踪有问题的文件/目录在哪里。
我strace -vp <pid>在 apache pid 上运行;当我遇到问题时,我看到了这个:
epoll_wait(10, {{EPOLLIN, {u32=3487534344, u64=140367313734920}}}, 2, 10000) = 1
accept4(6, {sa_family=AF_INET6, sin6_port=htons(52621), inet_pton
(AF_INET6, "::ffff:105.193.30.91", &sin6_addr), sin6_flowinfo=0,
sin6_scope_id=0}, [28], SOCK_CLOEXEC) = 11
## Later on...
read(7, 0x7fffa658ad7f, 1) = -1 EAGAIN (Resource temporarily
unavailable)
Run Code Online (Sandbox Code Playgroud)
但是,由于 apache 已经在运行,因此我open()在称为7;的文件中没有看到对应的文件。因此我看到权限问题,但我仍然不知道哪个文件有问题。
我知道当我重生 apache 时我可以尝试捕获所有打开的文件,但我希望有一种方法可以将文件映射7到真实的文件名......有没有办法做到这一点?
编辑 1:
使用@lain 的指导,我跑了lsof | grep 266474069,但结果不清楚......
[root@lnxlmf moin]# ls -la /proc/9707/fd/7
lr-x------. 1 root root 64 Aug 28 …Run Code Online (Sandbox Code Playgroud) 我偶然发现了这个看似最相关的部署选项,因为指南似乎要么使用 python2 引用 mod_wsgi,要么在预期路径不同的基于 deb 的系统上进行部署。
所以我按照以下步骤操作:
#repos for python3.6, wsgi for python3.6
yum install epel-release centos-release-scl
#base packages
yum install python36 python36-devel httpd httpd-devel rh-python36-mod_wsgi
#python3.6 venv
cd /var/www;
python36 -m venv django-venv
source django-venv/bin/activate
pip3 install django
#apache config to support wsgi
edit /etc/httpd/conf/httpd.conf to include
LoadModule wsgi_module modules/mod_wsgi.so
Run Code Online (Sandbox Code Playgroud)
Apache 配置服务位于 /var/www/mysite 的 django 内容
<VirtualHost *:80>
ServerAdmin foo@mysite.com
ServerName mysite.com
ServerAlias www.mysite.com
WSGIDaemonProcess mysite python-home=/var/www/django-venv/ python-path=/var/www/django-venv/lib/python3.6/site-packages
WSGIProcessGroup mysite
WSGIScriptAlias / /var/www/mysite/mysite/wsgi.py
Alias /static /var/www/mysite/static
<Directory /var/www/mysite/mysite/static>
Require …Run Code Online (Sandbox Code Playgroud) 我有一个虚拟主机太多的服务器,大约 500 个虚拟主机,其中一半使用 SSL。
所有这些主机都使用 mod_wsgi 为 Django 应用程序提供服务。
我注意到在一定数量的虚拟主机之后,我的所有服务器都停止工作并且所有站点都崩溃了,我可以使用以下行来处理降低每个虚拟主机的线程数:
WSGIDaemonProcess my.domain python-home=/var/www/env python-path=/var/www/my_app threads=1
Run Code Online (Sandbox Code Playgroud)
apache 在达到大约 1300 个线程时崩溃(当我检查 htop 时)。apache的错误日志显示没有找到Django模块,但这不是真正的错误,因为一切正常,只是在vhosts数量过高时发生。所以我认为我在 Linux 中的进程或线程达到了某种限制。我使用的是 Ubuntu 18.04、Apache 2.4,并且有足够的 RAM 和 CPU,服务器有 4 GB 的 RAM 并且只使用了 2 GB,平均 CPU 为 10% 到 20%。
我还检查了我的线程最大限制:
cat /proc/sys/kernel/threads-max
30893
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能在不创建另一台服务器的情况下增加我的 apache 中虚拟主机的容量。
我的服务器默认运行 Python 2.4,我曾经make altinstall为我的 Django webapp 安装一个备用的 Python 2.6。
但是, mod_wsgi 似乎默认使用/usr/bin/python(2.4) 而不是/usr/local/bin/python2.6.
有没有一种简单的方法可以强制 mod_wsgi 使用 Python 2.6?