一:源码编译安装:
//参考:
步骤一 ): 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所示。
为了简化操作,我这里只设定了一个工作进程,该工作进程会停顿在epoll_wait系统调用上,这是合理的,因为在没有客户端请求时,Nginx就阻塞于此(除非是在争用accept_mutex锁),在另一终端执行wget命令向Nginx发出http请求后,再来看strace的输出,如图2-3所示。
[root@localhost ~]# wget 127.0.0.1
通过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所示。
从main()函数到epoll_wait()函数的调用关系一目了然,和在gdb内看到的堆栈信息一模一样,其实因为命令pstack本身也就是一个利用gdb实现的shellShell脚本,关于这点,感兴趣的读者可以自己看下pstack对应的脚本程序。