您现在的位置是:首页 >技术交流 >Nginx网站服务网站首页技术交流

Nginx网站服务

Yuzhang2046 2023-05-21 04:00:02
简介Nginx网站服务

Nginx概述

Nginx 是开源、高性能、高可靠、低资源消耗的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。对HTTP并发连接的处理能力高,单台物理服务器可支持30000~50000个并发请求

Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适用于多处理器环境,因此,在一个apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器

Nginx和Apache的差异

Apache: 创建多个进程或线程,而每个进程或线程都会为其分配cpu和内存(线程要比进程小的多,所以worker支持比perfork高的并发),并发过大会榨干服务器资源。

Nginx: 采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx 支持更高的并发

1)nginx相对于apache的优点∶

  • 轻量级,同样起web服务,比apache占用更少的内存及资源
  • 抗并发,nginx处理请求是异步非阻塞的,而apache是阻塞型的在高并发下,nginx能保持低资源低消耗高性能
  • 高度模块化的设计,编写模块相对简
  • 支持热部署,平滑升级

2)apache相对于nginx的优点∶

  • Rewrite比nginx的rewrite强大 (rewrite的主要功能就是实现统一资源定位符URL的跳转)
  • 模块多,基本想到的都可以找到
  • 少bug, nginx的bug相对较多
  • 超稳定
  • Nginx处理动态请求是弱项,动态请求要Apache去做。

总结:一般来说,需要性能的web服务,用Nginx. 如果不需要性能只求稳定,那就Apache。Nginx处理动态请求是弱项,一般动态请求要Apache去做,Nginx只适处理静态网页或反向代理

Nginx的进程

Apache和Nginx的默认端口都是80,如果其中一个已经启动了,那么再启动另一个会报错。如果想要同时使用,可以修改其中一个的端口号

Nginx有两个进程

1)master process:主进程(守护进程),用来管理工作进程

2)worker process:工作进程,用来处理用户的请求

编译安装nginx服务

1 关闭防火墙,将nginx所需压缩包上传到/opt目录下

 [root@zy2 ~]# systemctl stop firewalld
 [root@zy2 ~]# setenforce 0
 [root@zy2 ~]# ls /opt/
 nginx-1.18.0.tar.gz  rh

2 安装依赖包

[root@zy2 ~]# yum install -y pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
 ​
 #各程序作用解释如下:
  gcc                     #C语言的编译器
  gcc-c++                 #C++的编译器
  make                    #源代码编译器(源代码转换成二进制文件)
  pcre-devel              #perl的接口开发包,提供正则表达式
  zlib-devel              #提供压缩功能

3 创建运行用户和组,便于管理

[root@zy2 ~]# useradd -M -s /sbin/nologin nginx
#创建Nginx程序用户,不生成家目录,不允许登录系统;Nginx服务程序默认nobody身份运行,建议为期创建专门的用户账号,以便更准确的控制其访问权限,

4 解压软件包,编译安装nginx

 [root@zy2 ~]# cd /opt
 [root@zy2 opt]# ls
 nginx-1.18.0.tar.gz  rh
 [root@zy2 opt]# tar xf nginx-1.18.0.tar.gz
 [root@zy2 opt]# ls
 nginx-1.18.0  nginx-1.18.0.tar.gz  rh
 ​
 #切换到源码目录,运行configure脚本,指定安装路径和安装模块等。
 [root@zy2 opt]# cd nginx-1.18.0/
 [root@zy2 nginx-1.18.0]# ./configure 
 --prefix=/usr/local/nginx        #指定nginx的安装路径
 --user=nginx                     #指定用户名(运行用户)
 --group=nginx                    #指定组名
 --with-http_stub_status_module    #启用http_stub_status_module模块以支持状态统计
 ​
 #开2核同时编译,之后安装
 [root@zy2 nginx-1.18.0]# make -j2 && make install

5 将nginx的操作指令放入环境变量PATH的目录下

[root@zy2 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/    #让系统识别nginx的操作指令

6 检查、启动、重启、停止nginx服务

#检查配置文件是否配置正确
 [root@zy2 ~]# nginx -t
 nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
 nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
 ​
 #启动nginx服务
 [root@zy2 ~]# nginx      

多种方式查看nginx的PID号

logs目录下的文件nginx.pid,存放nginx的工作进程号。

nginx有两个进程:主进程和工作进程

[root@zy2 ~]# pgrep nginx -l
54266 nginx
55351 nginx
[root@zy2 ~]# cat /usr/local/nginx/logs/nginx.pid 
54266
[root@zy2 ~]# netstat -nltp | grep nginx  
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      54266/nginx: master 
[root@zy2 ~]# ss -nltp | grep nginx  
LISTEN     0      128          *:80                       *:*                   users:(("nginx",pid=55351,fd=6),("nginx",pid=54266,fd=6))
[root@zy2 ~]# lsof -i :80
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   54266  root    6u  IPv4 142567      0t0  TCP *:http (LISTEN)
nginx   55351 nginx    6u  IPv4 142567      0t0  TCP *:http (LISTEN)

停止nginx服务

注意:nginx有主进程和工作进程,一定要杀死主进程(即父进程)

[root@zy2 ~]# kill -3 54266    #通过主进程的PID号杀死nginx进程
[root@zy2 ~]# netstat -ntap | grep nginx   #此时已查不到进程
 ​
 #杀死nginx进程的多种方式
 kill -3 <PID号>             #"kill -3"杀死进程时可以记录事故现场的信息(打印进程各个线程的堆栈信息)
 kill -s QUIT <PID号>         #-s 指定信号
 killall -3 nginx
 killall -3 QUIT <PID号>

重载nginx服务

[root@zy2 ~]# nginx   #一般用绝对路径启动:/usr/local/nginx/sbin/nginx
[root@zy2 ~]# netstat -natp |grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      56272/nginx: master 
[root@zy2 ~]# cat /usr/local/nginx/logs/nginx.pid 
56272
[root@zy2 ~]# kill -1 56272
[root@zy2 ~]# netstat -natp |grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      56272/nginx: master 


 ​
 ​#重载nginx服务的多种方式
 kill -1 <PID号>
 kill -s HUP <PID号>
 killall -1 nginx
 killall -s HUP <PID号>

日志分割(移走原有日志,重新打开日志文件):kill -USR1 <PID号>

 [root@zy2 ~]# cd /usr/local/nginx/logs   #切换到日志目录
 [root@zy2 logs]# ls
 access.log  error.log  nginx.pid
 [root@zy2 logs]# mkdir log.bak
 [root@zy2 logs]# mv *.log log.bak      #将原有日志移走
 [root@zy2 logs]# ls
 log.bak  nginx.pid
 [root@zy2 logs]# kill -USR1 56272       #重新生成日志文件
 [root@zy2 logs]# ls
 access.log  error.log  log.bak  nginx.pid

升级nginx服务

 #平滑升级:
 kill -USR2 <PID号>
 ​
 #新版本升级:
 #先进入官网下载最新版本的Nginx 然后解压
 tar xf nginx-1.22.0.tar.gz       #1.22.0代表新版本号
 cd nginx-1.22.0
 ./configure 
 --prefix=/usr/local/nginx 
 --user=nginx 
 --group=nginx 
 --with-http_stub_status_module 
 --with-http_ssl_module
 ​
 #重新编译:
 make -j2    #注意:不要make install,此时会在/nginx-1.22.0/objs/生成nginx二进制文件
 mv /usr/local/nginx/sbin/nginx  /usr/local/nginx/sbin/nginx_old  #备份旧文件,方便回滚
 cp objs/nginx /usr/local/nginx/sbin/nginx             #将新的运行文件放入安装的运行目录
 make upgrade     #编译升级或者 kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
 #或者先 killall -3 nginx ,再 /usr/local/nginx/sbin/nginx   开启新的nginx

最后nginx -v 检查nginx版本是否为新版本

添加nginx系统服务,通过systemctl 来管理nginx

方法一:将nginx命令加入服务,编写/lib/systemd/system/nginx.service文件

 [root@zy2 ~]# cd /usr/lib/systemd/system/
 [root@zy2 system]# vim nginx.service
 [Unit]
 Description=nginx    #描述服务
 After=network.target   #表示依赖于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
 ​
 [root@zy2 system]# systemctl daemon-reload      //重载配置
 [root@zy2 system]# netstat -natp |grep nginx
 tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      
 57716/nginx: master 
 [root@zy2 system]# kill -3 57716
 [root@zy2 system]# netstat -natp |grep nginx
 [root@zy2 system]# systemctl start nginx
 [root@zy2 system]# netstat -natp |grep nginx
 tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      
 57899/nginx: master
 [root@zy2 system]# systemctl stop  nginx
 [root@zy2 system]# netstat -natp |grep nginx

 ​
 #之后可以使用systemctl start|stop|restart|enable nginx 来管理服务

方法二:在 /etc/init.d/中创建脚本,再用chkconfig加入到chkconfig列表中,用service nginx来管理nginx

 [root@zy2 ~]# vim /etc/init.d/nginx
 #!/bin/bash
 #chkconfig: 35 20 99    #35:在第三第五个运行级别中开机自动启动   20:第二十个启动 
99:第九十九个关闭   '-'表示在所有运行级别在不做开机自启动
 #description:This is nginx control script
 RUN="/usr/local/nginx/sbin/nginx"
 PID=`cat /usr/local/nginx/logs/nginx.pid`
 case "$1" in
 start)
   $RUN
 ;;
 stop)
   kill -3 $PID
 ;;
 restart)
   kill -3 $PID          #或者 $0 stop  #$0表示脚本本身 
   $RUN                  #$0 start
 ;;
 reload)
   kill -1 $PID
 ;;
 status)
   if ss -lntp | grep nginx &> /dev/null
      then
      echo 'nginx is running!'  #注意:这里有‘!’,用双引号会被视为取反,所以只能用单引号
     else
      echo 'nginx is not running!'
   fi    
 ;;
 *)
   echo "正确用法为:$0 {start|stop|restart|reload|status}"
   exit 1    #返回值非0
 esac
 exit 0
 ​
 [root@zy2 ~]# chomod +x nginx          //给nginx赋予权限
 [root@zy2 ~]# chkconfig --add nginx    //将nginx加入chkconfig
 [root@zy2 ~]# chkconfig --list         //查看chkconfig列表
 ​
 [root@zy2 ~]# service nginx start       //开启服务,或 systemctl start nginx 
 [root@zy2 ~]# ss -natp | grep nginx     //查看服务

Nginx服务的主配置文件

主配置文件位置:/usr/local/nginx/conf/nginx.conf 

/usr/local/nginx/conf/ 目录下:nginx.conf 是主配置文件;nginx.conf.default 是主配置文件的备份文件

主配置文件中有六个主要模块:

1、全局块:全局配置,对全局生效。

2、events块:配置影响Nginx服务器与用户的网络连接。

3、http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。

4、server块:配置虚拟主机的相关参数,一个http块中可以有多个server 块。每个 server 块就相当于一个虚拟主机。。

5、location块:用于配置匹配的url,一个server块中可以有多个location块。

6、upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分

全局块(全局配置)

就是配置文件从头开始到 events 块之间的内容,主要设置的是影响nginx服务器整体运行的配置指令。比如 worker_process,值越大,可以支持的并发处理量也越多,但是还是和服务器的硬件相关。

vim /usr/local/nginx/conf/nginx.conf

 #user  nobody;                  //运行用户,若编译时未指定则默认为nobody,若编译指定
                                   了用户则会写到二进制程序里变成默认配置。此前编译时
                                   指定了"--user=nginx",所以现在二进制程序中的运行
                                   用户为nginx
 worker_processes  1;            //工作进程数量,一般设置为和CPU核数一样,所以也可以
                                    设置为auto,让nginx自动根据cpu数量进行设置
 #error_log  logs/error.log;     //错误日志文件的位置
 #pid  logs/nginx.pid;           //PID文件的位置

events块( I/O 事件配置)

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。

 events  {
         use epoll;    //使用epoll模型。2.6及以上版本的系统内核,建议使用epo11模型以
                         提高性能,实现I/O多路复用,异步非阻塞
         worker_connections  4096;  //每个工作进程处理4096个连接。默认值为1024。
                                      一般设置为2的次方
 }

#如提高每个进程的连接数还需执行“ulimit -n 65535”命令临时修改本地每个进程可以同时打开的最大
文件数。
#在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打
开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是个
文件句柄)。
#可使用"ulimit -a"命令查看系统允许当前用户进程打开的文件数限制
#epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强
版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

查看Nginx支持的最大并发量(软件支持、系统支持、CPU性能):

1.软件配置支持多少并发量,由主配置文件nginx.conf决定:理论上支持的并发量=工作进程数量×每个工作进程处理的连接数

2.系统会限制本地每个用户进程可以同时打开的最大文件数量(默认连接数最大1024),即系统会限制每个进程的连接数

使用"ulimit -a"或 '"ulimit -n"可查看系统允许当前用户进程打开的文件数限制

  • “ulimit -n 最大文件数”命令可临时修改本地每个用户进程可以同时打开的最大文件数。
  • vim /etc/security/limits.conf,编辑该文件可永久修改

 修改完需要重启系统

注:#第一列为用户和组  #第二列为磁盘限额,软硬限制。hard表示硬限制。  #第三列为项目。nofile表示最大可打开文件数量。  #第四列为相应项目的数量

3.实际工作中还要进行压测,测试CPU性能能否支持这个最大并发量

http块(HTTP 配置)

http块:包括 http 全局块,以及多个 server 块。

http {
   ##文件扩展名与文件类型映射表
   include  mime.types;
   ##默认文件类型
   default_type  application/octet-stream;
   ##日志格式设定
   #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
   #      '$status $body_bytes_sent "$http_referer"
   #     '"$http_user_agent" "S$http_x_forwarded_for"' ;
   ##访问日志位置
   #access_log logs/access.1og main;
   ##开启文件传输模式
   sendfile  on;
   ##减少网络报文段的数量
   #tcp_nopush  on;
   ##连接保持超时时间,单位是秒
   #keepalive_timeout 0;
   keepalive_timeout 65;
   ##gzip模块设置,设置是否开启gzip压缩输出
   #gzip  on;
   

##Web服务的监听配置
   server {
       ##监听地址及端口
       listen 80;
       ##站点域名,可以有多个,用空格隔开
       server_name www.yuji.com;
       ##网页的默认字符集
       charset utf-8;
       ##根目录配置
       location / {
           ##网站根目录的位置/usr/1ocal/nginx/html
           root html ;
           ##默认首页文件名
           index index.html index.php;
       }
       ##内部错误的反馈页面
       error_page 500 502 503 504 /50x.html;
       ##错误页面配置
       location = /50x.html {
            root html ;
            }
       }
   }

日志格式设定:  $remote_addr与$http_x_forwarded_for 用以记录客户端的ip地址。  $remote_addr:记录上一个请求消息发送端的IP(代理服务器的IP)。  $http_x_forwarded_for :会记录所有经过的服务器的IP地址。  $remote_user:用来记录客户端用户名称。  $time_local:用来记录访问时间与时区。  $request:用来记录请求的url与http协议。  $status:用来记录请求状态;成功是200。  $body_bytes_sent:记录发送给客户端文件主体内容大小。  $http_referer:用来记录从哪个页面链接访问过来的。  $http_user_agent: 记录客户浏览器的相关信息。  ​  通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

访问状态统计配置

1.查看nginx的安装模块,是否包含 HTTP_STUB_STATUS 模块

先使用命令 /usr/local/nginx/sbin/nginx -V 查看已安装的nginx是否包含 HTTP_STUB_STATUS 模块

 nginx -v    #查看nginx的版本。此前已将nginx的可执行文件放入PATH的目录中,所以可以直接使用nginx命令
 ​
 nginx -V    #查看nginx的版本,以及编译安装时的配置参数
 ​
 cat /opt/nginx-1.12.0/auto/options   #查看nginx已安装和未安装的模块,with表示已安装,without表示未安装
 ​
 cat /opt/nginx-1.12.0/auto/options | grep "YES"   #查看nginx已安装的所有模块

查看 HTTP_STUB_STATUS 模块是否已安装:cat /opt/nginx-1.12.2/auto/options | grep "HTTP_STUB_STATUS"

2.修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置

 [root@zy2 ~]# cd /usr/local/nginx/conf
 [root@zy2 conf]# cp nginx.conf nginx.conf.bak    //备份原配置文件
 [root@zy2 conf]# vim nginx.conf    //编辑配置文件
 ..........
 http {
 ..........
        server {
               listen   80;
               server_name   www.kgc.com;
               charset   utf-8;
               location / {
                       root   html;
                       index   index.html   index.php;
               }
               ##添加 stub_status 配置
               location / status {         #访问位置为/status
                       stub_status   on;   #打开状态统计功能            
                       access_log   off;   #关闭此位置的日志记录
               }
        }
 }

3. 重启服务,访问测试

 [root@zy2 conf]# nginx -t
 nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
 nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
 [root@zy2 conf]# systemctl restart nginx

浏览器访问:192.168.126.22/status

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。