bash函数对nginx文件进行完整性检查

我试图编写一个函数来执行文件的健全性检查,然后将它们移动到/etc/nginx/site-available 。 有位于我的主目录,并定期修改。

这些文件中所做的唯一修改是添加一个server_name

他们看着像是:

 server { listen 80; server_name domain.com; server_name www.domain.com; server_name mynsite1.com; server_name www.mysite1.com; server_name mysite2.com; server_name www.mysite2.com; server_name mysite3.com; server_name www.mysite3.com; server_name mysite4.com; server_name www.mysite4.com; access_log /var/log/nginx/domain.com-access.log main; error_log /var/log/nginx/domain.com-error.log warn; root /var/www/docroot; index index.php index.html index.htm; location / { try_files $uri /app_dev.php; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # location ~ /\.ht { deny all; } } 

这是我现在的function:

 verify_nginx() { if [ ! -s "$file1" ]; then echo "-> File \"$file1\" is empty or do not exist" | ts exit 1 elif [ ! -s "$file2" ]; then echo "-> File \"$file2\" is empty or do not exist" | ts exit 1 fi } 

我也想在函数中添加nginx -t -c /homedir/file1 ,但是出现以下错误:

 nginx: [emerg] "server" directive is not allowed here in /homedir/file:1 nginx: configuration file /homedir/file test failed 

事实上, nginx -c期望nginx.conf不包括我的文件在我的homedir。

我可以把我的文件放在nginx.conf包含的/etc/nginx/site-available ,但我想在将文件移动到正确的位置之前执行完整性检查。

我的问题:

  1. 有没有办法testing位于/etc/nginx/site-available使用nginx其他地方的configuration文件?
  2. 应该对nginx文件进行什么样的理智检查?

您正在尝试进行健全性检查的文件不是nginx配置文件,因此(可以理解) nginx -t表示它们是无效的。 -c标志期望“ 替代配置文件 ”,而不是单个server块。 server块住在一个http块中。

如果你想运行nginx -t你需要传递一个适当的配置文件,其中包括你正在尝试修改的文件。 正如Etan Reisner所建议的那样,你可以简单地写一个包含你的文件的虚拟nginx.conf ,类似这样的东西可能会起作用(我不是在安装了atm的nginx机器上,所以你可能需要添加更多的stub指令) :

 http { include path/to/files/*; } 

然后你可以运行nginx -t -c dummy_nginx.conf

这虽然有一个问题, 你仍然可以有任何数量的错误,只有当你真正的配置文件加载显示。

相反,您可以在加载之前通过更改来验证您的实际配置文件,只需在reload之前调用nginx -t ; 如果你想要的话,你可以把它包装在一个bash函数中:

 safe_reload() { nginx -t && service nginx reload # only runs if nginx -t succeeds } 

你也应该有一些备份或恢复机制。 这可能就像将旧的配置文件复制到并行*.bak文件一样简单,但更令人愉快的是使用Mercurial或Git等VCS。 你检查你的配置的每一次迭代成功,然后你可以很容易地恢复到以前已知的良好配置,如果出现任何问题。