一:源码编译安装:

//参考:


 

步骤一 ): configure的极简配置:

./configure --prefix=/server/nginx

/server(自己手动建立的,与服务器相关的都安装到这里)

 

configure的其他配置:

./configure --prefix=/server/nginx/
            --with-http_ssl_module
            --with-pcre=/usr/local/src/pcre-4.4
            --with-zlib=/usr/local/src/zlib-1.1.3

            

先按照步骤一进行:

1) 路径: /home/user01/software/nginx-1.14.0

   configure --prefix...

2) 在该路径下 执行 make 命令 ;

3) 在该路径下 执行 make install 命令;

二:启动

三:网页访问方式:

 1) : 浏览器访问如:http:// IP:80

 2): wget 127.0.0.1

3):如果网页无法访问,则关闭防火墙:

{

         问题:Linux安装Nginx后访问虚拟机的ip时会出现链接不上的问题

        原因虚拟机没有放行Nginx默认端口80造成的

解决办法:

       方法1,可以暂时关闭防火墙 命令为:service iptables stop  然后在访问就可以了 

      方法2,可以放行80端口 命令为:/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT 然后保存防火墙规则,使更改生        效:/etc/rc.d/init.d/iptables save
}

https://user.qzone.qq.com/389678008/infocenter

 

启动Nginx

  查看端口80占用情况:netstat -ano|grep 80

 

四:开始调试:

利用strace/pstack调试Nginx

pstack nginx-pid

addr2line  -f -e 运行程序  pc指针地址 (-f : 函数名, -e : 指定了对象的可执行文件)

addr2line -e nginx -f 0x000000000040cc8a

 

[root@localhost sbin]# ps -ef|grep nginx
 root     20470     1  0 08:00 ?        00:00:00 nginx: master process ./nginx
 nobody   20473 20470  0 08:00 ?        00:00:00 nginx: worker process
 root     20555 13617  0 08:00 pts/4    00:00:00 grep nginx


 

[root@localhost ~]# gstack 20473
 #0  0x00000038d18e91a3 in __epoll_wait_nocancel () from /lib64/libc.so.6
 #1  0x0000000000431b8d in ngx_epoll_process_events ()
 #2  0x0000000000429a17 in ngx_process_events_and_timers ()
 #3  0x000000000043028c in ngx_worker_process_cycle ()
 #4  0x000000000042ea78 in ngx_spawn_process ()
 #5  0x000000000042f738 in ngx_start_worker_processes ()
 #6  0x00000000004307dd in ngx_master_process_cycle ()
 #7  0x000000000040cc8a in main ()
  [root@localhost sbin]# addr2line -e nginx -f

ps -ef|grep详解

ps命令将某个进程显示出来

grep命令是查找

中间的|是管道命令 是指ps命令与grep同时执行

PS是LINUX下最常用的也是非常强大的进程查看命令

grep命令是查找,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

以下这条命令是检查java 进程是否存在:ps -ef |grep java

字段含义如下:

UID       PID       PPID      C     STIME    TTY       TIME         CMD
zzw      14124   13991      0     00:38      pts/0      00:00:00    grep --color=auto dae

 

UID      :程序被该 UID 所拥有

PID      :就是这个程序的 ID 

PPID    :则是其上级父程序的ID

C          :CPU使用的资源百分比

STIME :系统启动时间

TTY     :登入者的终端机位置

TIME   :使用掉的CPU时间。

CMD   :所下达的是什么指令

 

0x000000000040cc8a
 main
 /home/xxxxxx/software/nginx-1.14.2/src/core/nginx.c:382

 

 

 

 


:

Linux下有两个命令strace 和ltrace 可以查看一个应用程序在运行过程中所发起的系统调用,这对作为标准应用程序的Nginx自然同样可用。由于这两个命令大同小异,所以下面就仅以strace为例做简单介绍,大致了解一些它能帮助我们获取哪些有用的调试信息。关于strace/ltrace以及后面介绍的pstack更多的用法请参考对应的Man手册。

从strace的Man手册可以看到几个有用的选项。

-p pid:通过进程号来指定被跟踪的进程。

-o filename:将跟踪信息输出到指定文件。

-f:跟踪其通过frok调用产生的子进程。

-t:输出每一个系统调用的发起时间。

-T:输出每一个系统调用消耗的时间。

首先利用ps命令查看到系统当前存在的Nginx进程,然后用strace命令的-p选项跟踪Nginx工作进程,如图2-2所示。

 

nginx 流式输出 nginx输出调试_Nginx

为了简化操作,我这里只设定了一个工作进程,该工作进程会停顿在epoll_wait系统调用上,这是合理的,因为在没有客户端请求时,Nginx就阻塞于此(除非是在争用accept_mutex锁),在另一终端执行wget命令向Nginx发出http请求后,再来看strace的输出,如图2-3所示。

 [root@localhost ~]# wget 127.0.0.1 

 

nginx 流式输出 nginx输出调试_Nginx_02

通过strace的输出可以看到Nginx工作进程在处理一次客户端请求过程中发起的所有系统调用。我这里测试请求的html非常简单,没有附带css、js、jpg等文件,所以看到的输出也比较简单。strace输出的每一行记录一次系统调用,等号左边是系统调用名以及调用参数,等号右边是该系统调用的返回值。逐一注释如下所述。

1. epoll_wait返回值为1,表示有1个描述符存在可读/写事件,这里当然是可读事件。

2. accept4接受该请求,返回的数字3表示socket的文件描述符。

3. epoll_ctl把accept4建立的socket套接字(注意参数3)加入到事件监听机制里。

4. recv从发生可读事件的socket文件描述符内读取数据,读取的数据存在第二个参数内,读取了107个字节。

5. stat64判断客户端请求的html文件是否存在,返回值为0表示存在。

6. open/fstat64打开并获取文件状态信息。open文件返回的文件描述符为9,后面几个系统调用都用到这个值。

7. writev把响应头通过文件描述符3代表的socket套接字发给客户端。

8. sendfile64把文件描述符9代表的响应体通过文件描述符3代表的socket套接字发给客户端。

9. 再往文件描述符4代表的日志文件内write一条日志信息。

10. recv看客户端是否还发了其他待处理的请求/信息。

11. 最后关闭文件描述符3代表的socket套接字。

由于strace能够提供Nginx执行过程中的这些内部信息,所以在出现一些奇怪现象时,比如Nginx启动失败、响应的文件数据和预期不一致、莫名其妙的Segment Fault段错误、存在性能瓶颈(利用-T选项跟踪各个函数的消耗时间),利用strace也许能提供一些相关帮助。最后,要退出strace跟踪,按ctrl+c即可。

命令strace跟踪的是系统调用,对于Nginx本身的函数调用关系无法给出更为明朗的信息,如果我们发现Nginx当前运行不正常,想知道Nginx当前内部到底在执行什么函数,那么命令pstack就是一个非常方便实用的工具。

pstack的使用也非常简单,后面跟进程ID即可。比如在无客户端请求的情况下,Nginx阻塞在epoll_wait系统调用处,此时利用pstack查看到的Nginx函数调用堆栈关系,如图2-4所示。

 

nginx 流式输出 nginx输出调试_nginx_03

从main()函数到epoll_wait()函数的调用关系一目了然,和在gdb内看到的堆栈信息一模一样,其实因为命令pstack本身也就是一个利用gdb实现的shellShell脚本,关于这点,感兴趣的读者可以自己看下pstack对应的脚本程序。