由于没有服务器,所以使用虚拟机,所有操作都是在ubuntu14中操作的,在操作前需克隆多个虚拟机。
ubuntu14 设置可以选择账户登录账户:
切换到root用户: sudo -s
设置密码:sudo passwd root
cd /usr/share/lightdm/lightdm.conf.d/
编辑 50-ubuntu.conf文件, 增加greeter-show-manual-login=true
开机就选用root用户
修改 vim /etc/ssh/sshd_config
把# Authentication:
LoginGraceTime 120
PermitRootLogin without passwd
StrictModes yes
改成
#Authentication:
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes
ubuntu14安装openssh-server报Depends: openssh-client (= 1:7.2p2-4ubuntu2.1)错误
解决:sudo apt-get install openssh-client=(1:7.2p2-4ubuntu2.1)版本号会在在错误后面会显示
apt-get remove 与 apt-get purge
存在版本在无法安装时,可以先卸载
rpurge是会删除配置文件 remove不会
添加ppa:
- add-apt-repository ppa:webupd8team/java;
- apt-get update 是更新sources.list.d下载列表 ,upgrade 是更新已经安装的软件包,一般是在upgrade前先update;
- 安装oracle-java-installer:( 默认选择条款 )
- echo oracle-java7-installer shared/accepted-oracle-license-v1-1 select true | sudo/usr/bin/debconf-set-selections;
设置系统默认JDK:(也可以用于切换)- sudo update-java-alternatives -s java-7-oracle;
测试安装成功:- java -version;
- tar -xzvf 解压下载的tar.gz的安装包
- 修改环境变量:
sudo vim ~/.bashrc
#set oracle jdk environment
export JAVA_HOME=/home/pwade/jdk1.7/jdk1.7.0_67/jdk1.7.0_67
export JRE_HOME=$ {JAVA_HOME}/jre
export CLASSPATH=. :$ {JAVA_HOME}/lib:$ {JRE_HOME}/lib
export PATH=$ {JAVA_HOME}/bin:$PATH- 立马生效:
source ~/.bashrc- 设置系统默认jdk 版本
sudo update-alternatives --install /usr/bin/java java /home/pwade/jdk1.7/jdk1.7.0_67/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /home/pwade/jdk1.7/jdk1.7.0_67/bin/javac 300
sudo update-alternatives --install /usr/bin/jar jar /home/pwade/jdk1.7/jdk1.7.0_67/bin/jar 300
sudo update-alternatives --install /usr/bin/javah javah /home/pwade/jdk1.7/jdk1.7.0_67/bin/javah 300
sudo update-alternatives --install /usr/bin/javap javap /home/pwade/jdk1.7/jdk1.7.0_67/bin/javap 30- sudo update-alternatives --config java
- 测试:java -version
- https://tomcat.apache.org/download-70.cgi 下载安装
- tar -xzvf 解压,在start.sh文件中添加:
#配置 java 环境
export JAVA_HOME=/home/pwade/jdk1.7/jdk1.7.0_67/jdk1.7.0_67
export JRE_HOME= J A V A H O M E / j r e e x p o r t C L A S S P A T H = . : e x p o r t P A T H = {JAVA_HOME}/jre export CLASSPATH=.:%{JAVA_HOME}/lib:%{JRE_HOME}/lib export PATH= JAVAHOME/jreexportCLASSPATH=.:exportPATH={JAVA_HOME}/bin:$PATH
#配置tomcat安装路径
export TOMCAT_HOME=/home/pwade/tomcat7/apache-tomcat-7.0.91- setclasspath.sh文件中添加:
export JAVA_HOME=/home/pwade/jdk1.7/jdk1.7.0_67/jdk1.7.0_67
export JRE_HOME=${JAVA_HOME}/jre
流程:编写一个location拦截规则,并指定proxy_pass为需要代理的服务器,下图是展示反向代理本地tomcat
负载均衡就是在nginx中http服务器中定义upstream,并在其中配置需要负载均衡的服务器ip,并在prox_pass中引用即可(名称要一致)。
//负载均衡具体代码实现
upstream blank {
# 解决session共享问题,其实就是防止同个用户访问通过负载均衡访问到两个服务器而导致需要重 复登录问题
#ip_hash;
server 192.168.15.131:8080 weight=2; #weight-是指权重
server 192.168.1.132:8080 weight=1;
}
server {
#nginx监听80端口,请求该端口时转发到真实目标
listen 80;
#配置访问域名
server_name localhost;
location / {
#这里配置代理是指上面定义的两个被代理目标,blank名字必须一致
proxy_pass http://blank;
#proxy_redirect off;
#如果是非80端口,配置为Host $host:端口号,目的是将代理服务器收到的用户的信息传到真实服务器上
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
add_header Access-Control-Allow-Origin *;
}
#此处定义500 502 503 504的错误页面
error_page 500 502 503 504 /50x.html;
#错误页面位置
location = /50x.html {
#root表示路径 html为nginx安装目录中的html文件夹
#位于/usr/local/nginx/html/下
root html;
}
}
负载均衡五种权重分配
- 轮询(默认)
概念:每个请求按时间顺序逐一分配到不同的后端服务器,后端服务器down掉,能自动剔除- weight
概念:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例子:
upstream backend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}- ip_hash
概念:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例子:
upstream backend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}- fair(第三方)
概念:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
例子:
upstream backend {
server server1.linuxany.com;
server server2.linuxany.com;
fair;
}- url_hash(第三方)
概念:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
例子:
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}- 定义负载均衡设备的Ip及设备状态
upstream backend{
ip_hash; # ip_hash指令不能与weight、backup变量一起使用
server 127.0.0.1:9090 down;
server 127.0.0.1:8080;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
backup含义:
只要在希望成为后备的服务器ip后面多添加一个backup参数,这台服务器就会成为备份服务器,在平时不使用,nginx不会给它转发任何请求。只有当其他节点全部无法连接的时候(忙或者down),nginx才会启用这个节点。一旦有可用的节点恢复服务,该节点则不再使用,又进入后备状态。
down 含义:
表示当前服务器不参与负载均衡。
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
以上三行,目的是将代理服务器收到的用户的信息传到真实服务器上。
(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (/) 当有匹配成功时候,停止匹配,按当前匹配规则处理请求
location ~* /js/.*/\.js 以 = 开头,表示精确匹配;如只匹配根目录结尾的请求,后面不能带任何字符串。 以^~ 开头,表示uri以某个常规字符串开头,不是正则匹配 以~ 开头,表示区分大小写的正则匹配; 以~* 开头,表示不区分大小写的正则匹配 以/ 开头,通用匹配, 如果没有其它匹配,任何请求都会匹配到 !~ 区分大小写不匹配 !~* 不区分大小写不匹配
# ^~ 不是正则表达式匹配url开头
#规则:匹配以jsp结尾的文件(~* \.(jsp)$) 、只匹配index和second页面 (~* /demo/(index.jsp|second.jsp)$)、匹配以demo开头的url路径 (^~ /demo/)
location ~* /demo/(index.jsp)$ {
#这里配置代理是指上面定义的两个被代理目标,blank名字必须一致
# proxy_pass http://blank;
rewrite ^/demo/index.jsp$ /demo/second.jsp break;
#rewrite ^/demo/index.jsp /demo/second.jsp last;
#proxy_redirect off;
#这个变量开启后,我们才能自定义错误页面,当后端返回404,nginx拦截错误定义错误页面
proxy_intercept_errors on;
#如果是非80端口,配置为Host $host:端口号,目的是将代理服务器收到的用户的信息传到真实服务器上
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
add_header Access-Control-Allow-Origin *;
}
if指令
语法:if(condition){…}
作用域:server,location
if ($ http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break; }return指令
语法:return code;
作用域:server,location,ifset指令
语法:set variable value;
作用域:server,location,ifuninitialized_variable_warn指令
作用域:http,server,location,if
语法:uninitialized_variable_warn on | off;rewrite指令
从一个location跳转到另一个location,不过这样的循环最多可以执行10次,超过后nginx将返回500错误。
作用域:server,location,if
语法:rewrite regex replacement [flag];
小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。
rewrite 指令的flag标志位:
last : 相当于Apache的[L]标记,表示完成rewrite
break : 停止执行当前虚拟主机的后续rewrite指令集
redirect : 返回302临时重定向,地址栏会显示跳转后的地址
permanent : 返回301永久重定向,地址栏会显示跳转后的地址
break 和 last区别:
(1)last 和 break 当出现在location 之外时,两者的作用是一致的没有任何差异。
注意一点就是,他们会跳过所有的在他们之后的rewrite 模块中的指令,去选择自己匹配的location
(2)last 和 break 当出现在location 内部时,两者就存在了差异:
两者的区别在于当rewrite指令存在于localtion区块时, last跳出localtion块, 重新从server开始进行localtion匹配; 而break跳过localtion下的后续rewrite规则, 执行其他指令.redirect与permanent 关系:
这两个flag是进行重定向(302临时, 301永久), 重定向以后的url也会显示在地址栏, nginx处理这两个是会中断流程, 通过http请求告诉用户端进行重定向, 也就是这次请求不需要进过后端服务,由nginx全职负责.
- if 全局变量列表:
$ args #这个变量等于请求行中的参数,同$query_string;
$ content_length #请求头中的Content-length字段;
$content_type #请求头中的Content-Type字段;
$document_root #当前请求在root指令中指定的值,如:root /var/www/html;
$host #请求主机头字段,否则为服务器名称;
$http_user_agent #客户端agent信息;
$http_cookie #客户端cookie信息;
$limit_rate #这个变量可以限制连接速率;
$request_method #客户端请求的动作,通常为GET或POST;
$remote_addr #客户端的IP地址;
$remote_port #客户端的端口;
$remote_user #已经经过Auth Basic Module验证的用户名;
$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成;
$scheme #HTTP方法(如http,https);
$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1;
$server_addr #服务器地址,在完成一次系统调用后可以确定这个值;
$server_name #服务器名称;
$server_port #请求到达服务器的端口号;
$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”;
KaTeX parse error: Expected 'EOF', got '#' at position 20: … #̲不带请求参数的当前URI,uri不包含主机名,如”/foo/bar.html”;
KaTeX parse error: Expected 'EOF', got '#' at position 20: …ment_uri #̲与uri相同,例:http://localhost:88/test1/test2/test.php;
location中开启错误页面拦截(proxy_intercept_errors on)–》定义错误页面( error_page )–》定义location拦截规则,拦截后到指定的目录寻找页面,如下图定义的 /usr/local/nginx/html/
//代码实现
location ~* /demo/(index.jsp)$ {
#这里配置代理是指上面定义的两个被代理目标,blank名字必须一致
# proxy_pass http://blank;
rewrite ^/demo/index.jsp$ /demo/second.jsp break;
#rewrite ^/demo/index.jsp /demo/second.jsp last;
#proxy_redirect off;
#这个变量开启后,我们才能自定义错误页面,当后端返回404,nginx拦截错误定义错误页面
proxy_intercept_errors on;
#如果是非80端口,配置为Host $host:端口号,目的是将代理服务器收到的用户的信息传到真实服务器上
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
add_header Access-Control-Allow-Origin *;
}
#此处定义500 502 503 504的错误页面
error_page 500 502 503 504 /404.html;
#错误页面位置,与上面路径需要对应。
location = /404.html {
#root表示路径 html为nginx安装目录中的html文件夹
#位于/usr/local/nginx/html/下
root /usr/local/nginx/html/;
}
自己对nginx的理解,有错误麻烦各位指出,谢谢!