1.Nginx概述

Nginx是一个免费的、开源的、高性能的Web服务器和反向代理服务器,以其高性能、稳定性、丰富的功能、配置简单、资源消耗少著称。Nginx有别于传统Web服务器依赖于线程来处理请求,而是基于事件驱动模型,使用更少资源提供更多服务,解决了C10K问题。

2.Nginx安装与控制指令

2.1Windows版Nginx安装

 如何获取安装介质和安装Nginx

访问官方网站获取安装介质Index of /download/,如下图

Nginx教程(一) nginx简介_nginx

下载安装介质后,解压到一个不含空格的路径中即安装完成,如下图。

Nginx教程(一) nginx简介_Nginx_02

启动及停止Nginx服务

通过Windows命令行进入Nginx解压目录,如下图

Nginx教程(一) nginx简介_apache_03

执行start nginx.exe,即可以启动nginx服务,如下图

Nginx教程(一) nginx简介_apache_04

执行nginx.exe –s reload:重新加载配置文件。(关闭已经存在的子进程,使用新的配置文件启动新的子进程。)

n  执行nginx.exe –s quit:停止服务,等待子进程完成现有的请求后关闭。

Nginx教程(一) nginx简介_nginx_05

2.2 Linux版Nginx安装

访问官方网站获取安装介质Index of /download/,如下图

Nginx教程(一) nginx简介_apache_06

编译及安装Nginx

编译安装基本步骤:
1.解压Nginx源码包。
2.进入Nginx解压后路径,执行./configure 定义属性和模块。(./configure编译选项很多,可以使用./configure –help进行查看。--with-xx表示默认没有安装,--without-xx表示默认已经选择安装,可以根据实际情况定义)。
3.执行make命令进行编译。
4.执行make install进行安装。
下面给出一个基于CentOS 6.4的安装过程实例:
#解决Nginx依赖关系
[root@nginx ~]# yum install zlib zlib-devel   openssl  openssl-devel  pcre   pcre-devel
#解压Nginx
[root@nginx ~]# tar zxvf nginx-1.7.12.tar.gz
#进入源码目录
[root@nginx ~]# cd nginx-1.7.12
#配置选项
[root@nginx ~]# ./configure 
--with-http_ssl_module 
--with-pcre 
--with-http_stub_status_module     
--with-http_realip_module
#执行编译指令
[root@nginx ~]#make
#执行安装指令
[root@nginx ~]#make install

注意

1.出现

Nginx教程(一) nginx简介_apache_07

安装个编译器

yum -y install gcc gcc-c++ autoconf automake make

2.没有prce包的话

yum -y install pcre-devel

3.没有zlib包的话

yum install -y zlib-devel

启动及停止Nginx服务

#启动Nginx
[root@nginx nginx-1.7.12]# /usr/local/nginx/sbin/nginx
#重新加载配置文件。(关闭已经存在的子进程,使用新的配置文件启动新的子进程。)
[root@nginx nginx-1.7.12]# /usr/local/nginx/sbin/nginx -s reload
#停止服务,等待子进程完成现有的请求后关闭。
[root@nginx nginx-1.7.12]# /usr/local/nginx/sbin/nginx -s quit

本机测试下载:

Nginx教程(一) nginx简介_nginx_08

3.Nginx如何的工作

上一章介绍了如何在Windows和Linux操作系统上安装Nginx,以及如何启动、停止、重启Nginx服务。这里我们简单介绍Nginx如何工作,包含Nginx的目录结构、进程如何工作、Nginx如何处理一个请求等

3.1 Nginx目录结构

Windows版Nginx目录结构

进入Nginx安装目录,可以查看Nginx的目录,下图展示了Windows下Nginx的目录结构。

Nginx教程(一) nginx简介_nginx_09

如上图所示,Windows版Nginx安装完成后,会在安装目录生成6个目录和一个可执行文件:conf目录、contrib目录、docs目录、html目录、logs目录、temp目录和nginx的可执行文件。
1.conf目录:存放配置文件的目录,包含主配置文件nginx.conf,是我们经常修改的配置文件。
2.contrib目录:存放开源爱好者共享的代码。
3.docs目录:存放文档资料。
4.html目录:默认存放了Nginx的错误页面和欢迎页面。
5.logs目录:默认存放了访问日志、错误日志和Nginx主进程pid文件。
6.temp目录:临时目录,用于存放Nginx运行时产生的临时文件。
7.nginx.exe:可执行程序,常用于Nginx服务的启动、停止等管理工作。

Linux版Nginx目录结构

进入Nginx安装目录,可以查看Nginx的目录,下图展示了Linux下Nginx的目录结构。

Nginx教程(一) nginx简介_nginx_10

如上图所示,Linux版Nginx安装完成后,会在安装目录生成9个目录:client_body_temp目录、conf目录、fastcgi_temp目录、html目录、logs目录、proxy_temp目录、sbin目录、scgi_temp目录和uwsgi_temp目录。
1.*_temp目录:共有5个temp结尾的目录,用于存放Nginx运行时产生的临时文件。
2.conf目录:存放配置文件的目录,包含主配置文件nginx.conf,是我们经常修改的配置文件。
3.html目录:默认存放了Nginx的错误页面和欢迎页面等。
4.logs目录:默认存放了访问日志和错误日志文件。
5.sbin目录:默认存放了Nginx的二进制命令,常用于Nginx服务的启动、停止等管理工作。

3.2  Nginx进程如何工作

默认情况下,运行中的Nginx会包含如下进程:

主进程master process(父进程)。

子进程worker process(工作进程)。

具体情况如下图所示。

Nginx教程(一) nginx简介_Nginx_11

Nginx教程(一) nginx简介_nginx_12

Nginx主进程

       Nginx主进程充当监控进程,而由主进程生成的子进程则充当工作进程。主进程充当整个进程组与管理用户的交互接口,同时对进程进行监护。它不需要处理网络事件,不负责业务执行,只会通过管理worker进程来实现重启服务、关闭服务、配置文件生效等功能。

Nginx子进程

       Nginx子进程充当工作进程,负责完成具体的任务。子进程主要负责完成用户请求接收与返回用户数据,以及与后端应用服务器的数据交互等工作。

 Nginx如何处理一个请求

       Nginx收到到一个请求后,它会依据如下步骤处理:

       首先,根据http请求的“Host”头以决定由哪个虚拟机处理请求;然后,匹配请求的URI,并根据URI定义规则返回数据。

4.如何配置Linux下Nginx

4.1.1配置Nginx代理HTTP请求到Tomcat

1.准备好tomcat1

Nginx教程(一) nginx简介_apache_13

2.修改

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #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;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;

    server {
        listen       80;
        server_name  localhost;
        
    location / {
    proxy_pass http://127.0.0.1:8080/test/;
    proxy_set_header Host  $http_host;
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

当访问时候发现跳转到tomcat那里

Nginx教程(一) nginx简介_apache_14

4.1.2配置Nginx负载均衡代理请求到Tomcat

1.准备,在同一服务器启动两个tomcat,不同端口

本文已经tomcat7为例

Nginx教程(一) nginx简介_nginx_15

修改tomcat1的server.xml如下

<?xml version='1.0' encoding='utf-8'?>

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>

    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>


  <Service name="Catalina">


    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost">

      <Realm className="org.apache.catalina.realm.LockOutRealm">

        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />

      </Host>
    </Engine>
  </Service>
</Server>

Nginx教程(一) nginx简介_Nginx_16

修改tomcat2的server.xml如下

<?xml version='1.0' encoding='utf-8'?>

<Server port="8006" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>

    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">

    <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />


    <Engine name="Catalina" defaultHost="localhost">

      <Realm className="org.apache.catalina.realm.LockOutRealm">

        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />

      </Host>
    </Engine>
  </Service>
</Server>

Nginx教程(一) nginx简介_nginx_17

仔细观看有3个地方不一样

<Server port="8005" shutdown="SHUTDOWN">

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

启动后发现

Nginx教程(一) nginx简介_apache_18

2.修改nginx.conf配置

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #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;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    
        upstream test {
        server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=5s;
        server 127.0.0.1:8081 weight=1 max_fails=3 fail_timeout=5s;
        }
        
    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        
    location / {
    proxy_pass http://test/test/;
    proxy_set_header Host  $http_host;
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

}

 解释

upstream test {
    #定义一个负载均衡,后面可以使用proxy调用。
    server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=5s;
      server 127.0.0.1:8081 weight=1 max_fails=3 fail_timeout=5s;
#定义负载均衡的web后端服务器,负载均衡策略默认是轮询,max_fails最大失败次数3,weight定义权值
#fail_timeout统计失败尝试次数,在5s内尝试失败3次,则认为不可用。将该服务器标记不可用
     }

#定义代理到后端tomcat的examples应用    
    proxy_pass http://test/test;

重新加载

Nginx教程(一) nginx简介_apache_19

访问试试

Nginx教程(一) nginx简介_nginx_20

再访问

Nginx教程(一) nginx简介_nginx_21

成功

 include功能:

第一种方法:文件夹

打开nginx.conf在最后一行大括号前加上

Nginx教程(一) nginx简介_Nginx_22

Nginx教程(一) nginx简介_nginx_23

Nginx教程(一) nginx简介_nginx_24

 成功

2.第二种方法

 或者

Nginx教程(一) nginx简介_apache_25

Nginx教程(一) nginx简介_nginx_26

 成功