源码编译安装Nginx
目录一 nginx 概述
1.1 nginx的特点
nginx 是一款高性能,轻量级web 服务软件
- 稳定性高
- 系统资源消耗低
- 对HTTP并发连接的处理能力高,单台物理服务器可以支持30000-50000个并发请求
1.2 nginx和 Apache的区别
Nginx | Apache |
---|---|
基于web的服务器 | 基于流程的服务器 |
所有请求都由一个线程处理 | 单个线程处理单个请求 |
避免子进程的概念 | 基于子进程 |
内存消耗和连接方面更好 | 内存消耗和连接方面一般 |
性能和可伸缩性不依赖与硬件 | 依赖于CPU和内存等硬件 |
支持热部署 | 不支持热部署 |
对于静态文件处理效率更高 | 相对一般 |
方向代理方面具有明显优势 | 相对一般 |
二 : 源码安装nginx
2.1 关闭防火墙,将安装nginx所需软件包传到/opt/目录下
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
2.2安装依赖包,创建运行用户
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
#nginx服务默认以nobody身份运行,创建专门用户账号,以便更准确的控制权限
2.3 nginx 源码包解压目录介绍
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 |
2.4编译安装nginx
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指令
2.5 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服务器接收到数据的临时文件存放的目录。 |
2.6 nginx 的命令
#查看帮助信息
/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号
2.7 nginx 新版本升级
2.7.1 查看当前nginx 版本及使用模块
nginx -V
2.7.2 升级nginx 版本
#先把包传到/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
2.8 编写nginx 启动脚本
如果使用免交互,要注意有变量,不可以让变量被替换
方法一:
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
2.9 访问nginx
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