Nginx教程

源码安装Nginx

本文主要是介绍源码安装Nginx,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

源码编译安装Nginx

目录
  • 一 nginx 概述
    • 1.1 nginx的特点
    • 1.2 nginx和 Apache的区别
  • 二 : 源码安装nginx
    • 2.1 关闭防火墙,将安装nginx所需软件包传到/opt/目录下
    • 2.2安装依赖包,创建运行用户
    • 2.3 nginx 源码包解压目录介绍
    • 2.4编译安装nginx
    • 2.5 nginx 目录结构
    • 2.6 nginx 的命令
    • 2.7 nginx 新版本升级
      • 2.7.1 查看当前nginx 版本及使用模块
    • 2.7.2 升级nginx 版本
    • 2.8 编写nginx 启动脚本
    • 2.9 访问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 

image-20210812092853847


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 包

image-20210812095805815

image-20210812224829336

目录/文件 解释
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 有哪些模块,以及参数

image-20210812095258207


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指令

image-20210812094659326


2.5 nginx 目录结构

 tree -CL 1

image-20210812225041604


目录 作用
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

image-20210812203948896


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

image-20210812205726169


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 管理

image-20210812211634500

image-20210812212020894

image-20210812212128727


方法二:

如果使用免交互,要注意有变量,不可以让变量被替换

 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

image-20210812213014512

image-20210812221732607


2.9 访问nginx

 firefox http://192.168.23.103

image-20210812222506268



部分报错解决方法:

报错 一

nginx: [emerg] getpwnam("nginx") failed

image-20210812205149207


原因:

因为编译时指定了用户和组,但是又没有创建该用户,所以报错

解决:

方法一:创建 该用户

useradd —M -s /sbin/nologin  nginx 

方法二:修改配置文件,将user nobody启用

vim /usr/local/nginx/conf/nginx.conf
user nobody   #指定启动用户为 nobody

nginx -s reload  #重新加载配置文件

image-20210812205624418


报错二

当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)

image-20210812214707716


原因

这是因为nginx服务默认使用 80 端口。当端口被占用,就会出现以上报错

解决:

方法一:结束占用80端口的服务

使用 netstat -natp | grep :80 命令,查看80端口 被哪个服务占用

然后使用 kill pid号 ,结束占用80端口的进程


方法二:修改nginx服务端口

vim /usr/local/nginx/conf/nginx.conf
listen 800;

image-20210812222021515

#重启或者重新加载配置文件
systemctl reload nginx
或者
systemctl restart nginx

netstat  -natp | grep nginx

image-20210812222235964

这篇关于源码安装Nginx的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!