Nginx·入门

CY 2019年02月21日 1,064次浏览

记录Nginx的各种使用配置

Nginx环境的搭建

Nginx有两个网站,一个是nginx.com另一个是nginx.org,org是免费开源的Nginx

访问Nginx下载界面

Nginx下载界面.png

首先要下载Nginx,在Linux上执行下面命令即可进行下载

wget http://nginx.org/download/nginx-1.16.1.tar.gz

安装前的准备

在安装前需要先确定Linux上是否有gccopensslpcrezlib

执行下面的命令即可安装上面列出的库

yum list installed | grep gcc # 检查GCC是否已经安装
yum install gcc -y # 执行安装
yum list installed | grep openssl # 检查OpenSSL是否已经安装
yum install openssl openssl-devel -y # 安装OpenSSL
yum list installed | grep pcre # 检查是否已经安装pcre
yum install pcre pcre-devel -y # 安装PCRE
yum list installed | grep zlib # 检查是否已经安装了zlib
yum install zlib zlib-devel -y # 安装zlib

如果已经确定了没有安装过这些库,或者想对这些库进行更新,可以执行下面的命令一次性全部安装:

yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y

开始安装

  • 解压下载的nginx文件
tar -zxvf nginx-1.16.1.tar.gz -C /usr/local/software
  • 切换至nginx解压后的目录
cd /usr/local/software/nginx-1.16.1
  • nginx解压后的目录中执行
./configure --prefix=/usr/local/nginx

其中prefix为安装的目录

  • 执行命令进行编译
make
  • 执行命令进行安装
make install
  • 查看安装目录中的目录结构
drwxr-xr-x. 2 root root 4096 9月  17 17:43 conf
drwxr-xr-x. 2 root root   40 9月  17 17:43 html
drwxr-xr-x. 2 root root    6 9月  17 17:43 logs
drwxr-xr-x. 2 root root   19 9月  17 17:43 sbin

安装成功后Nginx只有四个目录,目录的作用如下:

confNginx的主要配置目录,其中nginx.conf文件是nginx的默认主要配置文件

html: Nginx的默认静态目录,里面有两个文件index.html50x.html

logs: Nginx的默认日志目录

sbin: Nginx程序的二进制启动程序目录

启动Nginx

普通方式启动,直接使用下面的命令可以启动Nginx

./nginx

通过配置文件启动,根据配置文件中的配置启动Nginx

# 当前目录
./nginx -c /usr/local/nginx/conf/nginx.conf
# 全路径
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

启动后查看nginx进程

ps -ef | grep nginx

查看结果:

root      15641      1  0 20:49 ?        00:00:00 nginx: master process ./nginx
nobody    15643  15641  0 20:49 ?        00:00:00 nginx: worker process

可以看到nginx包含了两个进程,masterworker进程

master用来加在配置文件和维护worker进程

worker进程用来真正处理用户的请求,注意上面的worker进程使用的是nobody用户

nginx的关闭

方式:

# 优雅的关闭
kill -QUIT master进程的pid
# 快速的关闭
kill -TERM master进程的pid
# 重新加在配置文件(重启)
./nginx -s reload
# 优雅的关闭2
./nginx -s quit
# 快速的关闭2
./nginx -s stop
# 重新打开配置文件
./nginx -s reopen

注意在进行-s操作的时候默认会操作logs文件夹中nginx.pid中记录的那个进程

nginx的其他常用操作

检查修改后的nginx配置文件的语法是否正确,只需要在上面的命令后面加入-t即可

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t

屏幕上提示下面文字表示检查正常

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

查看nginx的版本

nginx -v 或 nginx -V

小写的v可以查看nginx的版本

nginx version: nginx/1.16.1

大写的V可以查看nginx版本和编译使用的gcc的版本和gcc的配置参数

nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
configure arguments: --prefix=/usr/local/nginx

Windows下使用nginx

解压压缩包即可使用,解压目录中有一个nginx.exe文件

启动方式“双击exe文件”或者下面命令

start nginx

关闭方式可以直接在任务管理器中杀死进程,或者使用下面的方式

nginx -s stop

Nginx的配置文件(nginx.conf)

nginx的配置文件主要由三个部分组成:

基本配置

#user  nobody; # 配置worker进程运行用户,默认使用nobody用户
worker_processes  1; # 配置工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU数量
# 配置全局错误日志及类型,【debug | info | notice | warn |error |crit】
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid; # 配置进程pid文件

events配置

# 配置工作模式和连接数
events {
    # use epoll; # 优化参数
    # 配置每个worker进程连接数上限
    # nginx支持的总连接数等于 worker_processes * worker_connections
    worker_connections  1024;
}

http配置

# 配置http服务器,利用它的反向代理功能提供负载均衡支持
http {
    # 配置nginx支持哪些多媒体类型,可以在conf/mime.types查看支持哪些多媒体类型
    include       mime.types;
    # 默认文件类型,application/octet-stream基本支持所有的文件
    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日志及存放路径,并使用上面定义的main日志格式
    #access_log  logs/access.log  main;

    sendfile        on; # 开启高效文件传输模式
    #tcp_nopush     on; # 防止网络阻塞

    #keepalive_timeout  0;
    # 长连接超时时间,单位是秒
    keepalive_timeout  65;

    # 开启gzip压缩输出
    #gzip  on;

    # 配置虚拟主机
    server {
        # 配置监听端口
        listen       80;
        # 配置服务名
        server_name  localhost;

        # 配置字符集
        #charset koi8-r;

        # 配置本虚拟主机的访问日志
        #access_log  logs/host.access.log  main;

        # 默认的斜杠/(比如说www.m.com)的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理
        location / {
            # root是配置服务器的默认网站根目录位置,默认为nginx安装目录下的html目录
            root   html;
            # 配置首页文件的名称
            index  index.html index.htm;
        }

        # 配置404页面
        #error_page  404              /404.html;

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

        # PHP脚本请求全部转发到Apache处理
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # PHP脚本请求全部转发到FastCGI处理
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # 禁止访问 .htaccess 文件
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

    # 配置另一个虚拟主机
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # 配置HTTPS服务
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

Nginx的主要应用

静态网站(常用)

静态网站.png

Nginx可以将静态资源直接通过Http协议返回给浏览器客户端

server {
    listen 80; # 端口号
    location / {
        root /opt/html/; # 静态文件路径
        index index.html index.htm;
    }
}

负载均衡(重要)

负载均衡.png

实现目标,浏览器输入一个网址,每次访问这个网址,nginx都要自动分配要访问哪个服务器

upstream www.m.com {
    server 127.0.0.1:81 weight=2;
    server 127.0.0.1:82 weight=1;
}

其中weight=1表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重值越大访问机会越多

upstream指令要写在http模块中,更多关于upstream的信息查看,注意,upstream指令中的server属性后面的值不能为无权限访问的IP域名,比如说baidu.com

upstream是配置nginx于后端服务器负载均衡的一个非常重要的模块,并且他还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器

location /me/ {
    proxy_pass http://www.m.com/;
}

其中www.m.com字符串要和upstream指令后面的字符串相等。

更多介绍:

B站UP主:free-coder

他的视频力求用最简单的语言,最短的时间把一个技术的灵魂介绍给大家

负载均衡的策略

轮询(默认): 默认配置就是轮询策略,每个请求轮流分配到不同的后端服务器,如果后端服务器宕机,将会自动剔除该服务器

权重:上面用到的策略就是权重策略

ip_hash:也叫作IP绑定,每个请求按访问IPhash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决回话Session丢失的问题

upstream www.m.com {
    ip_hash;
    server 127.0.0.1:81;
    server 127.0.0.1:82;
}

最少连接web请求会转发到连接数最少的服务器

upstream www.m.com {
    least_conn;
    server 127.0.0.1:81;
    server 127.0.0.1:82;
}

负载均衡的其他配置

backup

upstream www.m.com {
    server 127.0.0.1:81;
    # backup 其他所有的非backup的机器都宕机的时候,才请求backup机器
    server 127.0.0.1:82 backup;
}

down

upstream www.m.com {
    server 127.0.0.1:81;
    # down 表示当前的server是down状态,不参与负载均衡
    server 127.0.0.1:82 down;
}

backup的用途

可以做不用停运全部服务器的部署,分批次的上线更新后的项目

比如说有5台服务器都搭载了老项目,这个时候想要进行项目的更新,可以给1,2,3台服务器设置为backup,这个时候访问的时候不会访问1,2,3服务器,可以将1,2,3服务器更新之后把1,2,3的backup去掉,然后设置4,5为backup,最后全部更新之后将backup全部去掉,这样就做到了分批次的更新项目。

静态代理

所有的静态资源使用nginx处理,不使用tomcat处理

方式1:

location ~.*\.(js|css|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
    root /opt/static;
}

其中:

~表示正则匹配,也就是说后面的内容可以是正则表达式匹配

第一个点. :(正则)表示任意字符

* 表示一个或多个字符

\. 转义字符

| 或者

$ 结尾

上面代码中规定了静态资源的后缀,当前台访问这些后缀的时候都会自动由nginx处理,注意目录的权限问题,权限不足的话会导致403错误,可以使用chmod 755来进行修改

方式2:

location ~.*/(css|js|img|images) {
    root /opt/static;
}

上面可以匹配:

xxx/css | xxx/js | xxx/img | xxx/images

动静分离

将负载均衡和静态代理结合在一起实现动静分离

一台nginx做负载均衡,后面有两台nginx做静态代理,两台Tomcat做动态服务器

注意:Nginx可以指定配置文件启动,意味着可以使用不同的配置文件启动多个Nginx,而不用安装多个Nginx

静态资源负载均衡配置

upstream static.m.com {
    server 127.0.0.1:81;
    server 127.0.0.1:82;
}

静态资源转发配置

location ~.*/(css|js|img|images) {
    proxy_pass http://static.m.com;
}

虚拟主机(重点)

虚拟主机.png

实现: blogs.m.com, notes.m.com分别转发到同一台服务器上的不同端口中...

如果有多台服务器,上面的需求非常好实现,只需要在域名解析中配置一下就可以了,但是如果只有一台服务器,需要实现上面的功能,Nginx就可以派上用场了

如果想要实现上面的功能只需要在配置文件中配置多个server节点就可以了

虚拟主机可以通过端口来区分

例如:

server {
    listen 80;
    ...
}

server {
    listen 81;
    ...
}

虚拟主机可以通过域名来区分(重点)

例如:

upstream配置

upstream blogs {
    server 127.0.0.1:81;
}

upstream notes {
    server 127.0.0.1:82;
}

server配置

server {
    listen 80;
    server_name blogs.m.com;
    location / {
        proxy_pass http://blogs;
    }
}

server {
    listen 80;
    server_name notes.m.com;
    location / {
        proxy_pass http://notes;
    }
}

注意配置hosts文件

127.0.0.1 blogs.m.com
127.0.0.1 notes.m.com

还可以使用include来引入虚拟主机配置

比如说现在有一个文件/usr/local/nginx/vhost/vhost.conf配置了虚拟主机,配置文件里面写了两个server

将上面虚拟主机的配置文件加入到http{}部分的结尾,与其他server并列,这样就可以导入外部的配置

include mime.types类似

include /usr/local/nginx/vhost/vhost.conf