zoukankan      html  css  js  c++  java
  • Nginx(一):安装

    nginx 的安装

    下载地址: http://nginx.org/download/nginx-1.4.2.tar.gz

    安装准备: nginx依赖于pcre库,要先安装pcre(正则的库)

    yum install pcre

    yum install pcre-devel

    注意:1. 如果在./configure 提示某个库没有装,但是我们yum 之后提示该库已经装了,Nothing to do,此时我们在后面添加一个 -devel.

         2. ./configure: error: C compiler cc is not found如果出现这个错误,则 yum -y install gcc gcc-c++ autoconf automake make 

    安装:

     cd /usr/local/src/

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

    tar -zxvf nginx-1.4.2.tar.gz

    cd nginx-1.4.2

    ./configure --prefix=/usr/local/nginx  (一致性哈希的东西没装)

    make && make install

    222222

    nginx目录结构:

    cd /usr/local/nginx, 看到如下4个目录

    ./

     ....conf 配置文件 

     ... html 网页文件

     ...logs  日志文件

     ...sbin  主要二进制程序

    启动:

    33333

    [root@localhost nginx]# ./sbin/nginx

    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

    ....

    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

    nginx: [emerg] still could not bind()

    报错:不能绑定80端口,80端口已经被占用

    (有时是自己装了apache,nginx等,还有更多情况是操作系统自带了apache并作为服务启动)

    解决: 把占用80端口的软件或服务关闭即可.

    444

    -antp,加上p,我们可以看到80端口到底是哪个程序占用了,最后一列,httpd,明显是apache

    5555

    把进程杀杀死

    pkill -9 http  该命令是干啥的
    Nginx的信号控制

    TERM, INT

    Quick shutdown(紧急的杀掉,轻易不要这么用)

    QUIT

    Graceful shutdown  优雅的关闭进程,即等请求结束后再关闭(在apache中也有这个概念,

    比如有一个Worker进程没有在工作,那么直接杀掉,如果有一个Worker进程正在处理请求,那么我

    先不杀掉它,等它处理完了,就不要再接受请求了,我再把它杀掉,最后主进程也消亡了。)

    HUP

    Configuration reload ,Start the new worker processes with

     a new configuration Gracefully shutdown the old worker processes

    改变配置文件,平滑的重读配置文件(apache改了配置文件,需要重启主进程,从这里我们可以看出

    如果使用信号量HUP,Nginx并不需要重启主进程这一点是Nginx很大的优点。机制是会开启新的

    Worker进程,去读取新的配置文件,然后再优雅的关闭旧的进程,最后旧进程慢慢的都没了,新进程

    慢慢的就多了,而且新进程是读取的新的配置文件)

    USR1

    Reopen the log files 重读日志,在日志按月/日分割时有用(在linux中,有inode的概念,文

    件名只是一个表象,当nginx在往一个日志文件中写东西的时候,如果我们想要nginx换一个文件写

    ,不要在原来的文件中写了。有的人考虑到,我们给原来的日志文件换一个名字,mv access.log

    access.log.back,然后再创建一个touch access.log,就可以了,但是实际上是不行的,虽然

    我们的文件名字换了,但是nginx写日志的位置仍然是那块磁盘位置(也就是说nginx是在向某一个

    iNode写,但是nginx在读取配置文件的时候,虽然获取的是文件名,但是实际上提取的是文件名

    所对应的inode,所以配置文件需要重读),即使我们删除这个文件也是不行的,因为那块inode不可

    能被删,新文件的大小是不可能会变的)

    USR2

    Upgrade Executable on the fly 平滑的升级

    WINCH

    Gracefully shutdown the worker processes 优雅关闭旧的进程(配合USR2来进行升级)

                                                                                                                            

    具体语法:

    Kill -信号选项 nginx的主进程号

    Kill -HUP 4873

     

    Kill -信号控制 `cat /xxx/path/log/nginx.pid`

     

    Kil; -USR1 `cat /xxx/path/log/nginx.pid`

    66666

    检测配置文件:一般在启动之前,执行一下这个命令,进行检测配置文件

    99

     

    Nginx配置段

     

    // 全局区
    worker_processes 1; // 有1个工作的子进程,可以自行修改,但太大无益,因为要争夺CPU,一般设置为 CPU数*核数

    101010

    Event {

    // 一般是配置nginx连接的特性

    // 如1个work能同时允许多少连接

     worker_connections  1024; // 这是指 一个子进程最大允许连1024个连接

    }

     

    http {  //这是配置http服务器的主要段

         Server1 { // 这是虚拟主机段

                //监听某一个端口或域名,把它映射到某一个目录中去,本例中的nginx装在/var/local/nginx/

                Location {  //定位,把特殊的路径或文件再次定位 ,如image目录单独处理

                }             /// 如.php单独处理

     

         }

     

         Server2 {

         }

         ….

    }

     

    例子1: 基于域名的虚拟主机

     

        server {

            listen 80;  #监听端口

            server_name a.com; #监听域名(如果测试,需要修改host文件,博客中有相关内容)

     

            location / {

                    //root可以写相对目录,相对的是nginx的根目录,也可以写绝对路径,而且绝对路径不限于在nginx目录下,下面的例子就是绝对路径,但是并不是在nginx的目录中

                    root /var/www/a.com;   #根目录定位

                    index index.html;

            }

        }

     

    例子2: 基于端口的虚拟主机配置

     

        server {

            listen 8080;

            //server_name z.com;(视频中sever_name用的是z.com)

    server_name 192.168.1.204;

     

            location / {

                    root /var/www/html8080;

                    index index.html;

            }

    }

    例子3: 基于IP的虚拟主机配置

        server {

            listen 80;

            server_name 192.168.1.204;

     

            location / {

                    root html/ip;

                    index index.html;

            }

    }

     

     

    日志管理

     

     

    我们观察nginx的server段,可以看到如下类似信息

     #access_log  logs/host.access.log  main;

    这说明 该server, 它的访问日志的文件是  logs/host.access.log ,

    使用的格式”main”格式.

    除了main格式,你可以自定义其他格式.

     

    main格式是什么?

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

        #                  '$status $body_bytes_sent "$http_referer" '

        #                  '"$http_user_agent" "$http_x_forwarded_for"';

     

    main格式是我们定义好一种日志的格式,并起个名字,便于引用.

    以上面的例子, main类型的日志,记录的 remote_addr.... http_x_forwarded_for等选项.

     

     

    1: 日志格式 是指记录哪些选项

    默认的日志格式: main

         log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                                '$status $body_bytes_sent "$http_referer" '

                                '"$http_user_agent" "$http_x_forwarded_for"';

    '"$http_user_agent":我们想要访问一个网页,浏览器代我们发送请求,所以浏览器被称为用户代理,该字段记录的就是,用户的浏览器是什么,机器的系统是什么。

     

    http_x_forwarded_for:如果用户使用代理服务器来访问某一个网站,代理服务器有可能又通过代理服务器访问网站,那么每经过一个代理服务器,都会修改$http_x_forwarded_for,最终服务器会取最后一次的$http_x_forwarded_for。这样,我们就可能看到来自朝鲜的用户发表评论的现象了。如果web服务器选择使用$remote_addr来判断用户来自哪里,此时主动权在服务器端,我们可以通过remote_addr来判断访问者到底来自哪里。

     

    蜘蛛协议非强制的,只能靠道德去制约

     

    注意:如果我们的虚拟主机(server)没有配置日志,那么系统就会默认的使用main格式日志,并且访问日志会放在logs/access.log中,如果我们配置了访问日志,那当然就是使用我们配置的格式喽

     

    如默认的main日志格式,记录这么几项

    远程IP- 远程用户/用户时间 请求方法(如GET/POST) 请求体body长度 referer来源信息

    http-user-agent用户代理/蜘蛛 ,被转发的请求的原始IP

     

    http_x_forwarded_for:在经过代理时,代理把你的本来IP加在此头信息中,传输你的原始IP

     

     

     

     

    2: 声明一个独特的log_format并命名

    如果这种日志格式我们觉得不好,我们也可以自己任意组合这几个变量,也可以删除几个,自己配一套日志格式

     

        log_format  mylog '$remote_addr- "$request" '

                         '$status $body_bytes_sent "$http_referer" '

                            '"$http_user_agent" "$http_x_forwarded_for"';

    在下面的server/location,我们就可以引用 mylog

     

    在server段中,这样来声明

    Nginx允许针对不同的server做不同的Log ,(有的web服务器不支持,如lighttp)

     

    access_log logs/access_8080.log mylog;  

    声明log   log位置          log格式;

     

     

    实际应用: shell+定时任务+nginx信号管理,完成日志按日期存储

    分析思路:

    凌晨00:00:01,把昨天的日志重命名,放在相应的目录下

    再USR1信息号控制nginx重新生成新的日志文件

    具体脚本:

    #!/bin/bash

    base_path='/usr/local/nginx/logs'

    log_path=$(date -d yesterday +"%Y%m")

    day=$(date -d yesterday +"%d")

    mkdir -p $base_path/$log_path

    mv $base_path/access.log $base_path/$log_path/access_$day.log

    #echo $base_path/$log_path/access_$day.log

    kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

     

    linux如何更改系统时间

    11

    定时任务

    Crontab 编辑定时任务

    crontab –e

    12

    分 时 日 月 周 命令

    01 00 * * * /xxx/path/b.sh  每天0时1分(建议在02-04点之间,系统负载小)

  • 相关阅读:
    团队项目 第一次作业
    20165201 课下作业第十周(选做)
    20165201 实验三敏捷开发与XP实践
    20165201 2017-2018-2 《Java程序设计》第9周学习总结
    20165201 结对编程练习_四则运算(第二周)
    20165201 2017-2018-2 《Java程序设计》第8周学习总结
    20165201 实验二面向对象程序设计
    20165326 java实验五
    20165326 课程总结
    20165326 java实验四
  • 原文地址:https://www.cnblogs.com/mrxiaohe/p/5844435.html
Copyright © 2011-2022 走看看