源码编译安装Nginx
目录nginx 是一款高性能,轻量级web 服务软件
Nginx | Apache |
---|---|
基于web的服务器 | 基于流程的服务器 |
所有请求都由一个线程处理 | 单个线程处理单个请求 |
避免子进程的概念 | 基于子进程 |
内存消耗和连接方面更好 | 内存消耗和连接方面一般 |
性能和可伸缩性不依赖与硬件 | 依赖于CPU和内存等硬件 |
支持热部署 | 不支持热部署 |
对于静态文件处理效率更高 | 相对一般 |
方向代理方面具有明显优势 | 相对一般 |
systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i '7 s/enforcing/disabled/' /etc/selinux/config cd /opt/ ls nginx-1.12.0.tar.gz
yum -y install pcre-devel zlib-devel gcc gcc-c++ make useradd -M -s /sbin/nologin nginx #nginx服务默认以nobody身份运行,创建专门用户账号,以便更准确的控制权限
cd /opt/ tar zxvf nginx-1.12.0.tar.gz cd nginx-1.12.0/ ls tree -CL 1 #树状显示当前目录 1 层结构 #tree 命令可以下载 tree-1.6.0-10.el7.x86_64 包
目录/文件 | 解释 |
---|---|
auto | 存放了各个功能的脚本,configure 脚本会引用auto目录下的脚本文件来干活 |
src | 源码存放目录 |
conf | 配置示例文件 |
contrib | 提供了vim辅助工具,可以高亮nginx语法 |
html | 网页文件,一个是nginx 默认欢迎页面index.html, 一个是500错误重定向文件50x.html |
man | 存放nginx帮助文件 |
configure文件 | 脚本文件,编译前生成中间文件 |
CHANGES | 显示每一个版本中提供了哪些特性和bugfix |
CHANGES.ru | 俄语版本CHANGES |
cd /opt/nginx-1.12.0 ./configure --help #查看nginx 有哪些模块,以及参数
cd /opt/nginx-1.12.0 ./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_stub_status_module make && make install ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ #让系统可以识别nginx指令
tree -CL 1
目录 | 作用 |
---|---|
client_body_temp | 此目录的作用是,客户端POST一个文件,长度超过了nginx缓冲区的大小,把文件临时暂存到此目录下,有可能是部分内容,也有可能是全部内容。 |
conf | 配置文件的目录 |
fastcgi_temp | FastCGI临时数据目录。 编译安装时,使用--http-fastcgi-temp-path 指定此目录的路径、名称。 配置文件中可有使用fastcgi_temp_path 指定此目录的路径、名称和使用几级子目录。 |
html | 默认解析的静态文件目录(站点目录) |
logs | 日志目录 |
proxy_temp | 从代理服务器接收到数据的临时文件存放的目录。 |
sbin | 命令目录 |
scgi_temp | 从SCGI服务器接收到数据的临时文件存放的目录。 |
uwsgi_temp | 从uwsgi服务器接收到数据的临时文件存放的目录。 |
#查看帮助信息 /usr/local/nginx/sbin/nginx -h #启动nginx nginx #停止nginx 服务 nginx -s stop #优雅的停止nginx 服务(处理完所有请求后在停止服务) nginx -s quit #重新加载配置文件 nginx -s reload #重新启动。 nginx -s reopen #重新打开日志文件 kill -USR1 pid号 #nginx 访问日志文件在nginx工作目录的logs目录下。如果目录下的access.log和error.log 文件 被移走或删除改名,在不重启的情况下,访问nginx 时,nginx 不会自动创建访问日志。 #检查配置文件语法 nginx -t #查看nginx信息(可以查看到版本号,模块信息) nginx -V #指定配置文件 nginx -c filename #设置前缀路径 nginx -p prefix #设置配置文件外的全局指令 nginx -g directives
使用kill 命令加信号控制nginx
使用 kill -l 查看支持的信号
#查看nginx pid 号(我的安装目录是/usr/lcoal/nginx) cat /usr/local/nginx/logs/nginx.pid #停止 kill -3 pid号 kill -s QUIT pid号 killall -3 nginx killall -s QUIT pid号 #重载 kill -1 pid号 kill -s HUP pid号 killall -1 nginx killall -s HUP nginx #日志分割,重新打开日志 kill -USR1 pid号 #平滑升级 kill -USR2 pid号
nginx -V
#先把包传到/opt/ 目录下然后解压安装 cd /opt tar -zxvf nginx-1.12.2.tar.gz ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module make mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old cp objs/nginx /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx make upgrade #或者 kill -USR2 `cat /usr/local/nginx/logs/nginx.pid` nginx -V
如果使用免交互,要注意有变量,不可以让变量被替换
方法一:
vim /etc/init.d/nginx #!/bin/bash #chkconfig: 35 99 20 COM="/usr/local/nginx/sbin/nginx" PID="/usr/local/nginx/logs/nginx.pid" case "$1" in start) $COM ;; stop) kill -s QUIT $(cat $PID) ;; restart) $0 stop $0 start ;; reload) kill -s HUP $(cat $PID) ;; *) echo "Usage: $0 {start|stop|restart|reload}" exit 1 esac exit 0 chmod +x /etc/init.d/nginx chkconfig --add nginx # 添加为系统服务,可以被service 管理 systemctl daemon-reload #让服务配置生效,可以使用systemctl 管理
方法二:
如果使用免交互,要注意有变量,不可以让变量被替换
rm -rf /etc/init.d/nginx vim /lib/systemd/system/nginx.service #目录 /lib/systemd/system/ 存放systemctl 管理的服务文件 [Unit] Description=nginx After=network.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target chmod 754 /lib/systemd/system/nginx.service systemctl daemon-reload
firefox http://192.168.23.103
nginx: [emerg] getpwnam("nginx") failed
原因:
因为编译时指定了用户和组,但是又没有创建该用户,所以报错
解决:
方法一:创建 该用户
useradd —M -s /sbin/nologin nginx
方法二:修改配置文件,将user nobody启用
vim /usr/local/nginx/conf/nginx.conf user nobody #指定启动用户为 nobody nginx -s reload #重新加载配置文件
当nginx 启动时候报错
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
然后进入日志文件 /var/log/messages查看,发现以后如下信息
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
原因
这是因为nginx服务默认使用 80 端口。当端口被占用,就会出现以上报错
解决:
方法一:结束占用80端口的服务
使用 netstat -natp | grep :80
命令,查看80端口 被哪个服务占用
然后使用 kill pid号 ,结束占用80端口的进程
方法二:修改nginx服务端口
vim /usr/local/nginx/conf/nginx.conf listen 800;
#重启或者重新加载配置文件 systemctl reload nginx 或者 systemctl restart nginx netstat -natp | grep nginx