YOLO813

Nginx源码编译安装及配置文件初步学习

    通过源码编译安装。

nginx.org  #官网地址
# 安装过程
wget http://nginx.org/download/nginx-1.18.0.tar.gz -P /usr/src
# tar文件用tar命令解压
tar -zxvf nginx-1.18.0.tar.gz

关于wget的-P参数,manual中的解释是

prefix,Set directory prefix to prefix

./configure

    源码安装三步曲,配置-编译-安装,和上一篇文章介绍python源码安装相同。我们进入到解压后的nginx目录下面,可以看到这个configure,其类似于windows系统上的exe,我们也可以使用./configure --help来查看帮助

    因为我的云服务器上已经安装了相关依赖,所以可以直接进行配置

./configure --prefix=/usr/local/nginx

    如果发现配置报错,可以看下错误,大概率是报依赖的错误,例如

error: the HTTP rewrite module requires the PCRE library

    如果为了省事,在配置之前可以一口气安装以下4个依赖,从左到右分别为C语言编译器,nginx重写功能,解压相关的依赖。

yum -y install gcc pcre-devel zlib zlib-devel

    依赖安装完成之后,centos下可以使用如下命令查看版本,此时再进行配置就没关系了。

rpm -q pcre-devel 
>>>pcre-devel-8.42-4.el8.x86_64

    配置完成之后可能会发现OpenSSL library is not used,这个是专用于将域名从http跳转到https加密必须要使用的库。

     配置完成之后该目录下会多出一个文件Makefile和一个文件夹objs。

make

    make将源码进行编译,生成可执行程序。

    make之前的obj目录

    make之后

make install

    make install,安装。

    我们可以看到安装完成之后在服务器上生成了很多文件,以下凡是prefix和path指定的是目录,而file则指定的是文件。

nginx path prefix # nginx安装目录
nginx binary file # nginx执行程序,二进制文件就是启动程序
nginx modules path # nginx模块存放目录
nginx configuration prefix # 配置文件存放目录
nginx configuration file # 配置文件
nginx pid file # nginx进程号
nginx error log file # 错误日志
nginx http access log file

# 使用二进制文件启动

/usr/local/nginx/sbin/nginx

    可以看到80端口(nginx默认监听端口)已经在监听了,如果此时Linux防火墙和安全组放行了端口号,通过浏览器访问云服务器的公网IP应该是已经可以看到Welcome to nginx!的经典画面了。(服务的三大要素:端口,监听地址,协议。)

    我们也可以在云服务器上通过elinks(文本界面浏览器)来访问公网IP,elinks的好处在于没有缓存!开发测试时都知道缓存有多难受!我的服务器版本是centos8

cat /proc/version
Linux version 4.18.0-147.5.1.el8_1.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 8.3.1 20190507 (Red Hat 8.3.1-4) (GCC)) #1 SMP Wed Feb 5 02:00:39 UTC 2020

    需要通过PowerTools仓库,先查看下自己的拥有的仓库

yum config-manager --enable PowerTools# 加入PowerTools仓库
yum install elinks lynx # 再安装

    此时在服务器上输入elinks,或者直接 elinks IP,可以看见相关内容

    初步了解Nginx全局配置文件nginx.conf(PS:因为我使用Xshell连接的服务器,上传下载蛮不方便,于是装了lrzsz,就可以愉快的使用rz和sz快捷的上传和下载文件,以后再次安装这个包,我们也许不记得包名,但是可以使用yum search rz来对包名进行搜索)。

在网上找了张释义图,蛮形象的

    回归正文-配置文件每行释义

#启动nginx子进程的默认用户是谁?
#user  nobody;

    查看80端口,发现有两个nginx,其中上面的是父进程,父进程肯定是由root用户启动的。

#子进程数有几个?一般修改为核数
# 工作进程是单进程多线程的
# 这里定义的是工作进程数量
worker_processes  4;

    修改用户(用户名不是乱加的,须是在/etc/passwd文件下的用户)和子进程数之后,再次启动,使用ps命令查看如下所示:

其中root用户一行STAT为Ss,S表示为休眠状态,s表示其是进程的领导者(在它之下有子进程)。

#全局错误日志的位置及日志格式
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#主进程号
#pid logs/nginx.pid;
cat logs/nginx.pid
=>15427

可以看到正好与上面ps命令查看到的root用户启动的主进程ID15427相同,写到这里又不得不多写一句,想到之前看过的一篇文章,介绍Unix/Linux 的基本哲学之一,“一切皆是文件”,可以看到我们所谓的进程ID与普通文件的查看方式也没什么不同。

events {
  #每个工作进程下的最大线程数
    worker_connections  1024;
}

从上,我们可以知道最大并发数即为最大线程数*工作进程数量。

http服务器设置

#http服务器设置,可以嵌套多个server
http {....}

在http服务器配置中的参数详解如下:

#设定mime类型,类型由mime.type文件定义
#所有http都走这个模型
include  mime.types;
# 日志记录格式
#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#'$status $body_bytes_sent "$http_referer" '
#'"$http_user_agent" "$http_x_forwarded_for"';
#全局访问日志路径
#access_log  logs/access.log  main

此时,我们其实可以看下access.log,大致是这么个东西

从左至右的顺序正式我们log_format中定义的数据格式。

    remote_addr和http_x_forwarded_for用以记录客户端的ip地址;

    remote_user:用于记录客户端用户名称;

    time_local:用于记录访问时间和时区;

    request:用于记录请求的url和http协议;

    status:记录请求状态

    body_bytes_sent:发送给客户端文件的html主体内容大小,在前端页面中对应Response Headers中的Content-Length

    http_referer:记录上一个页面访问链接

    http_user_agent:客户浏览器的相关信息

#指定nginx是否调用sendfile函数(zero copy方式)来输出文件
#对于普通应用,必须设为on
sendfile on;
#允许或禁止socke的TCP_CORK的选项,此选项仅在使用sendfile时使用
#默认开启
#tcp_nopush  on;

#长连接超时时间
#keepalive_timeout  0;
keepalive_timeout  65;
#gzip  on;

    如何配置server?我们是通过server来发布一个网站,一个server就可以发布一个网站,server又被称作虚拟主机。

server {
  #虚拟主机使用的端口
  listen       80;
  #虚拟主机的域名是什么
  server_name  localhost;
  #虚拟主机支持的字符集
  #charset koi8-r;
  #虚拟主机的访问日志路径
  #access_log  logs/host.access.log  main;
  #定位web的根路径,即用户访问你域名时所访问的内容
  location / {
    #根目录路径下面的html文件夹
    #这也可以解释为什么启动nginx之后用户可以看到欢迎页面,即存在根目录下的html目录下
    root   html;
    #索引页
    index  index.html index.htm;
  }
  #grep -r "404"
  #error_page  404              /404.html;
  # redirect server error pages to the static page /50x.html
  #根据错误码返回对应的页面
  #如果是以下50*的错误状态,那么就让用户去访问/50x.html
  error_page   500 502 503 504  /50x.html;
  #当用户去访问/50x.html页面时,定义页面路径
  location = /50x.html {
    root   html;
  }
}