http协议实现的程序

静态(httpd, nginx, lighttpd)

动态 (IIS, tomcat,  jetty,  jboss,  resin,  websphere, weblogic, oc4j)

客户端工具 (telnet, elinks, curl)  纯文本协议访问工具

HTTPD配置(端口、别名、访问控制、MPM、keep-alive、dso、DocumentRoot、DirectoryIndex、默认字符集、虚拟主机、mod_deflate模块、HTTPS配置)

HTTPD工具(htpasswd, apxs, rotatelogs, suexec),HTTPD压力测试(ab, webbench, http_load, jmeter, loadrunner, tcpcopy)

ASF: Apache Software Foundation  Apache 软件基金会

FSF: Free Software Foundaton    自由软件基金会

ASF赖以起家的是: httpd<命名:apache>


HTTP安装

httpd(2)    

   CentOS 6 默认提供rpm包 2.2版本

   CentOS 7 默认提供rpm包 2.4版本 (默认未安装)

CentOS 6  httpd程序环境(rpm安装)

/etc/httpd                   //ServerRoot  服务器根目录
/etc/httpd/conf.d //配置片段目录
/etc/httpd/conf/httpd.conf //主配置

/etc/httpd/logs //日志目录
/etc/httpd/modules //模块目录
/etc/httpd/run //运行中的进程的数据
/etc/rc.d/init.d/httpd //服务脚本
/etc/sysconfig/httpd //服务脚本配置
/usr/lib/httpd/modules
/usr/lib/httpd/modules/mod_actions.so //DSO机制,动态共享对象
/usr/sbin/apachectl //apachectl程序

主程序文件:
/usr/sbin/httpd //MPM为IO,串行响应的进程
/usr/sbin/httpd.event //MPM为复用I/O模型,并行响应的进程 <2.2的httpd,event不成熟>
/usr/sbin/httpd.worker //MPM.............................
//ps axu | fgrep httpd可查看 /usr/share/doc/httpd-2.2. //<DOCUMENTATION>
/usr/share/doc/httpd-2.2./ABOUT_APACHE
/usr/share/doc/httpd-2.2./CHANGES
/usr/share/doc/httpd-2.2./LICENSE
/usr/share/doc/httpd-2.2./NOTICE
/usr/share/doc/httpd-2.2./README
/usr/share/doc/httpd-2.2./VERSIONING /usr/share/man/man8/apachectl..gz //<MAN Document>
/usr/share/man/man8/htcacheclean..gz
/usr/share/man/man8/httpd..gz
/usr/share/man/man8/rotatelogs..gz
/usr/share/man/man8/suexec..gz /var/cache/mod_proxy //<缓存目录>
/var/lib/dav //<程序运行中的数据>
/var/log/httpd //《日志目录》
    access_log:访问日志
    errot_log: 错误日志
/var/run/httpd //《运行中的httpd进程的数据》 /var/www/error/ //错误页面html网页存放目录 站点文档目录
/var/www/html //DocuRoot目录,资源路径的根映射的位置

httpd配置文件

/etc/httpd/conf/httpd.conf 

//首次配置需要备份文件:
# cp -v /etc/httpd/conf/httpd.conf{,.bak}

配置文件的组成:

# fgrep 'Section' /etc/httpd/conf/httpd.conf
### Section : Global Environment //全局环境:定义httpd通用功能特性
### Section : 'Main' server configuration //主配置段:一个服务器提供单个站点
### Section : Virtual Hosts //虚拟主机:一个服务器提供多个站点
注: 2和3不能同时使用

配置格式:directive value

  directive :不区分字符大小写

  value:为路径时,取决于文件系统



 三、HTTPD配置及应用

3.1、修改监听的IP和Port

    Listen [IP:] PORT  :

注:Listen 端口  ----- 省略IP 表示监听于所有网卡的IP

  Listen指令,可以使用多次,用于监听不同地址的不同端口之上

e.g

  Listen 192.168.1.105:8080    //监听在改IP的8080端口之上,能与此IP通信的主机才能访问此进程

  Listen 80           //监听在所有接口的IP之上 

注:修改端口后一定要重启, service httpd reload

3.2、持久连接

a)Persistent Connection :连接建立,每个资源获取完成后,不会断开连接,而是继续等待其它的请求完成

  一个pv(自引用多个链接指向)多个资源,每个资源都需要一个请求

  非持久连接:请求pv时,每个资源请求时,都需要建立tcp连接。<1.0默认>

  持久连接:请求pv时,首个资源需要建立tcp连接,不断开情况下,继续完成后续请求

b)如何断开?

    • 限制:到达一定时间[def:75s]后,tcp连接自动断开。httpd-2.4支持毫秒级别
    • 数量限制:资源获取数量[def:100个]到达一定值时,tcp连接自动断开

c)副作用:并发访问量过大场景,时间或数量限制过大时,可能会导致后续的请求被[拒绝服务],可以关闭或调整时间或数量限制

  折中:使用较短的持久连接时间

e)<默认配置:关闭持久连接功能

f)测试连接的关闭,显示结果

  非持久连接测试结果显示:

 

   持久连接测试结果显示:



 3.3 、MPM 多路处理模块---并发响应模块

注: httpd-2.2 不支持同时编译多个模块,所以只能编译时确定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持

  确认方法: ps aux | grep httpd  查看相应文件

默认为/usr/sbin/httpd ,其使用prefork

1)查看当前使用的模块

2)查看装载的模块

3)更换MPM模块----/etc/sysconfig/httpd

更改为worker
# awk '$1 != "#" && $0 !~ /^[[:space:]]*$/{print}' /etc/sysconfig/
httpd
#HTTPD=/usr/sbin/httpd.worker
HTTPD=/usr/sbin/httpd.worker
#OPTIONS=
#HTTPD_LANG=C
#PIDFILE=/var/run/httpd/httpd.pid # service httpd restart
# ps axu | fgrep httpd
root 0.0 1.4 ? Ss : : /usr/sbin/httpd.worker
apache 0.0 1.2 ? Sl : : /usr/sbin/httpd.worker 更改为event
# awk
'$1 != "#" && $0 !~ /^[[:space:]]*$/{print}' /etc/sysconfig/httpd
#HTTPD=/usr/sbin/httpd.worker
HTTPD=/usr/sbin/httpd.event
#OPTIONS=
#HTTPD_LANG=C
#PIDFILE=/var/run/httpd/httpd.pid # service httpd restart
# ps axu | fgrep httpd
root 0.6 1.4 ? Ss : : /usr/sbin/httpd.event
apache 0.0 1.1 ? Sl : : /usr/sbin/httpd.event
apache 0.0 1.1 ? Sl : : /usr/sbin/httpd.event
apache 0.0 1.1 ? Sl : : /usr/sbin/httpd.event

MPM配置详解 /etc/httpd/conf/httpd.conf <网站的承载能力有一定影响>

# prefork MPM
# StartServers: 启动服务器后,预留的进程数
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: 服务器的生命周期内为MaxClients准备的最大值
# MaxClients: 最大并发数
# MaxRequestsPerChild: 每个进程最大响应请求数
<IfModule prefork.c>
StartServers 8  #服务启动时服务进程数
MinSpareServers 5 #最小空闲进程数
MaxSpareServers 20  #最大空闲进程数
ServerLimit 256  #服务器进程数量最大值
MaxClients 256  #最大并发请求数
MaxRequestsPerChild 4000 #一个服务器进程最多能够响应多少次的请求
</IfModule> # worker MPM
# StartServers: 启动服务预留进程数
# MaxClients: 最大并发数
# MinSpareThreads: 最小并发数
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: 每个进程内的线程数
# MaxRequestsPerChild: 每个线程最多响应请求数
<IfModule worker.c>
StartServers 4 #不包含主控进程
MaxClients 300
MinSpareThreads
MaxSpareThreads
ThreadsPerChild #每个进程所能够启动的线程数
MaxRequestsPerChild //0表示没有上限
</IfModule> 配置:影响网站的承载能力

PV承载量= \(每秒请求资源数 * 86400 \)/每个页面的资源数    //满载工作

考虑:全天满负荷运行?带宽使用大小200k?

  300*86400/50=40W

带宽:每个PV消耗多少KB * PV承载量

PV :Page View 页面计数

UV:User View 用户数量计数(独立IP数量)

3.4、DSO

配置指令实现模块加载

  使用语法:LoadModule  <模块名> <模块路径>

  模块路径可使用相对地址:相对于serverroot [/etc/httpd]  (CentOS 6)

    /etc/httpd/modules ----->/usr/lib64/httpd/modules

重载配置文件,实现启动或禁用模块

查看此模块已经被装载
# httpd -M | fgrep deflate_module
deflate_module (shared) 禁用 (配置文件注释)
# vim /etc/httpd/conf/httpd.conf
#LoadModule deflate_module modules/mod_deflate.so 重载
# service httpd reload 查看
# httpd -M | fgrep deflate_module
Syntax OK

3.5、定义"Main"  server 的文档页面路径 

注:先关掉selinux再测试-----setenforce 0

文档路径映射:

  DocumentRoot 指向的路径为URL路径的起始位置:

  DocumentRoot  "/var/www/html"
      /var/www/html/index.html -----> http://www.magedu.com/test/index.html
  注:
    #setenforing
    #iptables -F
    .2版本修改DocumentRoot,不需要授权
    .4版本修改DocumentRoot 需要对文件系统目录授权

注意:

① 可以写多行,但是下边的会覆盖上边的,最后还是使用下边的,写到子配置文件一样,因为子配置文件Include conf.d/*.conf在这行设置的上边,会被这行设置覆盖。

② 若设置的主站点不存在,那么服务会启动失败!

3.6、站点访问控制

a)可基于两种类型的路径指明对那些资源进行访问控制

  文件系统路径:      

    DocumentRoot "/var/www/html"

    <Directory "">...</Directory>

    <Files "">...</File>

e.g
<Files ~ "^\.ht">
Order allow,deny
Deny from all
Satisfy All
</Files>

  URL路径:

     <Location "">...</Location>     

b)访问控制机制:

  基于来源地址:Order , allow from 地址,deny from 地址

  基于用户账号控制 :LogFormat :%u

  

c)基于用户访问控制的实现

  安全域:需要用户认证后方能访问的路径

      应该通过名称对其进行标识,并用于告知用户认证的原因

  用户的账号和密码存储与何处

     虚拟账号:仅用于访问某服务时用到的认证标识(跟操作系统里面的账号没有任何关系)

  定义在/etc/httpd/conf/httpd.conf文件中

认证质询:

  WWW-Authenticate :响应码为401 ,拒绝客户端请求,并说明要求客户提供账号和密码

认证:

  Authorization :客户端用户填入账号和密码后再次发送请求报文;认证通过,则服务器发送响应的资源

  认证类型:

      basic :明文,放入https中进行【通用:浏览器大多数较老,不支持digest认证】//弹窗认证

      digest :消息摘要  发送账号及密码对应的md5码至服务器,服务器将md5码与存储的对应的md5码对比

  表单认证-----登录淘宝时输入的账号密码类型

密码存储位置:文件、数据库、ldap、nis、认证系统

  • ) 基于basic认证实现(了解)

    •     定义安全域
<Directory "">
  Options None                      #访问目录中的文件特性
  AllowOverride None                  
  AuthType Basic                     #认证类型
  AuthName "STRING"                   #安全域
  AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"  #密码储存位置
  Require user <username1> <username2> ...        #可登录的用户
 # Require group GROUP1 GROUP2 ...     #基于组来认证是需要此步骤
</Directory>
允许账号文件中的所有用户登录访问:
  Require valid-user
  •   提供账号和密码存储(文本文件)

  使用htpasswd命令进行管理
    htpasswd [options] passwordfile  username

    • -c: 自动创建passwordfile,因此,仅应该在添加第一个用户时使用;
    • -m: md5加密用户密码;
    • -s: sha1加密用户密码;
    • -D: 删除指定用户

e.g

# echo "hello" > /www/htdocs/admin/index.html

<Directory "/www/htdocs/admin">
Options None
AllowOverride None
AuthType Basic
AuthName "Administrator private"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
Require valid-user
</Directory> # httpd -t
# service httpd reload
# htpasswd -c -m /etc/httpd/conf.d/.htpasswd tom #第一次创建用户需-c
# htpasswd -m /etc/httpd/conf.d/.htpasswd obama
# htpasswd -m /etc/httpd/conf.d/.htpasswd obama

基于组进行认证实现

vim  /etc/httpd/conf.d/.htgroup  创建组文件并建立组名
  weblogic :tom obama
<Directory "/www/htdocs/admin">
Options None
AllowOverride None
AuthType Basic
AuthName "Administrator private"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group weblogic
</Directory>
  要提供:用户账号文件和组文件;   
    组文件:每一行定义一个组     
    GRP_NAME:user1 user2 user3 ...

3.7、默认主页面

DirectoryIndex index.html index.html.var

自左向右,依次匹配给出目录下的文件,存在时,显示

3.8、 Directory 中“基于来源地址”实现控制”

<Directory "/var/www/html">

  Options Indexes FollowSymLinks
  AllowOverride None
  Order allow,deny
  Allow from all </Directory>

a)Options 选项

    所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews

  常用选项:None, ALL

  Indexes  : 索引 ----- 允许索引  没有默认主页面时,显示欢迎界面【注:docroot与directory 修改路径要相同】

  FollowSymLinks :索引的文件是symolic link 时,允许跟踪符合链接文件

  SymLinksifOwnerMatch :属主匹配-----符号链接文件的属主与原文件属主为同一个用户时,才允许跟踪

   MultiViews  :是否允许多视图 内容协商:启动后性能差

   ExecCGI  :是否允许CGI接口

b)AllowOverride ---是否允许覆盖选项   (了解)

  选项值:FileInfo  AuthConfig  Limit  None  ALL 

  是否允许当前的配置去覆盖每一个网站页面下的一个隐藏文件(./htaccess )

  ./htaccess   每个目录访问控制:灵活 但对性能影响非常大不启用

c)基于来源地址的访问控制机制

Order :检查次序  写在后面的位默认法则   
   Order allow,deny (白名单)
   Order deny ,allow(黑名单)
  
    Allow from
    deny from
      后接 来源IP地址
         NetAddr :表示172.16网络的方式
         通配符:*.magedu.com

修改配置文件如下信息及其显示结果:

3.9 日志设置

官网地址:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html

http://httpd.apache.org/docs/2.2/logs.html

a)错误日志

日志为链接路径:/etc/httpd/logs ----->/var/log/httpd/

b)访问日志

  CustomLog logs/access_log         combined

日志文件路径<相对于ServerRoot>    日志格式名<logformat>

LogFormat格式

  •  combined 格式:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined   #组合格式包含下面是三个格式
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
  •  combinedio
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio  
记录日志时候,会根据这一次用户的请求 把这些宏替换成对应的相关信息
e.g
192.168.1.105 - tom [18/Sep/2017:02:59:24 +0800] "GET /admin/ HTTP/1.1" 304 11 "-" "Mozilla/5.0
%h remote host      客户端IP地址
%l remote logname 登录的用户名,mod_ident模块为空时,用 “_” 表示
%u remote user   用户访问控制的basic,digst认证的用户名为空时,用 “_” 表示
%t Time the request was received 服务器收到请求的时间
%r First line of request       请求报文的首行
%>s Status               响应状态码
%b :响应报文的大小,单位是字节,不包括响应报文首部
%{Referer}i :请求报文当中“referer”首部的值;当前页面(资源)的访问入口,即从哪个页面的超链接跳转而来
   “ _ ” 网站有名--直接从浏览器键入的,而不是从网页超链接跳转过去的
   “不为空时,网站的广告有效”
%{User-Agent}i :请求报文当中“User-Agent”首部的值;即发出请求用到的应用程序
   用户代理:发起请求的用到的进程<elink,ab,telnet,浏览器, curl>搜索引擎是爬虫爬出来的

10、路径别名 

Alias  /URL/  "/PATH/TO/SOMEDIR/"

  注:URL后面存在“/” 时,路径后必须存在“/”

    /URL/被匹配是从资源路径的根起始的

E.g

  • DocumentRoot "/www/htdocs"

    http://www.magedu.com/download/bash-4.4.2-3.el6.x84_64.rpm

       --->/www/htdocs/download/bash-4.4.2-3.el6.x84_64.rpm

  • Alias /bbs/  "/forum/htdocs/"

    http://www.magedu.com/bbs/index.html ---> /forum/htdocs/index.html

    例如:/www/forum    此处DocumentRoot为/www/forum
文件系统路径:/www/forum/bbs/upload/a.rar
则URL路径为:http://Server_IP/bbs/upload/a.rar # mkdir -p /www/forum
# echo "This is a new site location" > /www/forum/index.html
# vi /etc/httpd/conf/httpd.conf ###修改为 /www/forum
# service httpd reload
# curl http://192.168.21.10
This is a new site location

11、字符集设定 (了解)

  AddDefaultCharset UTF-8

  全球:UTF-8

  国标:GBK,GB2312 ,GB18030 <中文>

  源文件中的编码应该与服务器的编码相同


四、虚拟主机

虚拟主机的类型

  •   基于IP :一个服务器有多个IP    (实践中很少使用)
  •   基于PORT :同一个IP,有多个PORT  (实践中很少使用)
  •   基于主机名hostname :同一个IP,有多个Host

 

基于名称完成不同虚拟主机的识别

封装时: HTTP首部、TCP首部、IP首部、帧首部..

Host: 浏览器键入的主机名 //"应用层首部"中附加,非通信子网

 注:一般虚拟主机不可与中心主机混用,所以要使用虚拟主机,需先禁用中心主机

4.1、配置前提  

   httpd2.2版本 注释中心主机DocumentRoot ,并启动 ServerName :NameVirtualHost *:
  httpd2.4版本 注释中心主机DocumentRoot

4.2、每个虚拟主机都有专用配置格式

实例1  基于IP地址

a) 在配置文件的最后写入一下字段:
<VirtualHost 192.168.1.105:>
ServerName web1.douma.com
DocumentRoot "/data/web1"
</VirtualHost> <VirtualHost 192.168.1.25:>
ServerName web2.douma.com
DocumentRoot "/data/web2"
</VirtualHost>
b) 然后创建对应位置:
mkdir -pv /data/web{1,2}
echo "web1 > /data/web1/index.html"
echo "web2 > /data/web2/index.html"
c) 添加一块网卡:
    ip addr add 192.168.1.25/24 dev eth0
  显示添加网卡:ip addr list

实例:基于port实现 

a) 配置文件的最后写入一下字段:
 <VirtualHost 192.168.1.105:8080>
ServerName web3.douma.com
DocumentRoot "/data/web3"
</VirtualHost>
 <VirtualHost 192.168.1.105>
ServerName web4.douma.com
DocumentRoot "/data/web4"
</VirtualHost>
mkdir -pv /data/web{3,4}
echo "web3 > /data/web3/index.html"
echo "web4 > /data/web4/index.html"
b) 开启监听8080端口
  Listen :8080

实例3、基于Hostname实现

a) 要开启NameVirtualHost: 项
  修改配置文件
  NameVirtualHost 192.168.1.105:80
注:选中部分要求一致
<VirtualHost 192.168.1.105:80>
ServerName web3.douma.com
DocumentRoot "/data/web3"
</VirtualHost> <VirtualHost 192.168.1.105:80>
ServerName web4.douma.com
DocumentRoot "/data/web4"
</VirtualHost>
c) 编辑/etc/hosts文件 添加如下内容
  192.168.1.105 web3.douma.com
  192.168.1.105  web4.douma.com

d)测试 curl http://web3.douma.com

 内置的status页面

  web的子功能

访问结果显示如下:

开启扩展信息:

  

再互联网上访问上述信息:需基于账号实现访问控制

CentOS 7

默认运行级别

  [root@localhost ~]# systemctl get-default
multi-user.target

修改运行级别

   [root@localhost ~]# systemctl set-default

https://blog.51cto.com/sonlich/1968229

https://blog.51cto.com/11010461/2109162

https://www.cnblogs.com/dannylinux/articles/7999156.html

https://www.aliyun.com/1111/2019/group-buying-share?ptCode=BD1104468FD85A9BBC32DA64D3419891647C88CF896EF535&userCode=sllkyfo6&share_source=copy_link 

3、Web server 之httpd2.2 配置说明的更多相关文章

  1. jexus asp.net Linux Web Server

    Jexus简介 Jexus web server for linux 是运行在Linux上的Web服务器.其安装和部署及其简单,直接支持Asp.net . 下载Jexus wget http://li ...

  2. yum安装Apache Web Server后各个文件存放位置

    yum安装Apache Web Server后各个文件存放位置   用yum安装apache软件: yum -y install httpd 安装完成后,来查看理解yum安装软件的过程和安装路径.   ...

  3. Jexus Web Server 完全傻瓜化图文配置教程(基于Ubuntu 12.04.3 64位)[内含Hyper-v 2012虚拟机镜像下载地址]

    1. 前言 近日有感许多新朋友想尝试使用Jexus,不过绝大多数都困惑徘徊在Linux如何安装啊,如何编译Mono啊,如何配置Jexus啊...等等基础问题,于是昨日向宇内流云兄提议,不如搞几个配置好 ...

  4. Flash: An Efficient and Portable Web Server

    Introduction This paper presents the design of a new Web server architecture called the asymmetric m ...

  5. C#中自己动手创建一个Web Server(非Socket实现)

    目录 介绍 Web Server在Web架构系统中的作用 Web Server与Web网站程序的交互 HTTPListener与Socket两种方式的差异 附带Demo源码概述 Demo效果截图 总结 ...

  6. 本机ip+端口不能访问web server,外部却可以访问

    本机ip+端口不能访问web server,外部却可以访问! 这个奇葩的问题困扰了我好久,别人通过ip访问我的server一切正常,自己却访问不了,一度怀疑win10的问题,久寻无果! 最后关闭ads ...

  7. Difference between web server ,web container and application server

    In Java: Web Container or Servlet Container or Servlet Engine : is used to manage the components lik ...

  8. vs默认VS Development Sever和用IIS Web Server的一点差别

    关于VS Development Server(vs调试默认运行环境)和IIS Web Server 做运行服务器时,请求处理的一点区别. 将请求粗略分为两类:静态资源请求和动态资源请求. 静态资源请 ...

  9. [SDK2.2]Windows Azure Virtual Network (4) 创建Web Server 001并添加至Virtual Network

    <Windows Azure Platform 系列文章目录> 在上一章内容中,笔者已经介绍了以下两个内容: 1.创建Virtual Network,并且设置了IP range 2.创建A ...

随机推荐

  1. C#方法(用法,参数)

    方法:是一种用于实现可以由对象或类执行的计算或操作的成员,是一个已命名的语句集.方法就是把一些相关的语句组织到一起,用来执行一个任务的语句块.比如每个C#程序至少带一个main函数 1.格式:修饰符  ...

  2. 【转载】使用Jedis操作redis

    Redis是一个开源的Key-Value数据缓存,和Memcached类似. Redis多种类型的value,包括string(字符串).list(链表).set(集合).zset(sorted se ...

  3. SVM支持向量机实例

    波士顿房价回归分析 1.导入波士顿房价数据集 ############################# svm实例--波士顿房价回归分析 ############################## ...

  4. J.U.C之读写锁:ReentrantReadWriteLock

    此篇博客所有源码均来自JDK 1.8 重入锁ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,但是在大多数场景下,大部分时间都是提供读服务,而写服务占有的时间较少.然而读服 ...

  5. Git撤回已经推送(push)至远程仓库提交(commit)的版本

    背景 所以,经常会遇到已经提交远程仓库,但是又不是我想要的版本,要撤下来. 回退版本一般使用git reset,又分为: # 不删除工作空间改动代码,撤销commit,不撤销git add . git ...

  6. js中0.1+0.2 与0.3的对比

    Math.abs(0.1+0.2-0.3)<=Number.EPSILON

  7. MySQL常见问题集锦及注意事项

    一.表设计上的坑 1.字段设计 1.1 字段类型设计 尽量使用整型表示字符串: `INET_ATON(str)`,address to number `INET_NTOA(number)`,numbe ...

  8. 使用pandoc制作幻灯片

    示例Md % Habits % John Doe % March 22, 2005 # In the morning ## Getting up - Turn off alarm - Get out ...

  9. Elasticsearch7

    elasticsearch 由来 点击进入 elasticsearch 基本概念 点击进入 elasticsearch 安装 点击进入 elasticsearch 增删改查 点击进入 elastics ...

  10. ORA-28547: connection to server failed, probable Oracle Net admin error

    现象 C:\Users\Administrator>sqlplus scott/tiger@192.168.1.11:1521/orcl SQL*Plus: Release 11.2.0.4.0 ...