欢迎光临
我们一直在努力

Nginx配置信息说明及虚拟主机的创建使用方法

本文只介绍Nginx的配置文件信息,以及如何在虚拟站点中使用PHP。

这里假定Nginx被安装在 /usr/local/nginx 目录下,PHP安装在 /usr/local/php 目录下。

一、Nginx主配置文件及解析

Nginx配置文件主要分为4部分:main(全局设置)部分设置的指令将影响其他所有设置;server(主机设置)部分的指令主要用于指定主机和端口;upstream(负载均衡服务器设置)部分指令主要用于负载均衡,设置一系列的后端服务器;location(URL匹配特定位置的设置)部分用于匹配网页位置。四者之间的关系:server继承main,location继承server,upstream既不会继承其他设置,也不会被继承。


二、Nginx设置虚拟主机及对PHP的支持

在conf目录下面创建vhosts目录,并创建站点的配置文件,这里以piaoyun.cc.conf为例。

[root@localhost ~]# cd /usr/local/nginx/
[root@localhost nginx]# mkdir -p conf/vhosts
[root@localhost nginx]# vim conf/vhosts/piaoyun.cc.conf

创建的piaoyun.cc.conf配置文件如下:

     # 虚拟主机以server进行定义
     server {
         # 监听的端口,多个端口之间使用空格进行间隔
         listen       80;
         # 用来定义访问的ip地址或者域名,多个域名之间使用空格分开
         server_name  examples.com www.examples.com;
         # 用于指定站点网页的默认编码格式
         charset utf-8;

         # 用来指定此站点的访问日志存放路径,后面的main用于设定日志的格式
         #access_log  logs/examples.com.access.log  main;

         # 用于指定站点的网页根目录,可以是相对路径(相对于nginx安装目录),也可以是绝对路径
         #root /www/examples.com
         # 用于指定访问的默认首页地址
         #index index.html index.php

         # 用来指定站点默认访问的设置,里面的root和index用法和效果与上面是一样的
         # 两种方式使用任何一种都是可以的,这里采用 location / {} 的方式
         location / {
             root   /www/examples.com;
             index  index.html index.php;
         }

         # 使用error_page指令设置各种错误信息的返回页面
         # 错误信息的返回页面大小如果低于512k则会被ie浏览器替换为ie默认的错误页面
         #error_page  404              /404.html;
         error_page   500 502 503 504 /50x.html;
         location = /50x.html {
             root   html;
         }

         # nginx的location指令用于设置url地址匹配,支持正则表达式匹配,也支持条件判断匹配。
         # 可以通过location指令实现nginx对动态、静态网页的过滤处理。
         # 下面是对所有的图片设置缓存30天
         location ~ .*\.(gif|jpg|jpeg|png|bmp|swf){
             expires 30d;
         }
         # 对js和css文件缓存1小时
         location ~ .*\.(js|css) {
             expires 1h;
         }

         # 下面是列出了两种解析php的方式:
         # 第一种是简单的将所有以php结尾的请求都交给本机的8080端口进行处理
         #location ~ \.php{
         #    proxy_pass   http://127.0.0.1:8080;
         #}
         # 第二种是将php的请求交给FastCGI进程监听的ip地址及端口,这里转发给PHP_FPM
         location ~ \.php {
             # 设定用于解析php的根目录,通常为网站根目录
             root          /www/examples.com;
             # 地址和端口与php_fpm中设置的一致
             fastcgi_pass   127.0.0.1:9000;
             # 默认首页
             fastcgi_index  index.php;
             # 指定防止php动态程序的主目录,也就是fastcgi_script_name前面指定的路径,建议与网站根目录一致或直接使用document_root
             fastcgi_param  SCRIPT_FILENAME   document_rootfastcgi_script_name;
             include        fastcgi_params;
         }

         # 防止直接访问 .htaccess 文件,建议开启
         location ~ /\.ht {
             deny  all;
         }
     }

最后创建网站的根目录并设置目录权限:

[root@localhost ~]# mkdir -p /www/examples.com
# 写入权限
[root@localhost ~]# chmod +w /www/examples.com
[root@localhost ~]# chown -R www:www /www/examples.com
# 创建一个测试的php文件
[root@localhost ~]# echo "<? phpinfo(); ?>" >> /www/examples.com/phpinfo.php

这个时候启动php-fpm和nginx之后,应该可以直接访问http://www.piaoyun.cc/phpinfo.php了。

三、优化php-fpm和fastcgi_params配置信息

PHP-FPM的配置文件在/usr/local/php/etc/php-fpm.conf中,下面对常用的配置项进行说明:

<!-- 用来配置FastCGI进程监听的IP地址以及端口,默认为127.0.0.1:9000 -->
 <value name="listen_address">127.0.0.1:9000</value>
 <!-- 用来配置是否显示PHP错误信息,默认是0不显示,设置为1显示信息 -->
 <value name="display_errors">0</value>
 <!-- 用来设置运行FastCGI进程的用户和用户组。这里指定的用户和用户组必须和Nginx配置文件中指定的一致。 -->
 <value name="user">www</value><value name="group">www</value>
 <!-- 用于设置FastCGI的进程数。根据官方建议,小于2G内存的服务器可以只开启64个进程,4GB以上内存服务器可以开始256个进程。 -->
 <value name="max_children">128</value>
 <!-- 执行脚本的时间,默认为0表示无限执行下去。 -->
 <value name="request_terminate_timeout">0s</value>
 <!-- 设置PHP-FPM对打开文件描述符的限制,默认为1024。该值必须和Linux内核打开文件数关联起来,
      如将该值设置为65535就必须在Linux命令行中执行 ulimit -HSn 65535。 -->
 <value name="rlimit_files">65535</value>
 <!-- 设定每个children最多处理多少个请求后便会自动关闭,默认设置为500。 -->
 <value name="max_requests">1024</value>
 <!-- 设置允许访问FastCGI进程解析器的IP地址,如果不在这里指定IP地址,将无法接受Nginx转发过来的PHP解析请求。 -->
 <value name="allowed_clients">127.0.0.1</value>

fastcgi_param配置文件在 /usr/local/nginx/conf/fastcgi_params中,将其中的fastcgi_param SERVER_SOFTWARE nginx/nginx_version;中nginx_version去掉,隐藏nginx的版本。

#fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
fastcgi_param  SERVER_SOFTWARE    nginx;

四、常见错误及解决方法

首先说明一下,如果nginx启动之后,无法访问网站或者访问有错误,这个时候应该第一时间查看nginx(默认在nginx安装目录的logs文件夹下)或php-fpm(默认在php根目录的logs/php-fpm.log文件中)的日志文件,里面有详细的错误信息。

1. 当访问php文件的时候页面出现“No input file specified”提示,而静态文件则正常。
这个是因为在站点设置中对php扩展的解析里面,fastcgi_param SCRIPT_FILENAME 后面的路径出现错误,使得php-fpm无法找到php文件,解决的方法是将$fastcgi_script_name前面的路径设置成网站根目录的绝对路径即可,注意路径最后没有斜杠/,即:

fastcgi_param SCRIPT_FILENAME /www/piaoyun.cc$fastcgi_script_name;

看到有的网站上面还提到需要将php.ini文件中的cgi.fix_pathinfo项设置为1,但是我没有进行设置也是好的,估计是nginx的版本不同。

2. [ERROR] fpm_unix_conf_wp(), line 124: please specify user and group other than root, pool 'default'
上面的错误是在php-fpm.log日志文件中出现的,原因是没有设置php-fpm的用户和用户组,或者没有将php-fpm的用户或用户组修改成与nginx的一样。解决方法是修改php-fpm.conf配置文件中user和group,默认情况下这两项配置是被注释的。

<value name="user">www</value>
<value name="group">www</value>

3. [error] 19075#0: *4 connect() failed (110: Connection timed out) while connecting to upstream, ......
这个错误提示是告诉我们nginx转发到php-fpm的时候连接超时了,所以如果访问量太大的话可以将超时的时间设置长一些。但如果网站访问量不大或者刚开始配置之后就出现这个错误的话,往往是iptables设置的问题。验证的方法是:如果将iptables停止(/etc/init.d/iptables stop)之后访问正常则说明是防火墙配置的问题,在防火墙中增加如下规则即可:

iptables -I INPUT 2 -i lo -p all -j ACCEPT
/etc/init.d/iptables save
/etc/init.d/iptables start

4. 启动nginx的时候出现 [emerg]: getpwnam("www") failed 错误
这个错误中getpwnam中间的www可能是其他的名称,主要原因是编译nginx和nginx配置文件(nginx.conf)中设置的用户和用户组不存在,所以只要创建对应的用户和用户组即可。

5. [emerg] 30558#0: setuid(500) failed (11: Resource temporarily unavailable)
错误信息中的setuid中间的数字肯是其他数字,比如501、502等等。这个错误需要一步一步的进行排查,相对有点复杂,解决的方法如下:
首先根据setuid中间的数字查看对应数字的用户是否存在,如果不存在则创建用户:

more /etc/passwd | grep 500
# 如果没有任何信息显示则查看nginx配置文件中指定的用户名称,然后使用useradd创建该用户并指定用户组

如果用户存在的话,则使用 ulimit -n 命令查看服务器文件描述符是多少,默认是1024,然后使用 ps -U www | wc -l 命令查看www用户所启用的进程数量(注意将www用户换成你自己的),如果显示的数量超过了服务器文件描述符的数量,则需要提升该参数,具体的做法是:将nginx.conf中的worker_rlimit_nofile、worker_connections和php-fpm.conf文件中的rlimit_files配置项设置大一些,也可以直接设置成65535(最大值)。然后还需要加大服务器文件描述符的大小。有两种设置方法:

# 一种是修改/etc/security/limits.conf文件,然后重启服务器
echo '* - nofile 65535' >> /etc/security/limits.conf
# 另外一种是使用 ulimit -HSn 65535 命令,将该命令添加到开机启动并放在php-fpm和nginx启动前
ulimit -HSn 65535
cat >> /etc/rc.local <<EOF
/etc/init.d/mysql start
ulimit -SHn 65535
/usr/local/php/sbin/php-fpm start
/usr/local/nginx/sbin/nginx
EOF

一定要确认“ulimit -HSn ”后面的数字需要和nginx.conf中的worker_rlimit_nofile、worker_connections和php-fpm.conf文件中的rlimit_files配置项设置成相同的数字。

如果安装上面的设置修改之后还有错误的话,恭喜你,你的人品大大的提升了,这种情况是比较少见的,先确认一下你是否进行了重启,如果重启过了还可以将 “ulimit -SHn 65535” 命令添加到/etc/profile 中:

echo "ulimit -SHn 65535" >> /etc/profile

赞(0)
未经允许不得转载:飘云 » Nginx配置信息说明及虚拟主机的创建使用方法
分享到: 更多 (0)