nginx实战

nginx模块介绍

main
events   {
  ....
}
http        {
  ....
  upstream myproject {
    .....
  }
  server  {
    ....
    location {
        ....
    }
  }
  server  {
    ....
    location {
        ....
    }
  }
  ....
}

nginx配置文件主要分为六个区域: main(全局设置)、events(nginx工做模式)、http(http设置)、 sever(主机设置)、location(URL匹配)、upstream(负载均衡服务器设置)php

  1. main模块
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进程的最大打开文件数限制。若是没设置的话,这个值为操做系统的限制。跨域

  1. events 模块
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启动和关闭

  • /usr/local/nginx/nginx # 启动
  • /usr/local/nginx/nginx -s stop # 启动
  • /usr/local/nginx/nginx -s reload #平滑重启
  • /usr/local/nginx/nginx.conf #配置文件
  • ./nginx -t检测配置文件是否正确

基于域名的虚拟主机

假设咱们在本地开发有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 / { 
     
    }
}

参考资料一

参考资料二

相关文章
相关标签/搜索