Difference between revisions of "Nginx (简体中文)"

From ArchWiki
Jump to: navigation, search
m (启动服务)
(FastCGI: 同步更新翻译)
Line 29: Line 29:
 
=== FastCGI ===
 
=== FastCGI ===
  
FastCGI,也称为FCGI,是一个外部服务与Web服务器的接口协议.FastCGI是早期的通用网关接口(CGI)的增强版本.
+
FastCGI,也称为FCGI,是一个外部服务与Web服务器的接口协议。FastCGI是早期的通用网关接口(CGI)的增强版本。
FastCGI致力于减少网页服务器与CGI程序之间的开销,从而使服务器可以同时处理更多的网页请求.
+
FastCGI致力于减少网页服务器与CGI程序之间的开销,从而使服务器可以同时处理更多的网页请求。
  
Nginx为了许多外部工具和服务而引入FastCGI技术,例如[[Perl]], [[PHP]] 和 [[Python]].所以,在FastCGI服务启动之前,它们都是不能使用的.
+
Nginx为了许多外部工具和服务而引入FastCGI技术,例如[[Perl]], [[PHP]] 和 [[Python]]。所以,在FastCGI服务启动之前,它们都是不能使用的。
  
 
==== PHP 集成 ====
 
==== PHP 集成 ====
Line 38: Line 38:
 
有不同的方式可以启动PHP FastCGI服务,我们将介绍'''php-fpm'''.这也是推荐的方案.
 
有不同的方式可以启动PHP FastCGI服务,我们将介绍'''php-fpm'''.这也是推荐的方案.
  
===== 第一步: 安装 PHP =====
+
===== 第一步: PHP 配置 =====
 
+
# pacman -S php
+
 
+
===== 第二步: PHP 配置 =====
+
 
在{{ic|/etc/php/php.ini}}中的{{ic|open_basedir}}中列出包含PHP文件的基本目录,如{{ic|/srv/http/}}和{{ic|/usr/share/webapps/}}:
 
在{{ic|/etc/php/php.ini}}中的{{ic|open_basedir}}中列出包含PHP文件的基本目录,如{{ic|/srv/http/}}和{{ic|/usr/share/webapps/}}:
 
  open_basedir = /usr/share/webapps/:/srv/http/:/home/:/tmp/:/usr/share/pear/
 
  open_basedir = /usr/share/webapps/:/srv/http/:/home/:/tmp/:/usr/share/pear/
  
===== 第三步: 安装 php-fpm =====
+
===== 第二步: 安装 php-fpm =====
  
 
* http://php-fpm.org
 
* http://php-fpm.org
  
安装{{pkg|php-fpm}}.配置文件在{{ic|/etc/php/php-fpm.conf}}.
+
安装{{pkg|php-fpm}}.配置文件在{{ic|/etc/php/php-fpm.conf}}。使用[[Systemd]] 启动并允许开机启动{{ic|php-fpm}}
  
# pacman -S php-fpm
+
===== 第三步: Nginx 配置 =====
# nano /etc/php/php-fpm.conf
+
  
====== 启动 php-fpm ======
+
在每一个提供PHP Web应用程序的{{ic|server}}块中都应该有一个{{ic|location}}块,类似于下面:
要启动php-fpm,运行:
+
# systemctl start php-fpm
+
要开机时启动php-fpm,运行:
+
# systemctl enable php-fpm
+
 
+
===== 第四步: Nginx 配置 =====
+
 
+
在每一个{{ic|server}}模块提供一个PHP Web应用程序,应该有一个{{ic|location}}模块,类似于下面:
+
 
   location ~ \.php$ {
 
   location ~ \.php$ {
 
       fastcgi_pass  unix:/run/php-fpm/php-fpm.sock;
 
       fastcgi_pass  unix:/run/php-fpm/php-fpm.sock;
Line 70: Line 57:
 
   }
 
   }
  
你可以创建一个{{ic|/etc/nginx/php.conf}},并保存该配置,然后在需要的时候包含此文件到{{ic|server}}模块:
+
你可以创建一个{{ic|/etc/nginx/php.conf}},并保存该配置,然后在需要的时候包含此文件到{{ic|server}}:
  
 
   server = {
 
   server = {
Line 78: Line 65:
 
   }
 
   }
  
如果你要处理 .html 和 .htm 文件在PHP,你应该类似于这样:
+
如果你要使用 PHP 处理 .html 和 .htm 文件,你应该类似于这样:
  
 
   location ~ \.(php|html|htm)$ {
 
   location ~ \.(php|html|htm)$ {
Line 86: Line 73:
 
   }
 
   }
  
非PHP文件处理,php-fpm应该明确地启用 {{ic|/etc/php/php-fpm.conf}}:
+
php-fpm 处理非PHP文件,应该明确地在 {{ic|/etc/php/php-fpm.conf}} 中启用:
 
  security.limit_extensions = .php .html .htm
 
  security.limit_extensions = .php .html .htm
  
Line 92: Line 79:
 
  # systemctl restart php-fpm
 
  # systemctl restart php-fpm
  
'''注意''' {{Ic|fastcgi_pass}} 参数,因为它必须是所选择的FastCGI服务器在其配置文件中定义的TCP或Unix套接字.'''默认'''的 Unix {{Ic|php-fpm}} 是:
+
'''注意'''这里的 {{Ic|fastcgi_pass}} 参数,因为它必须是所选择的FastCGI服务器在其配置文件中定义的TCP或Unix套接字.'''默认'''的 Unix {{Ic|php-fpm}} 是:
 
  fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
 
  fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
  
 
或者,你可以使用常用的TCP套接字,'''不是默认''':
 
或者,你可以使用常用的TCP套接字,'''不是默认''':
 
  fastcgi_pass 127.0.0.1:9000;
 
  fastcgi_pass 127.0.0.1:9000;
使用Unix域套接字要好的多.
 
  
最后,如果Nginx正在工作,运行以下命令:
+
使用Unix域套接字要更好一些。
 +
 
 +
通常都要包含 {{ic|fastcgi.conf}} 或者 {{ic|fastcgi_params}},因为它们包含了 Nginx 的 FastCGI 设置(使用后者是不推荐的)。它们是安装 Nginx 时附带的。
 +
 
 +
最后,如果Nginx正在工作,运行以下命令:
  
 
  # systemctl restart nginx
 
  # systemctl restart nginx
如果你想测试FastCGI是否可以使用,创建{{ic|/usr/share/nginx/html/index.php}},内容为:
+
如果你想测试 FastCGI 是否可以使用,创建{{ic|/usr/share/nginx/html/index.php}},内容为:
 
  <?php
 
  <?php
 
   phpinfo ();
 
   phpinfo ();
 
  ?>
 
  ?>
  
在你的浏览器中访问 http://127.0.0.1/index.php.
+
然后在你的浏览器中访问 http://127.0.0.1/index.php 查看。
  
 
===安装 phpMyAdmin ===
 
===安装 phpMyAdmin ===

Revision as of 16:24, 23 March 2013

Nginx (读作"engine X") 由Igor Sysoev(俄罗斯)于2005年编写,是一个免费、开源、高性能的HTTP服务器和反向代理,也可以作为一个IMAP/POP3代理服务器。根据 Netcraft 的 March 2013 Web Server Survey, 现在全世界13.53%的网站使用Nginx,而Apache占54.68%。Nginx因为稳定,丰富的功能集,配置简单,资源占用低而闻名世界。

安装

安装位于官方仓库nginx 软件包。

# pacman -S nginx

针对 Ruby on Rails 的安装参见 The Perfect Rails Setup.

启动服务

要启动Nginx服务,运行以下命令:

# systemctl start nginx

要Nginx服务开机时启动,运行以下命令:

# systemctl enabel nginx

http://127.0.0.1 的默认页面是:

/usr/share/nginx/html/index.html

配置

你可以修改在/etc/nginx/目录中的文件来更改配置./etc/nginx/nginx.conf是主配置文件.更多的细节可以参考Nginx 配置范例.

FastCGI

FastCGI,也称为FCGI,是一个外部服务与Web服务器的接口协议。FastCGI是早期的通用网关接口(CGI)的增强版本。 FastCGI致力于减少网页服务器与CGI程序之间的开销,从而使服务器可以同时处理更多的网页请求。

Nginx为了许多外部工具和服务而引入FastCGI技术,例如Perl, PHPPython。所以,在FastCGI服务启动之前,它们都是不能使用的。

PHP 集成

有不同的方式可以启动PHP FastCGI服务,我们将介绍php-fpm.这也是推荐的方案.

第一步: PHP 配置

/etc/php/php.ini中的open_basedir中列出包含PHP文件的基本目录,如/srv/http//usr/share/webapps/:

open_basedir = /usr/share/webapps/:/srv/http/:/home/:/tmp/:/usr/share/pear/
第二步: 安装 php-fpm

安装php-fpm.配置文件在/etc/php/php-fpm.conf。使用Systemd 启动并允许开机启动php-fpm

第三步: Nginx 配置

在每一个提供PHP Web应用程序的server块中都应该有一个location块,类似于下面:

 location ~ \.php$ {
      fastcgi_pass   unix:/run/php-fpm/php-fpm.sock;
      fastcgi_index  index.php;
      include        fastcgi.conf;
 }

你可以创建一个/etc/nginx/php.conf,并保存该配置,然后在需要的时候包含此文件到server块:

 server = {
     ...
     include  php.conf;
     ...
 }

如果你要使用 PHP 处理 .html 和 .htm 文件,你应该类似于这样:

 location ~ \.(php|html|htm)$ {
      fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
      fastcgi_index  index.php;
      include        fastcgi.conf;
 }

php-fpm 处理非PHP文件,应该明确地在 /etc/php/php-fpm.conf 中启用:

security.limit_extensions = .php .html .htm

如果你更改了配置文件,你需要重新启动php-fpm:

# systemctl restart php-fpm

注意这里的 fastcgi_pass 参数,因为它必须是所选择的FastCGI服务器在其配置文件中定义的TCP或Unix套接字.默认的 Unix php-fpm 是:

fastcgi_pass unix:/run/php-fpm/php-fpm.sock;

或者,你可以使用常用的TCP套接字,不是默认:

fastcgi_pass 127.0.0.1:9000;

使用Unix域套接字要更好一些。

通常都要包含 fastcgi.conf 或者 fastcgi_params,因为它们包含了 Nginx 的 FastCGI 设置(使用后者是不推荐的)。它们是安装 Nginx 时附带的。

最后,如果Nginx正在工作,运行以下命令:

# systemctl restart nginx

如果你想测试 FastCGI 是否可以使用,创建/usr/share/nginx/html/index.php,内容为:

<?php
  phpinfo ();
?>

然后在你的浏览器中访问 http://127.0.0.1/index.php 查看。

安装 phpMyAdmin

请看这篇 wiki 文章: PhpMyAdmin#NGINX_Configuration.

安全

  • 基于IP的访问限制

ngx_http_access_module

  • HTTP 认证

ngx_http_auth_basic_module

  • HTTPS 支持

ngx_http_ssl_module

疑难解答

访问本地的IP重定向到本地主机

解决方法在这: forum.

编辑 /etc/nginx/nginx.conf 找到 "server_name localhost" 没有被 # 注释掉的这行, 添加以下内容:

server_name_in_redirect off;

默认的行为是 nginx 重定向所有请求到在配置中 server_name 指定的值.

Error: 403 (Permission error)

这极有可能是一个权限错误. 你能肯定无论哪个在 Nginx 配置文件中配置的用户能读取到正确的文件吗?

如果文件位于 home 目录, (例如 /home/arch/public/webapp) 而且你能肯定运行 Nginx 的用户有正确的权限(为了测试这个可以暂时把所有文件 chmod 为 777), /home/arch 可能是 chmod 750, 简单地把它 chmod751, 这样就应该正常工作了.

Error: The page you are looking for is temporarily unavailable. Please try again later.

这是因为 FastCGI server 还没启动.

Error: No input file specified

大多是因为你没有在 SCRIPT_FILENAME 中包含脚本的全路径. 如果 nginx 上的配置 (fastcgi_param SCRIPT_FILENAME) 是正确的, 这种错误意味着 php 加载请求脚本失败. 通常这是一个简单的权限问题, 只需用 root 运行 php-cgi

# spawn-fcgi -a 127.0.0.1 -p 9000 -f /usr/bin/php-cgi

或者可以创建一些组和用户来启动 php-cgi. 例如:

# groupadd www
# useradd -g www www
# chmod +w /srv/www/nginx/html
# chown -R www:www /srv/www/nginx/html
# spawn-fcgi -a 127.0.0.1 -p 9000 -u www -g www -f /usr/bin/php-cgi

另外一个原因是, nginx.conf 的 "location ~ \.php$" 段有错误的 "root" 参数, 请保证在同一个服务器内 "root" 与 "location /" 指向同一个目录. 或者把 root 设为全局, 不在其它的位置部分定义.

记住 php 脚本路径默认是 /srv/www/nginx/html ,在 /etc/php/php.ini 文件内的变量 "open_basedir" 中定义, 请按需更改.

参考文献