一、Nginx主配置文件及解析
Nginx配置文件主要分为4部分:main(全局设置)部分设置的指令将影响其他所有设置;server(主机设置)部分的指令主要用于指定主机和端口;upstream(负载均衡服务器设置)部分指令主要用于负载均衡,设置一系列的后端服务器;location(URL匹配特定位置的设置)部分用于匹配网页位置。四者之间的关系:server继承main,location继承server,upstream既不会继承其他设置,也不会被继承。
# 指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。如果编译Nginx的时候指定了用户和用户组,该选项可以关闭 user www www; # 指定Nginx需要开启的进程数,每个进程平均耗费10~12M内存。建议数量设置成与CPU内核的数量一致就可以了。 # cpu的核心数可以使用 cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l 或 cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 命令进行查 worker_processes 1; # 定义全局错误日志文件,后面可以设置输出级别:debug、info、notice、warn、error、crit error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; # 用来指定进程id的存储文件位置 pid logs/nginx.pid; # 启用TCMalloc的设置,见上节相关的描述 google_perftools_profiles /tmp/tcmalloc; # 用于绑定worker进程和CPU,该值必须和Linux内核打开文件数关联起来,如将该值设置为65535就必须在Linux命令行中执行 ulimit -HSn 65535 worker_rlimit_nofile 65535; events { # 用来指定Nginx的工作模式,支持的模式有select、poll、kqueue、epool、rtsig和/dev/poll。其中select和poll都是标准的工作模式 # kqueue和epoll是高效的工作模式,前者用在linux平台上,后者用于BSD系统。 use epoll; # 定义每个进程的最大连接数,默认是1024,该参数的最大连接数受Linux系统进程的最大打开文件数限制,必须使用 ulimit命令 # 另外,最大客户端连接数max_client=worker_processes*worker_connections,作为反向代理的话还需要除以4。 worker_connections 65535; } http { # 引用外部文件,类似于Apache中的include include mime.types; # 当出现无法解析的文件时,提示用户下载 default_type application/octet-stream; # 定义日志的格式,后面的main为格式的名称,可以在access_log指令中进行引用 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; # 设定请求缓冲 server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; # 设置客户端能够上传文件大小的限制 client_max_body_size 600m; # 是否开启高效文件传输模式,将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞 sendfile on; tcp_nopush on; tcp_nodelay on; # 隐藏nginx的版本显示,增强安全性 server_tokens off; # 用于设置客户端连接保持活动的超时时间,单位为秒,默认为75s #keepalive_timeout 0; keepalive_timeout 65; # 用于指定响应客户端的超时时间,这个超时仅限于两个连接活动之间的时间,默认为60s #send_timeout 60; # 下面是FastCGI的优化指令 # 连接到后端FastCGI的超时时间 fastcgi_connect_timeout 300; # 向FastCGI传送请求的超时时间 fastcgi_send_timeout 300; # 接收FastCGI应答的超时时间 fastcgi_read_timeout 300; # 指定读取FastCGI应答第一部分需要多大的缓冲区 fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; # 默认值是fastcgi_buffers的两倍 fastcgi_busy_buffers_size 128k; # 表示在写入缓存文件时使用多大的数据块,默认为fastcgi_buffers的两倍 fastcgi_temp_file_write_size 128k; # 为FastCGI缓存指定一个文件路径、目录结构等级、关键字区域存储时间和非活动删除时间 #fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; # 开启FastCGI缓存并为其设定一个名称。开启缓存可以有效降低CPU的负载,并且防止502错误的发生。 # 但是同时也会引起很多问题,要视具体情况而定 #fastcgi_cache TEST; # 用来指定应答代码的缓存时间,下面三条指令表示将200和303应答缓存1小时,301应答缓存1天,其他应答缓存1分钟。 #fastcgi_cache_valid 200 302 1h; #fastcgi_cache_valid 301 1d; #fastcgi_cache_valid any 1m; # 配置Nginx的HttpGzip模块,开通的前提是安装的时候启用了该模块,使用 /usr/local/nginx/sbin/nginx -V 来查看安装的信息(大写的V) # 是否开通gzip gzip on; # 允许压缩的页面最小字节数 gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; # 压缩比,从1到9,越大压缩率越高但越占资源,默认为1 gzip_comp_level 2; # 指定压缩的类型,text/html总是被压缩 gzip_types text/plain application/x-javascript text/css application/xml; # 是否让浏览器缓存压缩过的数据,默认为off gzip_vary on; # server 用于对虚拟主机的设置,建议每个站点的设置放到外部配置文件中,然后使用include进行引用 # 这里设置一个默认的主机,当默认访问的时候返回403错误 server { listen 80 default; server_name _; # 也可以修改成404或者500,根据自身情况进行设置 return 403; } # 可以使用include将每个站点的配置引用进来,这样方便对站点进行管理 include vhosts/examples.com.conf; include vhosts/abc.com.conf; }
二、Nginx设置虚拟主机及对PHP的支持
在conf目录下面创建vhosts目录,并创建站点的配置文件,这里以examples.com.conf为例。
[root@localhost ~]# cd /usr/local/nginx/ [root@localhost nginx]# mkdir -p conf/vhosts [root@localhost nginx]# vim conf/vhosts/examples.com.conf
创建的examples.com.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_root$fastcgi_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.examples.com/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/examples.com$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
相关推荐
在Nginx中,虚拟主机配置允许在一个服务器实例上托管多个独立的网站,这三种方式分别是基于IP、基于端口和基于域名的虚拟主机配置。本文重点讲解基于域名的虚拟主机配置方法,这对于多站点共用同一IP和端口的情况...
上述配置创建了两个虚拟主机实例,分别对应于***和***两个域名。每个server块定义了一个监听80端口的服务器,具有自己的server_name、index、access_log和root指令。其中,server_name指明了该虚拟主机对应的具体...
本篇文章将详细介绍如何在Nginx中配置多个虚拟主机(vhost)。 首先,让我们理解什么是虚拟主机。在Nginx中,虚拟主机是基于服务器名称或者IP地址来区分不同的网站。当用户通过浏览器访问某个域名时,Nginx会根据...
2. **Nginx配置**:编辑核心配置文件`nginx.conf`,在`server`块中定义监听的IP地址和端口。例如,创建两个`server`节点,分别监听192.168.72.48和192.168.72.49,每个节点指定不同的HTML根目录。修改`root`和`index...
一、多域名配置虚拟主机 1. 修改Nginx配置文件:Nginx的配置文件通常位于`/etc/nginx/nginx.conf`,在这里,我们需要在http指令块中添加虚拟主机配置。例如: ```nginx http { server { listen 80; server_name...
在本教程中,我们将深入探讨如何利用Nginx配置虚拟主机,实现多个网站在同一台服务器上的独立运行。 **一、Nginx虚拟主机概念** Nginx虚拟主机允许我们在单个Nginx实例上托管多个网站,每个网站有自己的域名或IP...
- **创建虚拟主机配置文件**:在`nginx`的`conf`目录下创建`vhosts`子目录,然后在此目录下为每个虚拟主机创建单独的配置文件。文件名可自定义,建议使用与应用相关的名称,便于识别和管理。 - **编写虚拟主机...
- **server块**:代表一个监听特定端口的服务器实例,可配置虚拟主机。 - **location块**:定义请求URL匹配规则,进行路由分发。 3. **conf.d目录的使用** 在`conf.d`目录下,每个`.conf`文件代表一个独立的配置...
从安装必要的依赖包,到编译安装Nginx,再到配置虚拟主机,每一步都详尽地展示了如何操作,以确保用户能够顺利地搭建自己的虚拟主机环境。这样的配置方式,尤其适用于需要在同一服务器上运行多个网站,且希望避免...
1. **基础配置**:在Nginx配置文件中,我们需要设置监听端口、日志路径等基本信息。例如: ``` server { listen 80; server_name leyoutest.com; # 替换为你的域名或IP access_log /var/log/nginx/leyou-manage...
Nginx的配置文件通常位于`/etc/nginx/nginx.conf`,在这里你可以定义虚拟主机、服务器块以及location块等。为了启用文件上传功能,你需要在Nginx配置中引入upload_module和upload_progress_module。这两个模块并不...
2. 编辑配置文件:修改 `nginx.conf` 或者创建新的虚拟主机配置,定义代理监听端口和上游服务器(即API接口的地址)。 3. 设置代理:在 Nginx 配置中,使用 `proxy_pass` 指令指定上游服务器。 4. 配置代理头:确保...
4. **server块**:指定单个虚拟主机的配置。 5. **location块**:更细粒度地控制URL响应。 #### 三、全局块详解 全局块位于配置文件的最开始部分,主要包括: 1. **user指令**:定义运行Nginx服务器的用户和用户组...
这个脚本能够帮助用户创建、删除Nginx的虚拟主机配置,提高运维效率。 描述中提到的“用法”,即脚本的使用方法,包括两个主要操作:创建和删除虚拟主机。用户通过交互式界面输入选择的操作和相关参数,脚本会根据...
所有配置完成后,我们可以通过浏览器访问 Nginx 主机的 IP 地址 `192.168.1.137`,以测试配置是否成功。如果一切配置正确,我们将看到测试文件的内容。 结论 在本篇文章中,我们详细介绍了如何将 Nginx 与 PHP ...
- 如果需要为多个域名配置虚拟主机,只需在同一个配置文件中或者在 `vhosts` 目录下创建多个 `server` 块,每个 `server` 块对应一个域名。Nginx会根据 `Host` 请求头来判断应由哪个虚拟主机处理请求。 4. **启用...
增加设置多个nginx配置模板,可以实现负载均衡、自动配置虚拟主机等高级的nginx的功能 nginx配置模板为nginxconf/template/domainlocalconf.tpl #该项目使用帮助 由于我在windows上编译的,暂时没有找到交叉编译...
例如,为第二个域名`blog.example.com`配置虚拟主机: ```nginx server { listen 80; server_name blog.example.com; root /var/www/blog.example.com/html; index index.html index.htm; } ``` ### 5. 启动...
- **修改Nginx配置**:打开Nginx的主要配置文件`nginx.conf`,取消`log_format`行的注释,以便记录日志。在配置文件末尾,添加`include vhost/*.conf`,将虚拟主机配置文件包含进来。 - **创建虚拟主机配置文件**...
在Nginx的配置文件中,通常位于`nginx.conf`或其包含的各个虚拟主机配置文件中,我们可以通过`proxy_pass`指令来指定后端服务器的地址。例如: ```nginx server { listen 80; server_name example.com; ...