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]# lsnginx-1.18.0.tar.gz rh[root@zy2 opt]# tar xf nginx-1.18.0.tar.gz[root@zy2 opt]# lsnginx-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 -tnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: 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 nginxkillall -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 nginxkillall -s HUP <PID号>
日志分割(移走原有日志,重新打开日志文件):kill -USR1 <PID号>
[root@zy2 ~]# cd /usr/local/nginx/logs #切换到日志目录[root@zy2 logs]# lsaccess.log error.log nginx.pid[root@zy2 logs]# mkdir log.bak[root@zy2 logs]# mv *.log log.bak #将原有日志移走[root@zy2 logs]# lslog.bak nginx.pid[root@zy2 logs]# kill -USR1 56272 #重新生成日志文件[root@zy2 logs]# lsaccess.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.pidExecStart=/usr/local/nginx/sbin/nginxExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true #表示给服务分配独立的临时空间[Install]WantedBy=multi-user.target[root@zy2 system]# systemctl daemon-reload //重载配置[root@zy2 system]# netstat -natp |grep nginxtcp 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 nginxtcp 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 scriptRUN="/usr/local/nginx/sbin/nginx"PID=`cat /usr/local/nginx/logs/nginx.pid`case "$1" instart)$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/nullthenecho 'nginx is running!' #注意:这里有‘!’,用双引号会被视为取反,所以只能用单引号elseecho 'nginx is not running!'fi ;;*)echo "正确用法为:$0 {start|stop|restart|reload|status}"exit 1 #返回值非0esacexit 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",所以现在二进制程序中的运行用户为nginxworker_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/htmlroot 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 { #访问位置为/statusstub_status on; #打开状态统计功能 access_log off; #关闭此位置的日志记录}}}
3. 重启服务,访问测试
[root@zy2 conf]# nginx -tnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful[root@zy2 conf]# systemctl restart nginx
浏览器访问:192.168.126.22/status
相关文章:

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

第八篇 Spring 集成JdbcTemplate
《Spring》篇章整体栏目 ————————————————————————————— 【第一章】spring 概念与体系结构 【第二章】spring IoC 的工作原理 【第三章】spring IOC与Bean环境搭建与应用 【第四章】spring bean定义 【第五章】Spring 集合注入、作用域 【第六章】…...

双塔模型:微软DSSM模型浅析
1.背景 DSSM是Deep Structured Semantic Model (深层结构语义模型) 的缩写,即我们通常说的基于深度网络的语义模型,其核心思想是将query和doc映射到到共同维度的语义空间中,通过最大化query和doc语义向量之间的余弦相似度,从而训…...

DAY 44 Apache网页优化
Apache网页优化 概述 在企业中,部署Apache后只采用默认的配置参数,会引发网站很多问题,换言之默认配置是针对以前较低的服务器配置的,以前的配置已经不适用当今互联网时代 为了适应企业需求,就需要考虑如何提升Apach…...

移动端手机网页适配iPad与折叠屏设备
采用的网页适配方案:移动端页面px布局适配方案(viewport) 产生此问题的原因 由于手机与平板等设备宽高比差异导致页面展示不全或者功能按钮展示在视口之外点击不到。 简单来说就是我们的页面都是瘦长(即高大于宽)的,而折叠屏等设…...

深入剖析 Qt QMap:原理、应用与技巧
目录标题 引言:QMap 的重要性与基本概念QMap 简介:基本使用方法(QMap Basics: Concepts and Usage)QMap 迭代器:遍历与操作键值对(QMap Iterators: Traversing and Manipulating Key-Value Pairs࿰…...

SpringBoot使用Hbase
SpringBoot使用Hbase 文章目录 SpringBoot使用Hbase一,引入依赖二,配置文件添加自己的属性三,配置类注入HBASE配置四,配置Hbase连接池五,配置操作服务类 一,引入依赖 <dependency><groupId>org…...

SQL优化总结
SQL优化总结 1. MySQL层优化五个原则2. SQL优化策略2.1 避免不走索引的场景 3. SELECT语句其他优化3.1 避免出现select *3.2 避免出现不确定结果的函数3.3 多表关联查询时,小表在前,大表在后。3.4 使用表的别名3.5 调整Where字句中的连接顺序 附录 1. My…...

【python学习】基础篇-字典的基本操作 获取当前日期时间
1.字典的定义与创建 定义字典时,每个元素都包含两个部分“键”和“值”,在“键”和“值”之间使用冒号(:)分隔,相邻两个元素使用逗号分隔,所有元素放在一个大括号“{}”中。语法格式如下: dictionary (‘key1’:‘value1’, &quo…...

Python FreeCAD.Vector方法代码示例
Python FreeCAD.Vector方法代码示例 本文整理汇总了Python中FreeCAD.Vector方法的典型用法代码示例。如果您正苦于以下问题:Python FreeCAD.Vector方法的具体用法?Python FreeCAD.Vector怎么用?Python FreeCAD.Vector使用的例子?那…...

HDFS 梳理
HDFS客户端 客户端作用 管理文件目录文件系统操作读写 客户端生成 配置项 配置 客户端状态 缓冲相关参数,读写缓冲 失败切换操作 推测执行?? NN引用 NNProxy 客户端关闭 关闭IO流 修改状态 关闭RPC连接 是否有多个RPC连接? HDFS读 打开文件构…...

ChatGPT团队中,3个清华学霸,1个北大学霸,共9位华人
众所周知,美国硅谷其实有着众多的华人,哪怕是芯片领域,华为也有着一席之地,比如AMD 的 CEO 苏姿丰、Nvidia 的 CEO 黄仁勋 都是华人。 还有更多的美国著名的科技企业中,都有着华人的身影,这些华人ÿ…...

通过工具生成指定 类型 大小 文件
今天给大家介绍一个神器 首先 大家在开发过程中或许经常需要涉及到文件上传类的功能 需要测试文件过大 空文件等等清空 不同大小的文件 而这种文件大小是比较不好控制的 但大家可以下载我的资源 文件生成工具(可生成指定大小 类型文件) 下载下来里面就有一个 fileGeneration…...

超外差收音机的制作-电子线路课程设计-实验课
超外差收音机的制作 一、原理部分: 超外差收音机:超外差式收音机是将接收到的不同频率的高频信号全部变成一个固定的中频信号进行放大,因而电路对各种电台信号的放大量基本是相同的,这样可以使中放电路具有优良的频率特性。 超…...

TensorFlow 深度学习实战指南:1~5 全
原文:Hands-on Deep Learning with TensorFlow 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如…...

【数据结构】队列的实现
白日去如箭,达者惜今阳。 --朱敦儒目录 🚁前言: 🏝️一.队列的概念及结构 🌻二.队列各种功能的实现 🍍1.队列的初始化 🏝️2.队列…...

【数据库】— 无损连接、Chase算法、保持函数依赖
【数据库】— 无损连接、Chase算法 Chase算法Chase算法举例一种简便方法:分解为两个模式时无损连接和函数依赖的一个简单例子 Chase算法 形式化定义: 构造一个 k k k行 n n n列的表格,每行对应一个模式 R i ( 1 ≤ i ≤ k ) Ri (1≤i ≤ k)…...

用英语翻译中文-汉字英文翻译
中文转英语翻译 作为一款高效、准确的中文转英语翻译软件,我们的产品可以帮助全球用户更好地沟通和合作,实现跨文化交流。 在全球化的今天,中英文翻译已经成为商务、学术、娱乐等各个领域不可或缺的一部分。我们的中文转英语翻译软件是为了…...

瑞吉外卖项目——缓存优化
用户数量多,系统访问量大 频繁访问数据库,系统性能下降,用户体验差 环境搭建 maven坐标 在项目的pom.xml文件中导入spring data redis的maven坐标: <dependency><groupId>org.springframework.boot</groupId><arti…...

从头创建一个新的浏览器,这合理吗?
从头构建一个新浏览器?这如果是不是个天大的“伪需求”,便是一场开发者的噩梦! 要知道,如果没有上百亿的资金和数百名研发工程师的投入,从头开始构建一个新的浏览器引擎,几乎是不可能的。然而SerenityOS系统…...

TypeScript泛型类型和接口
本节课我们来开始了解 TypeScript 中泛型类型的概念和接口使用。 一.泛型类型 1. 前面,我们通过泛型变量的形式来存储调用方的类型从而进行检查; 2. 而泛型也可以作为类型的方式存在,理解这一点,先了解下函数的…...

docker命令
1.运行 docker-compose up 2.查看命令 docker images 3.删掉docker镜像: docker rmi -f [id] docker卸载 1.杀死docker有关的容器: docker kill $(docker ps -a -q) 2.删除所有docker容器:docker rm $(docker ps -a -q) 3.删除所有docker镜像&…...

2023 年 3 月 NFT 月度报告
作者:Danielfootprint.network 数据来源:NFT Monthly Report 三月份的 NFT 市场上出现了两个有趣的趋势。一方面,Polygon 链尽管在二月份有所突破,达到了 NFT 总交易量的 4.2%,但于三月再次跌至 1% 以下,…...

【http】 get方法和Post方法区别;http和https
get方法和Post方法 get方法:通过url传参,回显输入的私密信息,不够私密 Post方法:通过正文传参,不会回显,一般私密性有保证。 一般如果上传的图片,音频比较大,推荐Post方法&#x…...

第三章 法的渊源与法的分类
目录 第一节 法的渊源的分类 一、法的渊源释义二、法的渊源种类 第二节 正式法源 一、正式法源的含义二、当代中国的正式法源三、正式法源的一般效力原则 第三节 非正式法源 一、当代中国的非正式法源 第四节 法的分类 一、法的一般分类二、法的特殊分类 第一节 法的渊源的…...

在Ubuntu18.04或者20.04下搭建edk2运行环境
#更新完之后依次执行下面两条命令 1.apt-get update 2.apt-get upgrade 如果执行之后出现源不能更新的问题,到/etc/apt/sources.list.d 下删除对应的ppa源重新更新即可解决 git clone https://github.com/tianocore/edk2.git cd edk2 git submodule update --init 如果git cl…...

多线程编程常用函数用法
一、多线程编程常用函数用法 1、pthread_create 头文件 #include<pthread.h>函数声明 int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg)函数功能 pthread_create是UNIX环境…...

C++ 标准模板库(Standard Template Library,STL)
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...

一个寄存器的bit2 bit3位由10修改成11,C示例
方法1: 如果需要将一个寄存器中的 bit2 和 bit3 两个位从 11 修改为 10,可以使用如下的 C 语言代码实现: // 将寄存器的 bit2 和 bit3 位从 11 修改为 10 volatile uint32_t *reg_addr (volatile uint32_t *)0x12345678; // 假设寄存器地址…...

【洛谷】P1631 序列合并
【洛谷】 P1631 序列合并 题目描述 有两个长度为 N N N 的单调不降序列 A , B A,B A,B,在 A , B A,B A,B 中各取一个数相加可以得到 N 2 N^2 N2 个和,求这 N 2 N^2 N2 个和中最小的 N N N 个。 输入格式 第一行一个正整数 N N N; 第二…...