针对 Azure 中 Web 应用的开源技术常见问题的解答

本文对 Azure App Service Web 应用功能开源技术常见问题 (FAQ) 进行了解答。

如果本文未解决 Azure 问题,请访问 Microsoft Q&A 和 Stack Overflow 上的 Azure 论坛。 可以在这些论坛上发布问题。 还可提交 Azure 支持请求。 若要提交支持请求,请在 Azure 支持页上提交。

如何启用 PHP 日志记录以便对 PHP 问题进行故障排除?

若要启用 PHP 日志记录:

  1. 登录到 Kudu 网站 (https://*yourwebsitename*.scm.chinacloudsites.cn)。
  2. 在顶部菜单中,选择“调试控制台”>“CMD”。
  3. 选择“Site”文件夹。
  4. 选择“wwwroot”文件夹。
  5. 选择 + 图标,然后选择“新建文件”。
  6. 将文件名称设置为“.user.ini”。
  7. 选择“.user.ini”旁边的铅笔图标。
  8. 在文件中,添加以下代码:log_errors=on
  9. 选择“保存” 。
  10. 选择“wp-config.php”旁边的铅笔图标。
  11. 将文本更改为以下代码:
    //Enable WP_DEBUG modedefine('WP_DEBUG', true);//Enable debug logging to /wp-content/debug.logdefine('WP_DEBUG_LOG', true);
    //Suppress errors and warnings to screendefine('WP_DEBUG_DISPLAY', false);//Suppress PHP errors to screenini_set('display_errors', 0);
    
  12. 在 Azure 门户中的 Web 应用菜单中,重启 Web 应用。

如何在应用服务中承载的应用中记录 Python 应用程序错误?

如果 Python 在启动应用程序时出现错误,则只会返回一个简单的错误页面(例如“由于发生内部服务器错误,无法显示该页。”)。

捕获 Python 应用程序错误:

  1. 在 Azure 门户中,在你的 Web 应用中选择“设置”
  2. 在“设置”选项卡上,选择“应用程序设置”
  3. 在“应用设置”下,输入以下键/值对:
    • 键:WSGI_LOG
    • 值:D:\home\site\wwwroot\logs.txt(输入所选文件名)

你现在应在 wwwroot 文件夹中的 logs.txt 文件中看到错误。

如何更改应用服务中承载的 Node.js 应用程序的版本?

若要更改 Node.js 应用程序的版本,可以使用以下选项之一:

  • 在 Azure 门户中,使用“应用设置”。

    1. 在 Azure 门户中,转到自己的 Web 应用。
    2. 在“设置”边栏选项卡上,选择“应用程序设置”。
    3. 在“应用设置”中,可将 WEBSITE_NODE_DEFAULT_VERSION 包括为键,并将所需的 Node.js 版本作为值。
    4. 转到 Kudu 控制台 (https://*yourwebsitename*.scm.chinacloudsites.cn)。
    5. 若要检查 Node.js 版本,请输入以下命令:
      node -v
      
  • 修改 iisnode.yml 文件。 更改 iisnode.yml 文件中的 Node.js 版本将仅设置该 iisnode 使用的运行时环境。 你的及其他 Kudu cmd 仍使用在 Azure 门户中的“应用设置”中设置的 Node.js 版本。

    若要手动设置 iisnode.yml,请在应用根文件夹中创建一个 iisnode.yml 文件。 在该文件中,包括以下行:

    nodeProcessCommandLine: "D:\Program Files (x86)\nodejs\5.9.1\node.exe"
    
  • 在源控件部署期间通过使用 package.json 设置该 iisnode.yml 文件。 Azure 源控件部署过程包含以下步骤:

    1. 将内容移动到 Azure web 应用。
    2. 如果 Web 应用根文件夹中不存在默认部署脚本,请创建一个(deploy.cmd、.deployment 文件)。
    3. 如果提及 package.json 文件 > 引擎 "engines": {"node": "5.9.1","npm": "3.7.3"} 中的 Node.js 版本,请运行在其中创建 iisnode.yml 文件的部署脚本
    4. 该 iisnode.yml 文件具有以下代码行:
      nodeProcessCommandLine: "D:\Program Files (x86)\nodejs\5.9.1\node.exe"
      

启用日志后,重现错误,然后检查日志以了解是否耗尽连接:

[09-Oct-2015 00:03:13 UTC] PHP Warning: mysqli_real_connect(): (HY000/1226): User 'abcdefghijk79' has exceeded the 'max_user_connections' resource (current value: 4) in D:\home\site\wwwroot\wp-includes\wp-db.php on line 1454

如果在 debug.log 或 php_errors.log 文件中看到此错误,则表示应用连接数已超出可用数目。 如果是承载于 ClearDB 上,请验证服务计划中可用的连接数。

如何调试应用服务中承载的 Node.js 应用?

  1. 转到 Kudu 控制台 (https://*yourwebsitename*.scm.chinacloudsites.cn/DebugConsole)。
  2. 转到应用程序日志文件夹 (D:\home\LogFiles\Application)。
  3. 在 logging_errors.txt 文件中,检查内容。

Tomcat 日志文件位于何处?

对于 Azure 市场和自定义部署:

  • 文件夹位置:D:\home\site\wwwroot\bin\apache-tomcat-8.0.33\logs
  • 感兴趣的文件:
    • catalina.yyyy-mm-dd.log
    • host-manager.yyyy-mm-dd.log
    • localhost.yyyy-mm-dd.log
    • manager.yyyy-mm-dd.log
    • site_access_log.yyyy-mm-dd.log

对于门户“应用设置”部署:

  • 文件夹位置:D:\home\LogFiles
  • 感兴趣的文件:
    • catalina.yyyy-mm-dd.log
    • host-manager.yyyy-mm-dd.log
    • localhost.yyyy-mm-dd.log
    • manager.yyyy-mm-dd.log
    • site_access_log.yyyy-mm-dd.log

如何解决 JDBC 驱动程序连接错误的问题?

可能会在 Tomcat 日志中看到以下消息:

The web application[ROOT] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak,the JDBC Driver has been forcibly unregistered

若要解决该错误:

  1. 从 app/lib 文件夹中删除 sqljdbc*.jar 文件。

  2. 如果使用自定义 Tomcat 或 Azure 市场 Tomcat Web 服务器,请将此 .jar 文件复制到 Tomcat lib 文件夹中。

  3. 如果从 Azure 门户启用 Java(选择“Java 1.8”>“Tomcat 服务器”),请在并行于应用的文件夹中复制 sqljdbc.* jar 文件。 然后,将以下 classpath 设置添加到 web.config 文件中:

    <httpPlatform>
    <environmentVariables>
    <environmentVariablename ="JAVA_OPTS" value=" -Djava.net.preferIPv4Stack=true
    -Xms128M -classpath %CLASSPATH%;[Path to the sqljdbc*.jarfile]" />
    </environmentVariables>
    </httpPlatform>
    

为什么当我尝试复制实时日志文件时看到错误?

如果尝试复制 Java 应用(例如 Tomcat)的实时日志文件,可能会看到此 FTP 错误:

Error transferring file [filename] Copying files from remote side failed.

The process cannot access the file because it is being used by another process.

错误消息可能会有所不同,具体取决于 FTP 客户端。

所有 Java 应用都具有此锁定问题。 仅 Kudu 支持在应用运行时下载此文件。

停止应用可允许对这些文件的 FTP 访问。

另一解决方法是编写按计划运行并将这些文件复制到另一个目录的 WebJob。 对于示例项目,请参阅 CopyLogsJob 项目。

在哪里可以找到 Jetty 的日志文件?

对于市场和自定义部署,日志文件位于 D:\home\site\wwwroot\bin\jetty-distribution-9.1.2.v20140210\logs 文件夹中。 请注意,文件夹位置取决于所使用的 Jetty 版本。 例如,以下提供的路径用于 Jetty 9.1.2。 查找 jetty_YYYY_MM_DD.stderrout.log。

对于门户应用设置部署,日志文件位于 D:\home\LogFiles。 查找 jetty_YYYY_MM_DD.stderrout.log

是否可从 Azure web 应用发送电子邮件?

应用服务没有内置电子邮件功能。 有关从应用发送电子邮件的一些不错的替代方案,请参阅此 Stack Overflow 讨论

我在尝试使用 PHPMyAdmin 时看到消息“拒绝访问。” 如何解决此问题?

如果 MySQL 应用内功能尚未在此应用服务实例中运行,可能会遇到此问题。 若要解决此问题,请尝试访问自己的网站。 这将启动所需的进程,包括 MySQL 应用内进程。 若要验证 MySQL 应用内功能正在运行,确保进程资源管理器 的进程中列出了 mysqld.exe。

确保 MySQL 应用内功能运行后,尝试使用 PHPMyAdmin。

在尝试使用 PHPMyadmin 导入或导出 MySQL 应用内数据库时,收到了 HTTP 403 错误。 如何解决此问题?

如果使用的是较旧版本的 Chrome,则可能遇到一个已知的 bug。 要解决此问题,请升级到较新版本的 Chrome。 另请尝试使用不会出现该问题的不同浏览器,如 Internet Explorer 或 Microsoft Edge。