Nginx搭建及优化

Nginx搭建及优化

Nginx服务基础

概述

  • 一款高新能、轻量级Web服务软件

  • 稳定性高

  • 系统资源消耗低

  • 对HTTP并发连接的处理能力高

  • 单台物理服务器可支持30 000~50 000个并发请求。

Nginx和Apache的优缺点比较

nginx相对于apache的优点∶

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

apache相对于nginx的优点∶

  • Rewrite比nginx的rewrite强大 模块多,基本想到的都可以找到少bug, nginx的bug相对较超稳定

存在的理由:一般来说,需要性能的web服务,用nginx。若不需要性能只求稳定,就选用apache。 Nginx处理动态请求是弱项,一般动态请求要Apache去做Nginx只适合处理静态网页或反向代理。

编译安装Nginx服务

1.关闭防火墙,将安装Nginx所需要的软件包传到任意目录

[root@localhost opt]# systemctl stop firewalld.service
[root@localhost opt]# systemctl disable firewalld.service
[root@localhost opt]# setenforce 0

2.安装相关依赖包

[root@localhost opt]# yum -y install pcre-devel zlib-devel gcc gcc-c++ make

3.创建运行用户和组一以便提供相应的库和头文件

[root@localhost opt]# useradd -M -s /sbin/nologin nginx
#不建立家目录不允许用户登录

4.压缩数据包并编译安装Nginx

[root@localhost opt]# tar -zxvf nginx-1.12.2.tar.gz   #解压数据包
[root@localhost opt]# cd nginx-1.12.2/ #切换到安装包目录下
[root@localhost nginx-1.12.2]# ./configure \  #配置
> --prefix=/usr/local/nginx \    #暗转路径
> --user=nginx \                 #指定用户名
> --group=nginx \                #指定组名
> --with-http_stub_status_module #启用此模块支持状态统计

[root@localhost nginx-1.12.2]# make -j2 && make install #编译并安装

5.做软链接让系统识别命令并启动nginx

[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

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

nginx -t    #检查配置文件语法格式同样可以看到它的配置文件

nginx   #启动nginx服务

kill -3  <PID号>   #杀进程

添加Nginx系统服务

方法1:脚本控制服务

[root@localhost nginx-1.12.2]# cd /etc/init.d/

[root@localhost init.d]# vim nginx

方法2:将nginx命令加入服务

[root@localhost init.d]# cd /lib/systemd/system
[root@localhost system]# vim nginx.service

查看nginx版本信息

Nginx服务配置文件

nginx服务的主配置文件

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

配置文件分为一下块

  • 全局块:全局配置。对全局生效
  • events块:配置影响nginx服务器与用户的网络连接
  • http块:配置代理,缓存,日志定义绝大多数功能和第三方模块的配置
  • server块:配置虚拟主机的相关参数,一个http块可以有多个server块
  • lication块:用于配置匹配的url
  • upstream块:配置后端服务器具体地址,负载均衡配置不可或缺的部分
全局配置
#user  nobody; #运行用户默认为nobody
worker_processes  1;     #工作进程数量,一帮设置为和服务器cpu核数一样

#error_log  logs/error.log;   #错误日志文件的位置

#pid        logs/nginx.pid;   PID文件位置
I/O事件配置
events {
    use epoll;                 #使用 epoll 模型以提高性能,2.6 以上版本建议使用
    worker_connections  4096;   #每个进程处理4096个连接
}
  • 若工作进程数为 4,每个进程处理 4 096 个连接,则允许 Nginx 正常提供服务的连接数为(4*4096=16392),虽然说单台物理服务器可支持30 000~50 000个并发请求,但是具体还要看服务器硬件、网络带宽等物理条件的性 能表现,在生产环境中一般也就2-3万并发请求。
  • 如提高每个进程的连接数还需执行"ulimit -n 65535"命令临时修改本地每个进程可以同时打开的最大文件数。
  • 在Linux平台.上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
  • 可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。
  • epoll(socket描述符)是Linux内核]为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率

临时修改本地每个进程可以同时打开的最大文件数。

永久修改

[root@localhost ~]# vim /etc/security/limits.conf  #编辑内核配置文件

HTTP配置
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" ' 7

'"$http_user_agent" "$http_x_forwarded_for"'; 8

#access_log  logs/access.log  main;		#访问日志位置

sendfile        on;				#开启文件传输模式
#tcp_nopush     on;             #减少网络报文段的数量
#连接保持超时时间,单位是秒
#keepalive_timeout  0;
keepalive_timeout  65;

#gzip  on;			#gzip模块设置,设置是否开启gzip压缩输出

server {
        listen       80;					#监听地址及端口
        server_name  www.yxp.com;			#站点域名,可以有多个,用空格隔开

    #charset utf-8;						#网页的默认字符集

    #access_log  logs/host.access.log  main;		
    location / {						#根目录配置
        root   html;					#网站根目录的位置/usr/local/nginx/html
        index  index.html index.htm;	#默认首页文件名
    }

    #error_page  404              /404.html;

redirect server error pages to the static page /50x.html

    error_page   500 502 503 504  /50x.html;		#内部错误的反馈页面
    location = /50x.html {							#错误页面配置
        root   html;
    }
  }
}
日志格式设定∶
$remote_addr与$http x forwarded for用以记录客户端的ip地址;
$remote user∶ 用来记录客户端用户名称;
$time local∶ 用来记录访问时间与时区;
$request∶用来记录请求的url与http协议;
$status∶ 用来记录请求状态;成功是200, 
$body bytes sent ∶ 记录发送给客户端文件主体内容大小; 
$http referer∶ 用来记录从哪个页面链接访问过来的;
$http user agent∶记录客户浏览器的相关信息;

通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过Sremote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
location常见配置指令, root、alias、proxy_ pass 
root(根路径配置)∶ 请求root /var/www/html
请求www.kgc.com/test/1.html,会返回文件/var/www/html/test/1.html
alias(别名配置):alias/var/www/html
请求www.kgc.com/test/1.html,会返回文件/var/www/html/1.html
proxy_pass(反向代理配置)
访问状态统计配置
  • nginx 内置了 HTTP_STUB_STATUS 状态统计模块,用来反馈当前的 Web 访问情况, 配置编译参数时可添加--with-http_stub_status_module 来启用此模块支持,可以使用命令
/usr/local/sbin/nginx -v #查看已安装Nginx是否包含HTTP_STUB_STATUS模块
cat /opt/nginx-1.12.0/auto/options | grep YES #查看nginx已安装的所有模块
  1. 修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置(建议修改之前备份,首次不备份可以系统已将原始文件备份)

[root@localhost conf]#vim /usr/local/nginx/conf/nginx.conf  #编辑配置文件

[root@localhost conf]#systemctl restart nginx #重启服务

2.在网页中输入 192.168.239.10/status测试

Active connections: 1 #当前活动链接数 
server accepts handled requests 1 1 1 #表示已经处理的连接信息,三个数字一次表示已处理的连接数、成功的TCP握手次数、已处理的请求数 Reading: 0 Writing: 1 Waiting: 1

可curl -Ls http://192.168.239.10/status 结合awk来写shell脚本,如果链接数过高报警

#!/bin/bash
a=`curl -Ls http://192.168.239.10/status | awk 'NR==1{print $3}'`
if [ $a -gt 30000 ]
then
echo "连接数过高已达 $a"
fi
基于授权的访问控制

1.生成用户密码认证文件

[root@localhost conf]# yum install -y httpd-tools  #安装工具
[root@localhost conf]# htpasswd -c /usr/local/nginx/passwd.db geng    #指定用户密码
[root@localhost conf]# htpasswd  /usr/local/nginx/passwd.db wang      #第二次则不需要-c选项 -c选项为创建文件    

[root@localhost conf]#chown nginx /usr/local/nginx/passwd.db    
[root@localhost conf]#chmod 400 /usr/local/nginx/passwd.db

2.修改主配置文件

[root@localhost conf]#vim /usr/local/nginx/conf/nginx.conf  #编辑配置文件

3.重启服务范文测试

systemctl restart nginx

基于客户端的访问控制
  • 基于客户端的访问控制简介 基于客户端的访问控制是通过客户端 IP 地址,决定是否允许对页面访问。Nginx 基于 客户端的访问控制要比 Apache 简单,规则如下: 1)deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。 2)allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。 3)规则从上往下执行,如匹配则停止,不再往下匹配。

1.修改配置文件

[root@localhost conf]#vim /usr/local/nginx/conf/nginx.conf  #编辑配置文件

此时使用20终端网页浏览器访问可以看到访问被拒绝

在使用30进行访问可以看到可以登录

基于域名的Nginx虚拟主机

1.做ip与主机名的映射关系当然DNS域名解析也可以

[root@localhost nginx]# echo "192.168.239.10 www.kgc.com www.benet.com" >>/etc/hosts

2.为虚拟机整备网页文档

[root@localhost nginx]# mkdir -p /var/www/html/kgc

[root@localhost nginx]# mkdir -p /var/www/html/benet

[root@localhost nginx]# echo "<h1>www.kgc.com</h1>" > /var/www/html/kgc/index.html
[root@localhost nginx]# echo "<h1>www.benet.com</h1>" > /var/www/html/benet/index.html

3.修改nginx的配置文件配置两个server

[root@localhost conf]# vim nginx.conf #编辑配置文件

systemctl restart nginx.service  #重启服务

4.此时网页访问

http://www.kgc.com

http://www.benet.com

基于IP的nginx虚拟主机

1.添加临时IP地址

2.编辑配置文件

[root@localhost conf]# vim nginx.conf      #编辑配置文件

3.此时网页访问

http://192.168.239.10

http://192.168.239.15

基于端口的nginx虚拟主机

1.修改配置文件

[root@localhost conf]# vim nginx.conf      #编辑配置文件

 systemctl restart nginx   #重启服务

2.此时网页访问

http://192.168.239.10:666

http://192.168.239.10:888

posted @ 2022-05-03 23:28  GENGBO  阅读(108)  评论(0编辑  收藏  举报