Nginx的搭建和优化

news2024/11/16 8:20:39

目录

  • 一. Nginx简介
    • 1.1 概述
    • 1.2 Nginx和Apache优缺点比较
  • 二. Nginx编译安装步骤
    • 1 关闭防火墙,安装依赖包
    • 2. 创建运行用户和组
    • 3. 编译安装 Nginx
    • 4. 做软连接并启动nginx
    • 5. 停止Nginx
    • 6. 添加nginx系统服务
      • 方法一:编写脚本
      • 方法二 将nginx命令加入服务
    • 7. 查看nginx版本信息
  • 三. 认识Nginx服务的主配置文件
    • 全局配置
    • I/O事件配置
    • http配置
    • 访问状态统计配置
    • 编写shell脚本来判断监控服务器的并发量

一. Nginx简介

1.1 概述

Nginx:

  • Nginx 是一个高性能的HTTP和反向代理服务器。
  • 是一款轻量级的高性能的web服务器/反向代理服务器/电子邮件(IMAP/POP3)代理服务器
  • 单台物理服务器可支持30 000~50 000个并发请求。

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

1.2 Nginx和Apache优缺点比较

(1) Nginx相对于Apache的优点

  • 轻量级,同样是web服务,比 Apache 占用更少的内存及资源
  • 高并发,Nginx 处理请求是异步非阻塞的,而Apache则是同步阻塞的,在高并发下 Nginx 能保持低资源低消耗高性能;高度模块化的设计
  • 编写模块相对简单;社区活跃,各种高性能模块出品迅速

(2) Apache相对于Nginx的优点:

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

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

二. Nginx编译安装步骤

1 关闭防火墙,安装依赖包

# 关闭防火墙
[root@666 opt]# systemctl stop firewalld
[root@666 opt]# systemctl disable firewalld
[root@666 opt]# setenforce 0

#安装依赖包
[root@666 opt]# yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

2. 创建运行用户和组

#(Nginx服务程序默认以 nobody 身份运行,建议为其创建专门的用户账户,以便更精准的控制其访问权限)
[root@666 opt]# useradd -M -s /sbin/nologin nginx

3. 编译安装 Nginx

#切换至opt目录,将下载好的压缩包进行解压
cd /opt
[root@666 opt]# tar xf nginx-1.24.0.tar.gz 

#切换至解压后的文件夹编译
[root@666 opt]# cd nginx-1.24.0/
[root@666 nginx-1.24.0]# ./configure \
> --prefix=/usr/local/nginx \ #指定用户的安装路径
> --user=nginx \              #指定用户名
> --group=nginx \		      #指定组名
> --with-http_stub_status_module #启用 http_stub_status_module模块以支持状态统计

#编译安装
make -j4 && make install

4. 做软连接并启动nginx

#做软连接,让系统识别nginx的操作命令
[root@666 nginx-1.24.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

#检查配置文件是否配置正确
[root@666 nginx-1.24.0]# nginx -t

#启动 nginx
[root@666 nginx-1.24.0]# nginx

#查看是否启动成功
[root@666 nginx-1.24.0]# netstat -lntp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      12777/nginx: master

在这里插入图片描述

5. 停止Nginx

# 查看 nginx 进程号
[root@666 nginx-1.24.0]# cat /usr/local/nginx/logs/nginx.pid 
12777

#直接杀死
[root@666 nginx-1.24.0]# kill -3 12777
#查看此时进程就已经杀死了
[root@666 nginx-1.24.0]# ss -natp | grep nginx

#一定要杀父进程,杀死子进程是没用的
kill <pid>       根据进程号杀死进程
killall <进程名>  根据进程名杀死进程
pkill <关键词>    根据关键词杀死进程

6. 添加nginx系统服务

方法一:编写脚本

[root@666 nginx-1.24.0]# vim /etc/init.d/nginx

#!/bin/bash
#chkconfig: 35 99 20
#des:Nginx Service Control Script

COM="/usr/local/nginx/sbin/nginx"
PID="/usr/local/nginx/logs/nginx.pid"

case "$1" in
start)
        netstat -lntp | grep nginx
        if [ $? -eq 0 ]
        then
                echo "Nginx 已经启动"
        else
                echo "Nginx 正在启动"
                $COM
        fi
;;

stop)
        kill -3 $(cat $PID)
;;

restart)
        $0 stop
        $0 start
;;

reload)
        kill -s HUP $(cat $PID)
;;

status)
        netstat -lntp | grep nginx
        if [ $? -eq 0 ]
        then
                echo "Nginx 服务已开启"
        else
                echo "Nginx 服务未开启"
        fi
;;

*)
	 echo "请输入正确格式:$0 (start | stop | restart | status | reload)"
esac

# 执行脚本
[root@666 init.d]# chmod +x /etc/init.d/nginx 
[root@666 init.d]# chkconfig --add nginx
[root@666 init.d]# chkconfig --list nginx

#启动服务
[root@666 init.d]# service  nginx start 

#关闭服务
[root@666 init.d]# service  nginx stop 

方法二 将nginx命令加入服务

[root@666 init.d]# cd /lib/systemd/system
[root@666 system]# vim nginx.serivce

#!/bin/bash

[Unit]
After=network.target

[Service]
Type=forking
PIDFile =/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true


[Install]
WantedBy=multi-user.target



##磁盘上的ngin服务更改,运行'systemctl daemon-reload'重新加载单元。
[root@666 system]# systemctl daemon-reload 
[root@666 system]# systemctl status nginx.service 

7. 查看nginx版本信息

[root@666 system]# nginx -v
nginx version: nginx/1.24.0

三. 认识Nginx服务的主配置文件

[root@666 system]# vim /usr/local/nginx/conf/nginx.conf

1、全局块:全局配置,对全局生效;
2、events块:配置影响Nginx服务器与用户的网络连接;
3、http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
4、server块:配置虚拟主机的相关参数,一个http 块中可以有多个server块;
5、location块:用于配置匹配的 uri;
6、upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。

全局配置

#user nobody;			      	#运行用户,若编译时未指定则默认为nobody
worker_processes 1;			  	#工作进程数量,一般设置为和cPu核数一样;设置为auto,nginx将会自己获取这个数值
#error_log logs/error.log;		#错误曰志文件的位置
#pid logs/ nginx.pid;			#PID 文件的位置
worker_rlinit_nofile 60000;		#设置所有worker进程最大可以打开的文件数,默认为1024

I/O事件配置

events {
	use epoll;					#使用epoll I/o模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
	worker_connections 60000 ;	#每个进程处理60000个连接
	multi_accept on;			#是否一次性将监听到的连接全接收进来,默认为off,关闭时一次接收一条连接
	accept_mutex on;			#默认为on,开启时表示以串行方式接入新连接,否则将通报给所有worker。这可能会浪费资源并产生不可预计的后果,例如惊群问题
}

epoll(socket描述符)是Linux内核]为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率

若工作进程数为 8,每个进程处理 4 096 个连接,则允许 Nginx 正常提供服务的连接数 已超过 3 万个(4 096×8=32 768),当然具体还要看服务器硬件、网络带宽等物理条件的性 能表现。

  1. 如提高每个进程的连接数还需执行"ulimit -n 65535"命令临时修改本地每个进程可以同时打开的最大文件数。

  2. 在Linux平台.上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。

  3. 可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。

#查看系统允许当前用户进程打开的文件数
[root@666 system]# ulimit -a  
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15603
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15603
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

#临时修改本地每个进程可以同时打开的最大文件数
[root@666 system]# ulimit -n 60000
#查看修改后的
[root@666 system]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15603
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 60000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15603
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

永久修改ulimit配置

[root@666 system]# vim /etc/security/limits.conf

在这里插入图片描述配置完重启即可生效

http配置

使用“http { }”界定标记,包括访问日志、HTTP 端口、网页目录、默认字符集、连接保 持,以及后面要讲到的虚拟 Web 主机、PHP 解析等一系列设置,其中大部分配置语句都包 含在子界定标记“server { }”内

http {
	##文件扩展名与文件类型映射表
	include mime. types;
	##默认文件类型
	default_type application/octet-stream;
	##日志格式设定
	#log_format main  	'Sremote addr - $remote user [$time local] "$request" '
	#					'$status $body_bytes_sent "$http referer" '
	#					'"$http user agent" "shttp x forwarded for"';
	##访问日志位置
	#access_log logs/access.logmain;
	##开启文件传输模式
	sendfile 		on; 
	#只在sendfile on时有效。调用tcp_cork方法,让数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵赛。默认为off。
	#tcp_nopush 	on;
	##连接保持超时时间,单位是秒
	#keepalive_timeout   0;
	keepalive_timeout   65;
	##gzip模块设置,设置是否开启gzip压缩输出
	#gzip  on;
	
	##web服务的监听配置
	server {
		##监听地址及端口
		listen 80;
		##站点域名,可以有多个,用空格隔开
		server_name www.kgc.com;
		##网页的默认字符集
		charset utf-8;
		##根目录配置
		location / {
			##网结根目录的位置/usr/local/nginx/html
			root html;
			##默认首页文件名
			index index.html index.php;
		}
		##内部错误的反馈页面
		error_page 500 502 503 504 /50x.html;
		##错误页面配置
		location = /50x.html {
			root html;
		}
	}
}

日志格式设定:
r e m o t e a d d r 与 remote_addr与 remoteaddrhttp_x_forwarded_for用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local:用来记录访问时间与时区;
$request:用来记录请求的uri与http协议;
$status:用来记录请求状态,成功是200;
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer:用来记录从哪个页面链接访问过来的;
h t t p u s e r a g e n t : 记录客户浏览器的相关信息 ; 通常 w e b 服务器放在反向代理的后面,这样就不能获取到客户的 I P 地址了,通过 http_user_agent:记录客户浏览器的相关信息; 通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过 httpuseragent:记录客户浏览器的相关信息;通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过remote _add拿到的IP地址是反向代理服务器的ip地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

$remote_addr记录的是上一层节点的地址
$http_x_forwarded_for 记录所有经过节点的地址

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/nginx/sbin/nginx –v 查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS 模块。

  • 操作步骤:

    1. 修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置(修改之前进行备份
#先拷贝一份配置文件
[root@localhost conf]#cp /usr/local/nginx/conf/nginx.conf nginx.conf.bak
 
#  修改 nginx.conf 配置文件
[root@localhost conf]#vim /usr/local/nginx/conf/nginx.conf
 
events {
    use epoll;
    worker_connections  1024;
}
 
    server {
        listen       80;
        server_name  www.yxp.com;
 
 
        charset utf-8;
      location / {
            root   html;
            index  index.html index.htm;
        }
 
        location /status {  ##访问位置为/status
            stub_status on;  ##打开状态统计功能
            access_log off;  ##关闭此位置的日志记录
        }

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

编写shell脚本来判断监控服务器的并发量

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高完整性系统工程(四):Formal Verification and Validation

目录 1. Specification Process 1.1 State Invariants 1.2 Exceptional Behaviour 1.3 Framing 1.4 Summary 2. V&V FOR SPECS 2.1 V&V for formal specs 2.2 Proof 2.3 Proof Assistants 2.4 Model Checking 1. Specification Process Specification Proces…

1128 N Queens Puzzle(21行代码)

分数 20 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 The "eight queens puzzle" is the problem of placing eight chess queens on an 88 chessboard so that no two queens threaten each other. Thus, a solution requires that no two queens sha…

QTranslator Class

QTranslator Class QTranslator 类公共成员函数类说明查找翻译使用多种翻译成员函数使用说明 QTranslator 类 QTranslator类为文本输出提供国际化支持。多国语言 Header: #include <QTranslator> qmake: QT core Inherits: QObject公共成员函数 构造函数QTranslator(…

代码随想录算法训练营15期 Day 7 | 454.四数相加II 、 383. 赎金信 、15. 三数之和 、18. 四数之和

昨天看了一下别的东西&#xff0c;导致昨天没有练习打卡&#xff0c;今天补上昨天的学习知识。 454.四数相加II 建议&#xff1a;本题是 使用map 巧妙解决的问题&#xff0c;好好体会一下 哈希法 如何提高程序执行效率&#xff0c;降低时间复杂度&#xff0c;当然使用哈希法 会…

AURIX TC3XX Cached PFLASH与Non-Cached PFLASH的区别

Cached ? Non-Cached&#xff1f; 在阅读TC3XX的用户手册时&#xff0c;在内存映射表中&#xff0c;有两个segment都是Program Flash&#xff0c;而且大小都一样是3M&#xff0c;一个是segment 8 另一个是segment10 这难免让人产生疑惑&#xff0c;二者区别在哪&#xff1f; …

高程实验 二分算法

学校的ppt把相等也考虑到大于上面去了&#xff0c;所以是错误的 1. (程序题) 有n(1<n<1000005)个整数&#xff0c;已经按照从小到大顺序排列好&#xff0c;现在另外给一个整数x&#xff0c;请找出序列中第1个大于x的数的下标&#xff01; 输入&#xff1a; 输入数据包含多…

4. 垃圾收集器ParNewCMS底层三色标记算法详解

JVM性能调优 1. 垃圾收集算法1.1 分代收集理论1.2 标记-复制算法1.3 标记-清除算法1.4 标记-整理算法 2. 垃圾收集器2.1 Serial收集器(-XX:UseSerialGC -XX:UseSerialOldGC)2.2 Parallel Scavenge收集器(-XX:UseParallelGC(年轻代)&#xff0c;-XX:UseParallelOldGC(老年代))2.…

浅谈MySQL主键

常用主键 常用主键 1&#xff09;自增 int、bigint等&#xff0c;顺序递增。 2&#xff09;雪花 雪花算法是因为有时间参数&#xff0c;所以是有序地&#xff0c;而且都是由数字组成。雪花id最大为64位,符合java中long的长度64位&#xff0c;适用于大规模分布式场景。 3&#…

docker基础操作与进阶 - 搭建基于pm2的node环境

1、为什么要使用docker 最近遇到一台机器需要部署两个不同版本node的情况&#xff0c;首先就想起了docker&#xff0c;想必还有其他类似环境问题的情况&#xff0c;需要进行项目隔离&#xff0c;而docker正是用来解决这个问题的。 docker的优势就在于环境隔离&#xff0c;相当…

第九篇、基于Arduino uno,用LCD1602(带IIC的)显示屏显示字符——结果导向

0、结果 说明&#xff1a;可以在LCD1602屏幕上面显示字符&#xff0c;实时的变量&#xff0c;也可以设置是否背光&#xff0c;如果是你想要的&#xff0c;可以接着往下看。 1、外观 说明&#xff1a;注意是带IIC通讯的LCD屏幕&#xff0c;外形如下。 2、连线 说明&#xff…

Hexo写文章不方便?用上GitHub Actions真的是泰裤辣

对于做个人博客的小伙伴来说 HEXO 大家肯定都是非常熟悉的吧,这是一个静态的个人博客程序,通过 HEXO + GitHub Pages 搭建免费个人博客也是很多博主的选择。但相信肯定也会有些困恼,比如博客的渲染维护太麻烦了,我要在一台新设备上写博客并推送到 GitHub Pages 还要先安装 …

【Redis】聊一下哨兵集群

上一篇中&#xff0c;介绍了哨兵机制可以减少主库实例下线的误判率&#xff0c;但是如果只有一个哨兵实例&#xff0c;出现宕机后没有办法保证服务的高可用&#xff0c;所以一般实际的生产环境都是搭建3个哨兵实例构建的集群进行运行。但是具体的运行机制是什么。其实主要就是三…

使用langchain及llama_index实现基于文档(长文本)的相似查询与询问

文章目录 1. 引言2. 简介3. 带关键字的查询方案4. 不带关键字的总结询问5. 实现代码 1. 引言 在调用ChatGPT接口时&#xff0c;我们常常受到4096个字符&#xff08;token&#xff09;的限制。这种限制对于处理长文本或者需要对文档进行相似查询和询问的场景来说是一个挑战。然…

如何复制投票链接投票怎样链接到公众号投票链接如何生成

关于微信投票&#xff0c;我们现在用的最多的就是小程序投票&#xff0c;今天的网络投票&#xff0c;在这里会教大家如何用“活动星投票”小程序来进行投票。 我们现在要以“妙趣拾光”为主题进行一次投票活动&#xff0c;我们可以在在微信小程序搜索&#xff0c;“活动星投票”…

【Python开发】FastAPI 03:请求参数—请求体

除了路径参数和查询参数&#xff0c;还有请求体&#xff0c;其用于传递 JSON、XML 或其他格式的数据&#xff0c;以便服务器能够读取并做出相应的处理&#xff0c;可以说请求体的作用更为强大。试想一下&#xff0c;如果存在七八个参数&#xff0c;路径参数和查询是不是就招架不…

Camera | 10.linux驱动 led架构-基于rk3568

前面文章我们简单给大家介绍了如何移植闪光灯芯片sgm3141&#xff0c;该驱动依赖了led子系统和v4l2子系统。 V4L2可以参考前面camera系列文章&#xff0c;本文主要讲述led子系统。 一、LED子系统框架 Linux内核的 led 子系统主要功能&#xff1a; 为每个设备在/sys/class/le…

《Linux内核源码分析》(2)进程原理及系统调用

《Linux内核源码分析》(2)进程原理及系统调用 一、进程 操作系统的作用&#xff1a;作为硬件的使用层&#xff0c;提供使用硬件资源的能力&#xff0c; 进程的作用&#xff1a;作为操作系统使用层&#xff0c;提供使用操作系统抽象出的资源层的能力 进程、线程和程序的区别&…

【计算机视觉】Segment Anything 安装配置及代码测试(含源代码)

文章目录 一、前言二、安装2.1 基本要求2.2 Install Segment Anything 三、代码使用示例3.1 Automatically generating object masks with SAM3.2 Environment Set-up3.3 显示标注3.4 图像示例3.5 Automatic mask generation3.6 Automatic mask generation options 一、前言 目…

客户体验:响应速度是他们的 No.1 Pick么?

服务响应速度在为消费者提供服务时极为重要&#xff0c;那么&#xff0c;在消费者整体体验中&#xff0c;响应速度是否是消费者最在意的呢&#xff1f; 无论是对企业还是消费者来说&#xff0c;时间都至关重要。消费者在寻求客户服务时&#xff0c;不喜欢等待。根据《客户服务受…

【Python asyncio】零基础也能轻松掌握的学习路线与参考资料

Python asyncio是一个强大而易于使用的库&#xff0c;让Python程序员能够编写高效的异步IO应用程序。它为程序员提供了一种简单而优雅的方法来避免使用 Python GIL&#xff08;全局解释器锁&#xff09;&#xff0c;同时允许他们轻松地处理高并发的网络通信和并发任务执行。下面…