main events { .... } http { .... upstream myproject { ..... } server { .... location { .... } } server { .... location { .... } } .... }
nginx配置文件主要分为六个区域: main(全局设置)、events(nginx工做模式)、http(http设置)、 sever(主机设置)、location(URL匹配)、upstream(负载均衡服务器设置)php
user nobody nobody; worker_processes 2; error_log /usr/local/var/log/nginx/error.log notice; pid /usr/local/var/run/nginx/nginx.pid; worker_rlimit_nofile 1024;
user 来指定Nginx Worker进程运行用户以及用户组,默认由nobody帐号运行。html
worker_processes来指定了Nginx要开启的子进程数。每一个Nginx进程平均耗费10M~12M内存。根据经验,通常指定1个进程就足够了,若是是多核CPU,建议指定和CPU的数量同样的进程数便可。我这里写2,那么就会开启2个子进程,总共3个进程。前端
error_log用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,nginx
debug输出日志最为最详细,而crit输出日志最少。web
pid用来指定进程id的存储文件位置。api
worker_rlimit_nofile 更改worker进程的最大打开文件数限制。若是没设置的话,这个值为操做系统的限制。跨域
events { worker_connections 2048; multi_accept on; use epoll; }
worker_connections用于定义Nginx每一个进程的最大链接数,即接收前端的最大请求数,默认是1024。最大客户端链接数由worker_processes和worker_connections决定,即Max_clients=worker_processes*worker_connections,在做为反向代理时,Max_clients变为:Max_clients = worker_processes * worker_connections/4。 进程的最大链接数受Linux系统进程的最大打开文件数限制,在执行操做系统命令“ulimit -n 65536”后worker_connections的设置才能生效。浏览器
worker_rlimit_nofile,咱们能够将这个值设得很高。服务器
use用来指定Nginx的工做模式。Nginx支持的工做模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工做模式,kqueue和epoll是高效的工做模式,不一样的是epoll用在Linux平台上,而kqueue用在BSD系统中,由于Mac基于BSD,因此Mac也得用这个模式,对于Linux系统,epoll工做模式是首选。负载均衡
multi_accept 告诉nginx收到一个新链接通知后接受尽量多的链接。
nginx启动和关闭
假设咱们在本地开发有3个项目,分别在hosts里映射到本地的127.0.0.1上:
127.0.0.1 www.iyangyi.com iyangyi.com 127.0.0.1 api.iyangyi.com 127.0.0.1 admin.iyangyi.com
有这样3个项目,分别对应于web根目录下的3个文件夹,咱们用域名对应文件夹名字,这样子好记:
/Users/yangyi/www/www.iyangyi.com/ /Users/yangyi/www/api.iyangyi.com/ /Users/yangyi/www/admin.iyangyi.com/
每一个目录下都有一个index.php文件,都素简单的输入本身的域名。
面咱们就来搭建这3个域名的虚拟主机,很显然,咱们要新建3个server来完成。为了看起来简洁好看,咱们使用require来包含外面的3个server在nginx.conf中,这样就清晰了不少。不会使得这个nginx.conf内容太多:
main events { .... } http { .... include vhost/www.iyangyi.conf; include vhost/api.iyangyi.conf; include vhost/admin.iyangyi.conf; #或者用 *.conf 包含 # include vhost/*.conf }
既然每个conf都是一个server,前面已经学习了一个完整的server写的了。下面就开始:
# www.iyangyi.conf server { listen 80; server_name www.iyangyi.com iyangyi.com; root /Users/yangyi/www/www.iyangyi.com/; index index.php index.html index.htm; access_log /usr/local/var/log/nginx/www.iyangyi.access.log main; error_log /usr/local/var/log/nginx/www.iyangyi.error.log error; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } }
# api.iyangyi.conf server { listen 80; server_name api.iyangyi.com; root /Users/yangyi/www/api.iyangyi.com/; index index.php index.html index.htm; access_log /usr/local/var/log/nginx/api.iyangyi.access.log main; error_log /usr/local/var/log/nginx/api.iyangyi.error.log error; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } }
这样3个很精简的虚拟域名就搭建好了。重启下nginx,而后打开浏览器访问一下这3个域名,就能看到对应的域名内容了。
upstream webservers{ server 192.168.33.11 weight=10; server 192.168.33.12 weight=10; server 192.168.33.13 weight=10; } server { listen 80; server_name upstream.iyangyi.com; access_log /usr/local/var/log/nginx/upstream.iyangyi.access.log main; error_log /usr/local/var/log/nginx/upstream.iyangyi.error.log error; location / { proxy_pass http://webservers; proxy_set_header X-Real-IP $remote_addr; } }
在vhost目录中新建一个conf server
server { listen 80; server_name leizhi.xiak.tech www.leizhi.xiak.tech; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:9000; client_max_body_size 10m; } }
重启下nginx: sudo nginx -s reload 固然。proxy 还有其余的参数,好比:proxy_set_header 用来设置header头部信息参数转发等,等用了能够仔细看看。
server { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE'; location / { } }