nginx的安装应用
Nginx的安装
# yum install gcc pcre-devel zlib-devel –y
#./configure –prefix=/usr/local/nginx
#make && make install
启动nginx:
# /usr/local/nginx/sbin/nginx
# lsof -i:80
基本配置:
配置文件
worker_processes 1;
定义工作进程的数量。建议为CPU核心数量。(六核为6)
events {
worker_connections 1024;
}
events为进程线程混合工作模式,Apache使用prefork模式.
每个工作进程的最大连接数量。理论上每台服务器的最大连接数为:worker_connections*
worker_processes
http {
include mime.types; #定义数据类型($path/conf/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"
"$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#是否以零拷贝的方式来提升文件传输性能。普通应用应开启;下载类应用建议关闭。
#tcp_nopush on;
#防止网络阻塞,在sendfile为on时有效
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server
{ #定义网站,注意大括号
listen 80;
server_name localhost;
#charset
koi8-r; #字符集,默认自动匹配客户端浏览器
#access_log logs/host.access.log main;
location
/ {
root html;
index index.html
index.htm;
}
}
……
发布默认网站:
相关设置字段:
server {
listen 80;
server_name localhost;
location
/
{ 相当于Apache的DocumentRoot,文档根目录
root html;
index index.html
index.htm;
}
1)准备网页
[root@Nginx html]#
mv index.html index.html.bak
[root@Nginx html]#
vim index.html
[root@Nginx html]#
cat index.html
Hello,Danny!
[root@Nginx html]#
ls
50x.html index.html index.html.bak
2)测试:
elinks http://localhost --dump
Hello,Danny!
防盗链:
制作做一个盗链
<html>
<body>
<a href="http://192.168.18.254/a.png">盗链测试</a>
</body>
</html>
nginx服务器上防盗链:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server
{
listen 80;
server_name www.a.com;
location
/ {
root html;
index index.html
index.htm;
}
location
~*.(gif|jpe?g|png|swf|flv)$
{ #匹配图片格式
valid_referers
none blocked *.baidu.com; #valid_referers定义允许倒链的
if
($invalid_referer)
{ #判断如果是不允许倒链的,我们返回403
return
403; #403错误表示服务器收到请求,但拒绝提供页面
}
}
}
}
释义:
none 代表没有referer
blocked 代表有referer但是被防火墙或者是代理给去除了
URL重写:
环境:
13.1.1.1 主机名 www.a.com 扮演nginx提供web和客户端角色
13.1.1.200 主机名www.b.com
客户端访问www.a.com ——> Nginx(www.b.com)
先看一下默认首页
1)nginx配置文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server
{
listen 80;
server_name www.a.com;
location
/ {
root html;
index index.html
index.htm;
}
error_page 500
502 503 504 /50x.html;
location
= /50x.html {
root html;
}
}
}
2)结合解析
vim /etc/hosts
echo
“127.0.0.1 www.a.com” >>/etc/hosts
此时使用浏览器,输入www.a.com即可得到nginx提供的web页面
3)nginx重写,将访问www.a.com的请求交给www.b.com
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server
{
listen 80;
server_name www.a.com;
location
/ {
# root html;
# index index.html
index.htm;
rewrite
^/$ http://www.b.com;
}
error_page 500
502 503 504 /50x.html;
location
= /50x.html {
root html;
}
}
}
4)客户端(nginx)修改域名解析
vim
/etc/hosts
127.0.0.1 www.a.com
13.1.1.200
www.b.com
5)设置13.1.1.200的web服务
/etc/init.d/httpd
restart
echo
“rewrite” > /var/www/html/index.html
6)测试
在nginx浏览器上输入www.a.com ——>得到rewrite
限速:
实验环境:
客户端:13.1.1.200
nginx服务器:13.1.1.1
实验说明:
本实验涉及三个部分,1从下载开始即限速;2下载一定大小后开始限速;3避免下载软件恶意(多进程)下载造成服务器压力多大
实验一:下载开始即限速
1) 先来看一下不限速的现在速率
在nginx文档根目录下创建大文件:
[root@Nginx conf]#
dd if=/dev/zero of=/usr/local/nginx/html/bigfile bs=1M count=100
在客户端上测试下载速率
[root@Lvs1 opt]#
wget http://192.168.19.253/bigfile
--2016-11-09
22:29:14-- http://13.1.1.1/bigfile
正在连接 13.1.1.1:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:104857600 (100M) [application/octet-stream]
正在保存至: “bigfile”
100%[======================================>]
104,857,600 44.0M/s in 2.3s
2) 配置nginx配置文件限速并重启nginx
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server
{
listen 80;
server_name www.a.com;
location
/ {
root html;
index index.html
index.htm;
#rewrite
^/$ http://www.b.com;
limit_rate 100k;
}
error_page 500
502 503 504 /50x.html;
location
= /50x.html {
root html;
}
}
}
3) 测试限速功能
[root@Lvs1 opt]#
wget http://192.168.19.253/bigfile
--2016-11-09
22:35:54-- http://13.1.1.1/bigfile
正在连接 13.1.1.1:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:104857600 (100M) [application/octet-stream]
正在保存至: “bigfile”
0%
[ ]
406,120 99.6K/s
实验二:文件下载到一定大小后限速的设置及测试
nginx配置
设置下载到90M之后,按照每秒100k的速率下载。
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server
{
listen 80;
server_name www.a.com;
location
/ {
root html;
index index.html
index.htm;
#rewrite
^/$ http://www.b.com;
limit_rate_after
90m;
limit_rate
100k;
}
error_page 500
502 503 504 /50x.html;
location
= /50x.html {
root html;
}
}
}
客户端测试:
[root@Lvs1 opt]#
rm -fr bigfile
[root@Lvs1 opt]#
wget http://13.1.1.1/bigfile
--2016-11-09
22:37:57-- http://13.1.1.1/bigfile
正在连接 13.1.1.1:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:104857600 (100M) [application/octet-stream]
正在保存至: “bigfile”
[==================================> ]
94,576,640 27.9M/s
[==================================> ]
94,883,840 21.1M/s
[==================================> ]
94,883,840 17.3M/s
[==================================> ]
94,883,840 14.6M/s
[==================================> ]
95,191,040 12.4M/s
[==================================> ]
95,191,040 11.0M/s
[==================================> ]
95,191,040 9.86M/s eta
实验三:防止恶意下载造成服务器压力多大
1)模拟恶意软件恶意下载
客户端脚本:
#!/bin/bash
for i in `seq 1
10`
do
wget
http://192.168.19.253/bigfile >/dev/null &
done
解释:模拟客户端开启10个进程下载服务器资源
执行脚本,忙打ps aux | grep wget 可以看到10个wget进程(慢了看不到)
2)限制每个源IP最多开三个下载
配置文件:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
limit_conn_zone
$binary_remote_addr zone=*:300k;
#同一源IP地址最大带宽300K
server
{
listen 80;
server_name www.a.com;
location
/ {
root html;
index index.html
index.htm;
#rewrite
^/$ http://www.b.com;
#limit_rate_after
90m;
limit_rate 100k;
limit_conn
* 3; //同一源地址最多三个下载进程
}
error_page 500
502 503 504 /50x.html;
location
= /50x.html {
root html;
}
}
}
再次执行恶意下载脚本,忙打ps aux | grep wget,看到只有3个wget进程
root 18505 0.1 0.1 10244 1488
pts/0 S 23:12 0:00
wget http://13.1.1.1/bigfile
root 18507 0.1 0.1 10244 1492
pts/0 S 23:12 0:00
wget http://13.1.1.1/bigfile
root 18514 0.1 0.1 10244 1488
pts/0 S 23:12 0:00
wget http://13.1.1.1/bigfile
root 18517 0.0 0.0 6052 768
pts/0 S+ 23:12 0:00
grep wget
虚拟主机:
实验环境:
OS:rhel6.7
Nginx:1.5.1
客户端:192.168.19.249
Nginx:192.168.19.{253,254}
基于端口:
1) 修改配置文件
[root@Nginx
nginx]# vim conf/nginx.conf
server
{
listen 80;
# server_name localhost; 跟主机名没关系
location
/ {
root html;
index index.html
index.htm;
}
}
server
{
listen 8080;
# server_name localhost; 跟主机名没关系
location
/ {
root www;
index index.html
index.htm;
}
}
2)增加8080端口对应的根目录www及首页文件
mkdir
/usr/local/nginx/www
echo
8080 > /usr/local/nginx/www/index.html
3)重启nginx
[root@Nginx
nginx]# killall -s HUP nginx
4)验证
elinks http://localhost --dump
elinks http://localhost:8080 --dump
基于域名
1)配置文件
[root@Nginx
nginx]# vim conf/nginx.conf
server
{
listen 80;
server_name www.a.com;
location
/ {
root html;
index index.html
index.htm;
}
}
server
{
listen 80;
server_name www.b.com;
location
/ {
root www;
index index.html
index.htm;
}
}
2)域名解析
[root@Nginx
nginx]# vim /etc/hosts
192.168.19.253 www.a.com
192.168.19.253 www.b.com
3)网页制作
[root@Nginx
nginx]# echo "www.a.com" > /usr/local/nginx/html/index.html
[root@Nginx
nginx]# echo "www.b.com" > /usr/local/nginx/www/index.html
4)重启服务
[root@Nginx
nginx]# killall -s HUP nginx
基于IP(很少用,IP太贵)
1)配置文件
server
{
listen 192.168.19.253:80;
# server_name localhost;
location
/ {
root html;
index index.html
index.htm;
}
}
server
{
listen 192.168.19.254:80;
# server_name localhost;
location
/ {
root www;
index index.html
index.htm;
}
}
2)查看服务监听端口—此时监听的是从本机上所有网卡过来的http请求
[root@Nginx
nginx]# netstat -tlnp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 25183/nginx
3)添加一块网卡(别名),并重启nginx
[root@Nginx
nginx]# ifconfig eth0:1 192.168.19.254
[root@Nginx
nginx]# killall -s HUP nginx
4)重启服务,查看监听端口—此时监听 192.168.19.253 和 192.168.19.254 网卡进来的请求
[root@Nginx
nginx]# netstat -tlunp | grep 80
tcp 0 0 192.168.19.253:80 0.0.0.0:* LISTEN 25060/nginx
tcp 0 0 192.168.19.254:80 0.0.0.0:* LISTEN 25060/nginx
5) 测试
[root@Nginx
nginx]# elinks http:// 192.168.19.253--dump
www.a.com
[root@Nginx
nginx]# elinks http:// 192.168.19.254--dump
www.b.com
反向代理:
代理(proxy)服务器:
一般是指局域网内部的机器通过代理服务器发送请求到互联网上服务器。代理服务器一般作用在客户端,如FQ神器。
代理(proxy)请求过程:
客户端首先与代理服务器建立连接,然后根据代理服务器所使用的代理协议,请求对目标服务器创建连接、发送请求、获得数据,最后将数据发送给客户端。
Web代理(proxy)服务器是网络的中间实体。代理位于web客户端和web服务器之间,扮演“中间人”的角色。http的代理服务器既是web服务器又是web客户端。
正向代理:(针对客户端的代理)
是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(如:YouTube),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正想代理。
反向代理服务器:(针对服务器的代理)
在服务器端接受客户端的请求,然后把请求分发给具体的服务器进行处理,然后再将服务器的响应结果反馈给客户端。Nginx就是其中的一个反向代理服务器软件。
反向代理和正向代理相反。对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行特别的设置。客户端向反向代理发送连接请求,接着反向代理判断将请求转发给哪一台真实服务器,并将获得的内容返还给客户端。
如图:
用户A始终认为它访问的原始服务器是Z而不是B,但实际上是反向代理服务器Z接受用户A的应答。然后Z从原始服务器B中取得数据,然后发送给A。
由于防火墙的作用,只允许代理服务器Z访问原始服务器B。这样就保护了原始服务器B。
实验:
环境:
客户端:192.168.18.1
代理服务器:192.168.18.254
原始服务器:192.168.18.10
1、配置代理:
server
{
listen 80;
server_name localhost;
location
/ {
#root html; 关闭本机的页面服务
#index index.html
index.htm;
proxy_pass http://192.168.18.10; 遇到请求本代理服务器目录的请求,转发给原始服务器。
}
2、配置原始服务器的页面
[root@origin 桌面]# cat /var/www/html/index.html
test
page
3、测试
在客户端打开浏览器,输入192.168.18.254---会收到原始服务器提供的页面
小升级---端口映射
1、更改原始服务器的上的httpd程序运行端口号为8080
[root@origin
html]# vim /etc/httpd/conf/httpd.conf
#Listen
12.34.56.78:80
Listen 8080
[root@origin
html]# service httpd restart
2、修改代理服务器的配置文件
proxy_pass http://192.168.18.10:8080;
(以上解释:将客户端对代理服务器80端口的请求映射到了原始服务器8080端口)
3、测试
客户端浏览器仍可以正常访问原始服务器的页面:test page
看一下整个连接过程:
操作说明:
客户端访问反向代理服务器,在原始服务器上抓包,下面是抓包结果:
从上面的结果来看,
1、先是客户端与反向代理服务器建立连接,然后反向代理服务器再与原始服务器建立连接。
2、对于服务器来说并不知道真正的客户端是谁。
如果想让服务器知道真正的客户端是谁,我们可以对nginx(代理)做一下操作:
在源服务器上抓包看结果:
从上图中可以看出,响应消息中已经有了真实客户端的IP地址了。但是我们去看一下源服务器的日志文件---并没有记录真实客户端的IP地址---而只能看到是代理服务器来要的数据!
如果需要让源服务器日志记录真实客户端的IP地址,修改web软件(如果服务器是nginx则不需要设置)的配置文件如下操作:
LNMP和动态页面:
Lnmp
Php 5.4之前的版本和之后的版本在将其变成服务时操作不同,在lamp架构时使用php-fpm模块将5.4之后的版本变成了服务,下面使用5.4之前的版本将其变成服务,需要用到一个软件:spawn-fcgi
Nginx服务器上:
1、先去安装PHP
[root@smbserver 桌面]# yum install php-* mysql-server mysql -y
2、安装spawn软件包
[root@smbserver 桌面]# rpm -ivh spawn-fcgi-1.6.3-1.el5.i386.rpm(该命令最好用yum安装)
注意安装该软件后会带来一个命令:spawn-fcgi (spawn:引起,酿成,大量生产)
相关选项:
-f 指定生成的fastCGI程序的文件名
-a
绑定地址
-p
绑定端口
-u 指定uid
-g 指定gid,默认是uid的主要组
-P
spawn程序的pid文件
-C
生成子进程的数量
[root@Nginx 桌面]# spawn-fcgi -a 127.0.0.1 -u nobody -P
/var/run/php.pid -C 5 -p 9000 -f /usr/bin/php-cgi
spawn-fcgi: child
spawned successfully: PID: 14544
[root@Nginx 桌面]# ps -ef | grep 14544
nobody 14544 1 0
19:04 ? 00:00:00
/usr/bin/php-cgi
nobody 14545
14544 0 19:04
? 00:00:00 /usr/bin/php-cgi
nobody 14546
14544 0 19:04
? 00:00:00 /usr/bin/php-cgi
nobody 14547
14544 0 19:04
? 00:00:00 /usr/bin/php-cgi
nobody 14548
14544 0 19:04
? 00:00:00 /usr/bin/php-cgi
nobody 14549
14544 0 19:04
? 00:00:00 /usr/bin/php-cgi
root 14578
14483 0 19:07 pts/3 00:00:00 grep 14544
管理php-cgi ---使用脚本脚本名称php-cgi
该脚本存放在nginx目录中的liu目录中
3、测试
[root@Nginx 桌面]# php_cgi restart
停止 php-cgi: [确定]
正在启动 php-cgi:spawn-fcgi: child
spawned successfully: PID: 14940
[确定]
注:可将该启动管理脚本拷贝到/etc/init.d目录下,符合我们的使用习惯
4、让nginx支持动态页面
location
/ {
root html;
index index.php index.html
index.htm;
#将index.php放到最前面(最优先读取)
}
location
~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name;
include fastcgi_params;
}
5、生成一个动态页面
[root@Nginx
nginx]# vim html/index.php
释义:date(),定制时间格式;time()调用系统时间
6、测试
本机输入localhost 多次回车会看到不同的页面
Nginx的基础优化:
一、最大连接数
二、独立CPU核心及绑定worker进程
三、压缩
四、缓存
一、最大连接数
• 默认情况下一个程序最多可以打开1024个文件(fd)
• ulimit –n
• 设置 ulimit –SHn 65535 ——>
/etc/security/limits.conf永久设置
在/etc/security/limits.conf最后增加如下两行记录
* soft nofile 65535
* hard nofile 65535
• 请求本地资源
• max_clients=min(worker_connections,nofile)
• nofile(/etc/security/limits.conf)为最多开打开的fd
• 作为反向代理服务器
• max_clients=min(worker_connections,nofile)*worker_processes/2
关于上面max_clients计算方法说明:(一般系统的nofile设置都比worker_processes高,所以下面公式可直接使用worker_processes计算)
从用户的角度,http 1.1协议下,由于浏览器默认使用两个并发连接,因此计算方法:
nginx作为http服务器的时候:
max_clients = worker_processes * worker_connections/2
nginx作为反向代理服务器的时候:
max_clients = worker_processes * worker_connections/4
或者从一般建立连接的角度:客户并发连接为1.
nginx作为http服务器的时候:
max_clients = worker_processes * worker_connections
nginx作为反向代理服务器的时候:
max_clients = worker_processes * worker_connections/2
nginx做反向代理时,和客户端之间保持一个连接,和后端服务器保持一个连接。
ab测试:
1、实验环境
客户端:192.168.18.1
服务器192.168.18.254
2、服务器配置文件让服务器提供页面服务
3、客户端ab测试
4、修改配置文件worker_connections和系统的ulimit值为65535并测试
二、将worker进程绑定到固定的CPU核心上
测试用服务器上又四颗核心
1、查看当前nginx的相关进程信息
2、修改配置文件开启3个worker进程。前提是服务器需要有至少3个CPU核心(cat /proc/cpuinfo)
3、查看进程运行在哪个核心上。psr为CPU核心编号
4、我们发现编号为1的核心没有被用到,下面3个worker分别绑在编号为1,2,3的核心上
(设置内核参数(/boot/grub/grub.conf),让每个worker平均分配给cpu。配置文件,重启系统生效。)
5、 重启系统后修改nginx改配置文件,将每个nginx进程绑定到固定的cpu核心上:
因为是四个核心所以四个0000,又因为只给3个worker进程绑定cpu核心上,所以只有三个,1代表核心的位置,从左至右0010 0100 1000,最左边的那个0是给master进程使用的第一块(0)核心,如下:
6、 查看worker进程绑定情况
三、压缩
释义:
开启gzip压缩
http协议的版本(1.0不支持压缩)
当客户端是微软IE1-6版本时,不启用压缩
压缩的数据类型
数据低于1KB时不压缩
指定压缩等级,可选值1~9
指定4个8KB的压缩空间,特点是边压缩边发送,所以32KB的空间是够用的。
四、缓存——指定客户端的缓存有效期
使用缓存的意义:
降低服务器的压力;
减少带宽占用。
实验:
客户端:192.168.18.1
服务器:192.168.18.254
1、设置客户端缓存有效期
2、测试
2.1 客户端访问服务器,可以得到页面。
2.2 服务端关闭nginx,客户端关闭浏览器---打开浏览器---访问192.168.18.254
nginx的安装应用的更多相关文章
- Nginx服务安装配置
1.Nginx介绍 Nginx是一个高性能的HTTP和反向代理服务器,由俄罗斯人开发的,第一个版本发布于2004年10月4日.Nginx由于出色的性能,在世界范围内受到了越来越多人的关注,其特点是占有 ...
- Django Nginx+uwsgi 安装配置
使用 python manage.py runserver 来运行服务器.这只适用测试环境中使用. 正式发布的服务,我们需要一个可以稳定而持续的服务器,比如apache, Nginx, lighttp ...
- mysql 自动备份和nginx自动安装脚本
一.自动备份Mysql脚本: 如下脚本为mysql自动备份脚本,仅供参考,可以根据实际情况修改. #!/bin/sh #auto backup mysql #wugk #Define PATH定义变量 ...
- nginx的安装
1,,nginx的安装 为什么使用nginx我就不多说了,很优秀的,请再行google 在安装前,先安装pcre,安装zlib,安装openssl,以及一些其他包 yum install -y gcc ...
- nginx编译安装
Nginx编译安装 1.nginx官网:http://wiki.nginx.org/Install下载:http://nginx.org/en/download.html 2.编译安装# wget h ...
- nginx 的安装
一.必要软件准备1.安装pcre 为了支持rewrite功能,我们需要安装pcre 复制代码代码如下: # yum install pcre* //如过你已经装了,请跳过这一步 2.安装openssl ...
- linux/centos下安装nginx(rpm安装和源码安装)详细步骤
Centos下安装nginx rpm包 ...
- nginx的安装与配置
1.nginx的安装与配置 编译安装nginx需要实现安装开发包组“Development tools”和“Server Platform Development”.“Desktop Platform ...
- nginx笔记----安装
nginx的安装 ./configure make && make install (一)准备条件: 1.GCC---gun编译器集合 Nginx是一个由C语言编写的程序,因此首先需要 ...
- Linux下Nginx的安装、升级及动态添加模块
系统基于ubuntu server 14.04.4 amd64 安装 第一步 下载并解压Nginx压缩包 从Nginx官网下载Nginx,或者在Linux上执行wget http://nginx.or ...
随机推荐
- Database hang and Row Cache Lock concurrency troubleshooting
http://www.dadbm.com/database-hang-row-cache-lock-concurrency-troubleshooting/ Issue backgroundThis ...
- Oracle数据库查询优化(上百万级记录如何提高查询速度)
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引.2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引 ...
- Maven快照机制(SNAPSHOT)
文章转自 http://www.cnblogs.com/EasonJim/p/6852840.html 以下引用自https://ayayui.gitbooks.io/tutorialspoint-m ...
- labellmg使用方法
https://www.cnblogs.com/Terrypython/p/9577657.html
- MongoDB数据库中更新与删除数据
MongoDB数据库中更新与删除数据 在MongoDB数据库中,可以使用Collection对象的update方法更新集合中的数据文档.使用方法如下所示: collection.update(sele ...
- mysql5.6.8源码安装
内核: [root@opop ~]# cat /etc/centos-release CentOS release 6.8 (Final)[root@opop ~]# uname -aLinux op ...
- 学习CSS布局 - position例子
position例子 通过具体的例子可以帮助我们更好地理解“position”.下面是一个真正的页面布局. 结果: 代码如下: <!DOCTYPE html> <html lang= ...
- Intellij实用技巧
快捷键 Tradition 快捷键 介绍 Ctrl + Z 撤销 Ctrl + Shift + Z 取消撤销 Ctrl + X 剪切 Ctrl + C 复制 Ctrl + S 保存 Tab 缩进 Sh ...
- React-使用combineReducers完成对数据对拆分管理
数据都放在reducer.js下不利于对数据进行管理,可以把一个大的reducer.js拆分成多个小的reducer.js. 小的reducer.js const defaultState={ foc ...
- WPF 模拟UI 键盘录入
原文:WPF 模拟UI 键盘录入 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/article/details/1835 ...