给定路径X或apache vhosts配置文件的副本,如何使用PHP解析该文件?
例如,给定一个包含字符串的变量,该字符串具有Apache vhosts配置的内容,我如何获得托管域/子域别名的列表?
例如,给定:
#
# Use name-based virtual hosting.
#
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin contact@tomjn.com
DocumentRoot "/srv/www/localhost/
ServerName 127.0.0.1
ServerAlias localhost
CustomLog "/srv/www/logs/localhost-access_log.log" combined
ErrorLog "/srv/www/logs/localhost-error_log.log"
<Directory "/srv/www/localhost">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerAdmin contact@tomjn.com
DocumentRoot "/srv/www/2.7.localhost.com/
ServerName 2.7.localhost.com
ServerAlias 2.7.localhost.com
CustomLog "/srv/www/logs/2.7.localhost.com-access_log.log" combined
ErrorLog "/srv/www/logs/2.7.localhost.com-error_log.log"
<Directory "/srv/www/2.7.localhost.com">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
我将如何获得此输出:
这是用Python写的非常接近的东西: …
我使用Plesk,我有三个具有不同ngnix配置的域和子域。目前,每次更新后,我都会在/etc/ngnix/plesk.conf.d/vhost/manual中更改ngnix配置,因为我的更改已被httpdmng覆盖。
现在我的问题;我可以在/ usr / local / psa / admin / conf / templates / folder中为每个域创建一个单独的模板吗?
示例:
mydomain1使用以下模板/usr/local/psa/admin/conf/templates/mydomain1/nginxDomainVirtualHost.php
mydomain2 使用以下模板 /usr/local/psa/admin/conf/templates/mydomain2/nginxDomainVirtualHost.php
我已经为我的本地机器设置了一个vhosts文件,其中我使用了一个带有一堆子域的组成域(cascade.mtn)(rainier.cascade.mtn,hood.cascade.mtn等).在其他所有浏览器中,我都可以轻松点击这些域名,但在Chrome中,它只需要我进行Google搜索.
反正是否迫使Chrome识别cascade.mtn域?
我创建了一个Amazon EC2实例并在其上安装了Apache和PHP:
$ sudo yum install apache2
$ sudo yum install php
$ ls -al /var/www/services/
lrwxrwxrwx 1 root root 42 Jun 22 21:13 production -> /home/ec2-user/services
Run Code Online (Sandbox Code Playgroud)
我创建了新的VirtualHost:
<VirtualHost *:80>
ServerName ec2-***.compute-1.amazonaws.com
DocumentRoot "/var/www/services/production/public"
<Directory "/var/www/services/production/public">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
现在,当我在浏览器中运行我的请求时,它说403 Forbidden并且日志显示符号链接问题:
[Wed Jun 22 21:14:19 2011] [error] [client ***] Symbolic link not allowed or link target not accessible: /var/www/services/production
[Wed Jun 22 21:14:20 2011] [error] [client ***] Symbolic …Run Code Online (Sandbox Code Playgroud) NameVirtualHost *:80
<VirtualHost *:80>
ServerName tmp
DocumentRoot "//192.168.1.25/www/"
<Directory />
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
此配置无法正常工作,服务无法从Services.msc启动,但如果我尝试在cmd.exe中运行httpd.exe,那么它成功并且显然不是很好的方法.
我尝试了Alias但仍然无法正常工作,服务运行但是当我访问它时 403 Access Error.
我尝试将Map Network Drive映射到Z:但服务无法从Services.msc运行
对于从虚拟主机的网络目录或网络驱动器运行Apache DocumentRoot,任何人都有良好的解决方案.
是否express.vhost能够支持通配符赶上一个特定域的所有流量?我正在寻找每个子域名(www.example.com,xyz.example.com)和TLD本身(example.com).
我今天正在编写一些代码并发送了一个代码Redirect::route().它没有像往常一样重定向到base_url/route,而是像这样重复了base_url:
http://myurl.dev/http://myurl.dev/myroute
我想我做错了,所以我回去试图找出问题.我最终用一个新的vhost启动了一个新项目,并在app/routes.php中放了一小段代码:
Route::get(
'test1',
[
'as' => 'test1',
function () {
return Redirect::route('test2');
}
]
);
Route::get(
'test2',
[
'as' => 'test2',
function () {
return 'test2hello';
}
]
);
Run Code Online (Sandbox Code Playgroud)
当我在浏览器中打开http://myurl.dev/test1时,而不是只显示"test2hello",它抛出了http找不到错误,因为http://myurl.dev/http://myurl.dev/test2不是找到.这只会发生Redirect::route(),它按预期工作Redirect::to().它也只发生在虚拟主机上; Redirect::route()如果我去localhost/myurl/public/test1,按预期工作.有任何想法吗?
更新:
我被问到我的vhost设置.我在Mac OSX 10.8.5上使用内置Apache.我已经取消注释了/etc/apache2/httpd.conf中的httpd-vhosts.conf include行.我在/etc/apache2/extra/httpd-vhosts.conf中添加了几个vhost ,这里有一个:
<VirtualHost *:80>
DocumentRoot "/Library/WebServer/Documents/example_blog/public"
ServerName example_blog.local
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
和/ etc/hosts中的相应行:
127.0.0.1 example_blog.local
Run Code Online (Sandbox Code Playgroud)
并重新启动Apache.该文件夹已命名example_blog.local.
我正在尝试从不同的server.js文件(不同的目录、配置等)在同一端口和服务器上运行 2 个 NodeJS 实例。我的服务器提供商给了我一个vhost针对不同域运行的信息,这就是问题所在。如何在 NodeJS Express 应用程序中处理它?我试过vhost从https://github.com/expressjs/vhost像这样使用:
const app = express();
const vhost = require('vhost');
app.use(vhost('example1.org', app));
// Start up the Node server
app.listen(4100, () => {
console.log(`Node server listening on 4100`);
});
Run Code Online (Sandbox Code Playgroud)
对于这样的第二个应用程序:
const app = express();
const vhost = require('vhost');
app.use(vhost('example2.org', app));
// Start up the Node server
app.listen(4100, () => {
console.log(`Node server listening on 4100`);
});
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行第二个实例时,我得到了EADDRINUSE ::: 4100,所以 vhost 在这里不起作用。
你知道如何解决吗?
例如,文档根目录virtualHost是/var/www,服务器名称是aaa.com.但是,apache会告诉我forbidden是否使用localhost和访问服务器aaa.com.如果我将Directory选项更改http.conf为/var/www,则apache将运行良好.我不知道为什么?
我想Directory在每一个中设置选项httpd-vhosts.conf,而不是在httpd.conf我如何做到这一点?
这是我的http.conf:

这是我的httpd-vhosts.conf:

我有一个PHP应用程序,由多个域使用.为了避免维护多个vhost,我只设置了一个"默认"Apache vhost来将任何传入请求引导到服务器到应用程序目录.
我想要做的是根据命中服务器的主机名动态设置Apache访问和错误日志路径.
例如,我想将日志路径设置为:
/var/log/application_name/example.com/error.log
/var/log/application_name/example.com/access.log
Run Code Online (Sandbox Code Playgroud)
当提出请求时example.com.
有可行的方法吗?我已经看过使用任何Apache环境变量,但是因为这些是在捕获请求时设置的,所以我认为这些变量不能用于ErrorLog或CustomLog指令.是否只需要在应用程序级别(即在PHP中)手动设置日志目录?
谢谢
我想知道是否可以对 nginx ssl 证书(或配置的任何其他部分)执行 if 语句
if ( -f /etc/letsencrypt/live/{domain}/cert.pem ) {
ssl_certificate /etc/letsencrypt/live/{domain}/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/{domain}/privkey.pem;
}
Run Code Online (Sandbox Code Playgroud)
这给出了以下错误:
nginx: [emerg] "ssl_certificate" directive is not allowed here in /etc/nginx/sites-enabled/app.phase.be.conf:7
Run Code Online (Sandbox Code Playgroud)
我查看了文档和谷歌,得出的结论是这是不可能的。它仅用于重写。
在 Letsencrypt 颁发证书之前,是否有另一种方法可以完全忽略 ssl 证书或将其替换为自签名证书。这是一个自动化的过程,Nginx 可以随时重新加载,如果它被另一个进程触发(例如修改的服务器块)
编辑:
感谢@Chris 指出正确的方向!
我最终做的看起来像这样,但这是精简和简化的。
config = Config().read()
logging.basicConfig(filename=config['settings']['log_file'],
filemode='a',
format='%(asctime)s [ %(levelname)s ] - %(message)s',
datefmt='%m/%d/%Y %H:%M:%S',
level=config['settings']['log_level'])
class NginxHandler(PatternMatchingEventHandler):
patterns = ["*.conf", "*.cnf"]
def process(self, event):
logging.info('PROXY-LISTENER: Vhost configuration has changed reloading Nginx')
time.sleep(1)
subprocess.call(['nginx', '-s', 'reload'])
def on_modified(self, event):
self.process(event)
# def on_created(self, …Run Code Online (Sandbox Code Playgroud) 我想在单独的虚拟主机/域上运行/托管项目 Git 存储库的特定分支,以进行测试/预览。我正在考虑在 Git 推送后将分支部署到“预览”或“测试”服务器以在浏览器中进行手动测试的过程。
例如,最好将名为“feature/my-new-feature”的分支部署到特定服务器,并通过“my-new feature.project.com”等 URL 访问该项目。
我面临的问题(理论上,首先)主要是关于数据库连接/配置、端口等方面的挑战。例如,如果在单个服务器上的不同子域上运行多个分支,它们将需要共享一个 MySQL安装 - 但实际上每个分支都需要它自己的、单独的 MySQL 实例,因为所有分支的数据库配置不会更改,这意味着它们连接到同一主机并使用相同的数据库名称、用户等。
一种方法可能是为它自己的子域上的每个分支运行一个 VM,将端口直接映射到 VM(至少我认为这是可能的),但是对于许多具有许多分支的项目,这意味着我需要很多硬件处理此事的权力。(可能还有很多钱。)
然后我听说了 docker 和/或 Linux 容器,并认为这可能会奏效,但我不完全确定它如何以及是否有效。
我想知道在没有干扰服务和相关冲突问题的情况下并行运行多个版本的项目的既定方法是什么。
是否可以将 docker 用于这样的设置,或者这是我前进的完全错误的方向?
非常感谢您的回答。