apache实现服务器负载均衡

1. 什么是负载均衡
负载均衡 (Load Balancing) 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

2.实现(我用的是反向代理来实现的)
1) 条件:3台服务器:103服务器,220服务器,200服务器,以220作为代理服务器,103和200为实际处理请求的服务器,以下简称为(103,220,200)

2) 利用php写一个测试程序,比如:我分别在103,220,200服务器apache的根目录(/var/www/html)新建一个文件:
vi /var/www/html/test/proxy_test.php
各个服务器上对应输出:“proxy test:103”,“proxy test:220”,“proxy test:200”

修改代理服务器220的apache的配置文件

    
    DocumentRoot /var/www/html
    ServerName test2.domain.com
    ErrorLog logs/test2.domain.com.com-error_log
    CustomLog logs/test2.domain.com.com-access_log common
    ProxyRequests Off  #开启反向代理
    #设置实际处理请求的代理服务器地址
       BalancerMember http://xx.xx.xx.200/test
       BalancerMember http://xx.xx.xx.103/test
       BalancerMember http://xx.xx.xx.220/test
    ProxyPass /test balancer://mycluster/
    ProxyPassReverse /test balancer://mycluster/

3) 以上配置的意思为:凡是访问test2.domain.com/test这个地址都会自动代理到

http://xx.xx.xx.200/test或http://xx.xx.xx.103/test或http://xx.xx.xx.220/test地址下

4) ProxyPass 这里我用的是‘/test’如果写成:ProxyPass / balancer://mycluster/,
那么其意思为:凡是访问test2.domain.com这个地址的都会自动代理到

http://xx.xx.xx.200/test或http://xx.xx.xx.220/test或http://xx.xx.xx.220/test地址下

5) 值得注意的是我这里写了一个代理请求的地址为http://xx.xx.xx.220/test,他其实为代理服务器的地址,但是如果直接这样按上面的写,他是不会有作用的,因为
test2.domain.com域名指向的是/var/www/html地址,而ip地址xx.xx.xx.220实际指向也是/var/www/html地址,所以当通过ip访问的时候,他还是会被代理到其他服务器,
所以我们还得将ip和/var/www/html再关联一遍,如下:

 
    DocumentRoot /var/www/html
    ServerName xx.xx.xx.220
    ErrorLog logs/xx.xx.xx.220-error_log
    CustomLog logs/xx.xx.xx.220-access_log common

注:加上上面的配置后,重启apache可能会报错
‘_default_ VirtualHost overlap on port 80, the first has precedence’
错误原因是:NameVirtualHost *:80被注释掉了,打开就好了

3.测试
访问test2.domain.com/test/proxy_test.php你会发现他会将请求均衡转向到

http://xx.xx.xx.200/test或http://xx.xx.xx.103/test或http://xx.xx.xx.220/test地址下

即会依次循环输出:“proxy test:200”,“proxy test:103”,“proxy test:220”

4.其他用法
1) ProxyPass和ProxyPassReverse的用法:
A) ProxyPass:
语法:ProxyPass [path] !|url

它主要是用作URL前缀匹配,不能有正则表达式,它里面配置的Path实际上是一个虚拟的路径,在反向代理到后端的url后,path是不会带过去的,使用示例:

a)ProxyPass /images/ !

这个示例表示,/images/的请求不被转发。

b)ProxyPass /mirror/foo/ http://backend.example.com/

我们假设当前的服务地址是http://example.com/,如果我们做下面这样的请求:

http://example.com/mirror/foo/bar

那将被转成内部请求:

http://backend.example.com/bar

注:配置的时候,不需要被转发的请求,要配置在需要被转发的请求前面。

B) ProxyPassReverse
语法:ProxyPassReverse [路径] url

它一般和ProxyPass指令配合使用,此指令使Apache调整HTTP重定向应答中Location, Content-Location, URI头里的URL,这样可以避免在Apache作为反向代理使用时,。后端服务器的HTTP重定向造成的绕过反向代理的问题。参看下面的示例:

 
    ProxyPass /example http://www.example.com/
    ProxyPassReverse /example http://www.example.com/

ProxyPassReverse的作用就是反向代理,如果没有加这样的反向代理设置的情况下,访问http://www.test.com/example/a,如果www.example.com对请求进行了redirect至http://www.example.com/b,那么,客户端就会绕过反向代理,进而访问http://www.test.com/example/b。如果设置了反向代理,则会在转交HTTP重定向应答到客户端之前调整它为http://www.test.com/example/a/b,即是在原请求之后追加上了redirect的路径。

C) ProxyPassMatch:
语法:ProxyPassMatch [regex] !|url

这个实际上是url正则匹配,而不是简单的前缀匹配,匹配上的regex部分是会带到后端的url的,这个是与ProxyPass不同的。使用示例:

a) ProxyPassMatch ^/images !

这个示例表示对/images的请求,都不会被转发。

b) ProxyPassMatch ^(/.*\.gif)$ http://backend.example.com$1

这个示例表示对所有gif图片的请求,都被会转到后端,如此时请求http://example.com/foo/bar.gif,那内部将会转换为这样的请求

http://backend.example.com/foo/bar.gif。

2) 反向代理其他分配方式(以上配置我使用的是平均分配,即每个服务器的请求次数是相同的)
1. 负载比例分配
打开 balancer-manager 的界面,可以看到请求是平均分配的。

如果不想平均分配怎么办?给 BalancerMember 加上 loadfactor 参数即可,取值范围为1-100。
比如你有三台服务器,负载分配比例为 7:2:1,只需这样设置:
Httpd.conf代码

    ProxyRequests Off 

        BalancerMember http://node-a.myserver.com:8080 loadfactor=7 
        BalancerMember http://node-b.myserver.com:8080 loadfactor=2 
        BalancerMember http://node-c.myserver.com:8080 loadfactor=1 

    ProxyPass / balancer://mycluster

2. 负载分配算法

默认情况下,负载均衡会尽量让各个服务器接受的请求次数满足预设的比例。如果要改变算法,可以使 用 lbmethod 属性。如:

Httpd.conf代码

    ProxyRequests Off

        BalancerMember http://node-a.myserver.com:8080 loadfactor=7 
        BalancerMember http://node-b.myserver.com:8080 loadfactor=2 
        BalancerMember http://node-c.myserver.com:8080 loadfactor=1 

    ProxyPass / balancer://mycluster 
    ProxySet lbmethod=bytraffic

lbmethod可能的取值有:
lbmethod=byrequests 按照请求次数均衡(默认)
lbmethod=bytraffic 按照流量均衡
lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器)

各种算法的原理请参见Apache的文档。

3) 热备份(Hot Standby)
热备份的实现很简单,只需添加 status=+H 属性,就可以把某台服务器指定为备份服务器:
Httpd.conf代码

    ProxyRequests Off 

        BalancerMember http://node-a.myserver.com:8080 
        BalancerMember http://node-b.myserver.com:8080 status=+H 

    ProxyPass / balancer://mycluster

即请求总是流向 node-a ,一旦node-a挂掉, Apache会检测到错误并把请求分流给 node-b。Apache会每隔几分钟检测一下 node-a 的状况,如果node-a恢复,就继续使用node-a。

 

本文参考文献:http://blog.51yip.com/apachenginx/873.html

http://koda.iteye.com/blog/465061

http://www.ayuelee.cn/apache-error-default-VirtualHost-overlap.html

http://blog.csdn.net/fenglibing/article/details/6796094

yum安装LAMP

1.安装mysql

[root@zhangchuan ~]# yum install mysql mysql-server

添加mysql开机启动

[root@zhangchuan ~]# chkconfig mysqld on

启动mysql

[root@zhangchuan ~]# /etc/init.d/mysqld start

设置 MySQL 数据 root 账户的密码:

[root@zhangchuan ~]# mysql_secure_installation

当出现如下提示时候直接按回车:

Enter current password for root

出现如下再次回车:

Set root password? [Y/n]

出现如下提示输入你需要设置的密码,回车后在输入一次确认:

New password:

接下来还会有四个确认,分别是:

Remove anonymous users? [Y/n]

Disallow root login remotely? [Y/n]

Remove test database and access to it? [Y/n]

Reload privilege tables now? [Y/n]

直接回车即可。

更改mysql的用户名:

mysql的用户都存在mysql数据库的user表中,

据说默认使用root用户不是很安全,

使用update user set user=’mysqlroot’更换用户名即可。

但别忘了刷新权限:flush privileges;

2.安装apache

[root@zhangchuan ~]# yum install httpd

添加apache开机启动:

[root@zhangchuan ~]# chkconfig httpd on

启动apache:

[root@zhangchuan ~]# /etc/init.d/httpd start

在 CentOS 中 Apache 的默认根目录是 /var/www/html,

配置文件 /etc/httpd/conf/httpd.conf。

其他配置存储在 /etc/httpd/conf.d/ 目录

3.安装php

[root@zhangchuan ~]# yum install php

重启apache

[root@zhangchuan ~]# /etc/init.d/httpd restart

测试php

[root@zhangchuan ~]# vi /var/www/html/info.php


4.php相关模块安装:

[root@zhangchuan ~]# yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc

重启apache

[root@zhangchuan ~]# /etc/init.d/httpd restart

5.memcahced安装:

        网上有的说要导入memcache库,但我安装的时候就是直接安装的,可能是centos版本不同

我的是CentOS release 6.3 (Final),内核为:2.6.32-279.el6.x86_64

关于导入包的的步骤可以查看:http://www.bootf.com/442.html

[root@zhangchuan ~]# yum install memcached php-pecl-memcache

添加memcache开机启动:

[root@zhangchuan ~]# chkconfig memcached on

启动memcached:

[root@zhangchuan ~]# /etc/init.d/memcached start

重启apache:

[root@zhangchuan ~]# /etc/init.d/httpd restart

测试php的memcache是否安装成功:

connect('127.0.0.1', 11211);
    $memcache->set('key', 'hello memcache!', 0, 60);
    $result = $memcache->get('key');
    echo $result;
?>

6. jdk安装:

yum install java-1.7.0-openjdk*

 

Linux建立代理服务器

1.    什么是代理服务器?

举个例子来说:比如A服务器需要访问B服务器,A可以直接访问B服务器,假如现在B服务器现在做了限制,只让C服务器可以访问他,此时A访问B时先可以先访问C,由C服务器来访问B服务器,将所得到的数据再返回A

2.    搭建环境

我使用的是squid工具,

1)    在linux上使用yum install squid就可以安装

2)    修改配置文件vi /etc/squid/squid.conf

将http_access deny all修改为http_access allow all,此时便可以使用代理了,(关于在浏览器中配置代理后面会详细讲到)

3)    指定固定ip可以代理,使用acl

http_access allow mytest

acl mytest src 223.21.146.148/29

4)    http_port

代理的端口号,默认为3128。

5)    启动

/etc/init.d/squid start

3.    浏览器配置,(以firefox为例)

选择Tools -> Options -> Advanced -> Network,填入代理服务器的IP,如下截图,保存后就可以使用代理服务器上网了

8d8e03cdgx6DAL8arGg78&690

 

代理服务器详细及更多配置请参见:http://blog.s135.com/book/squid/chap06.html

 

 

使用parse向手机端推送数据

许多时候为了让用户得到更好的应用体验,我们需要主动向用户的手机端推送消息,近几天特别研究了下parse的数据推送

简介:当push的次数少于1000,000次时,是免费的,如果超过1000,000则按1000次7美分收费,具体介绍可参考www.parse.com

1. 首先你需要在www.parse.com网站注册一个应用账号,进入你的app页面Create a new app

1

 

2. 创建完成后网页会自动跳转到你所创建应用的详情页面

2

 

你可以根据应用的Application ID和Client Key制作一个android或ios应用

android或ios的应用制作就不介绍了,这里主要讲讲,服务端如何向parse网站发送信息,parse再转发给手机端

3. 对于服务端向parse发送信息,在其官网给出了实例,官方主推是使用curl或者python,

当然还有第三方的类库(api libraries), 我们可以进入其官方的文档页面查看push的基本用法

3

一个基本的例子:

4

一一介绍下上面的这个实例的参数值:

Application_id:为你创建app的application_id

Rest_api_key:为你创建app的rest_api_key

Content_type:为数据传输的格式,一般为json

Channels为:服务器向parse发送的channel (服务器要推送信息到手机端之前,手机端会先创建一个channels,然后服务器会对channel发送信息,这样手机端就可以收到推送

的信息了)

Data: 故名思意,为所传的信息,这里是以系统通知的方式将信息呈现给用户

注:关于channels的查看如下图:首先你需要测试parse网站是否可以将信息发送给手机端,你可以选择一个或多个channel, 在pushData中输入需要推送的信息,点击send to channel, 确保手机机端可以收到

5

6

 

3. 将上面的curl实例填写完整, 在安装了curl的linux系统下即可测试

4. 以上实例的原理其实就是根据application_id和rest_api_key发送了一个post请求,所以我们可以模拟上面的实例自己使用其它语言来完成这个post请求,这里我使用的是java语言(这里用到了http这个类库)

package com.business;

import java.util.HashMap;
import java.util.Map;
import net.sf.json.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class DataPush {

private static final String APPLICATION_ID = "3hBQIQxDGMqsqnWk2XP7433JlA3sLcmMvlQgy8QR";
private static final String REST_API_KEY = "V7sukAdviPtr1eQukjbgmuGISRIFAr0r8tiZwJhB";
private static final String PUSH_URL = "https://api.parse.com/1/push";

public static void main(String[] args) {
    String[] channels = new String[]{"testsddg"};
    String type = "android";
    Map<String, String> data = new HashMap<String, String>();
    data.put("alert", "push data test");

    try {
       new DataPush().sendPost(channels, type, data);
    } catch (Exception e) {
       e.printStackTrace();
    }
}

private void sendPost(String[] channels, String type, Map<String, String> data) throws Exception {
    JSONObject jo = new JSONObject();
    jo.put("channels", channels);
    if(type != null) {
    //如果type为空,默认android和ios都发送
        jo.put("type", type);
    }
    jo.put("data", data);

    this.pushData(jo.toString());
}

private void pushData(String postData) throws Exception {
    DefaultHttpClient httpclient = new DefaultHttpClient();
    HttpResponse response = null;
    HttpEntity entity = null;
    String responseString = null;
    HttpPost httpost = new HttpPost(PUSH_URL);
    httpost.addHeader("X-Parse-Application-Id", APPLICATION_ID);
    httpost.addHeader("X-Parse-REST-API-Key", REST_API_KEY);
    httpost.addHeader("Content-Type", "application/json");
    StringEntity reqEntity = new StringEntity(postData);
    httpost.setEntity(reqEntity);
    response = httpclient.execute(httpost);
    entity = response.getEntity();
    if (entity != null) {
        responseString = EntityUtils.toString(response.getEntity());
    }

    System.out.println(responseString);
}

}

 

以航班动态数据推送为例

1. 当用户选择自己需要订阅的航班后,手机端会创建一个以航班号命名的channel,

此时也会将这个航班号传给服务器一份,服务器收到这个航班号后,会在数据库中查找当天这个航班是否已被订阅过,如果未被订阅,则将这个航班保存到数据库,订阅次数设为1,否则只需将此航班订阅数+1

2. 当用户取消自己订阅的航班后,手机端则只需将这个航班号传给服务器一份,服务器只需将这个航班订阅数-1即可

3. 服务器端会不停的扫描当天已订阅的航班(订阅次数>0), 如果这个航班的状态发生变化,则服务器只需对以这个航班命名的channel推送一条通知,即所有订阅这个航班的用户都可以收到这个航班的状态变化通知

 

使用rsa算法进行数据通信加密

RSA算法简介

它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。

4

需求:

5XEYK4X8Y_0I4R[A}8WUE@H

服务端实现

1. 首先需要在服务器上生成秘钥及证书文件,如下:

#yum install openssl

#mkdir /data/ssl

#cd /data/ssl

生成证书所需要的密钥文件:

#openssl genrsa -des3 -out service.key 1024

#openssl req -new -key service.key -out service.csr

#openssl rsa -in service.key -out service.key

1

根据密钥生成证书

#openssl x509 -req -days 365 -in service.csr -signkey service.key -out service.crt

截止,/data/ssl下会有如下文件:

service.key     service.csr     service.crt

查看密钥:

openssl asn1parse -out temp.ans -i -inform PEM < service.key

3

2. 代码示例

1) JS代码

var xmlHttp;

var rsa_n = "B4B5991A359BA0BFAB36A81688909A5128309B5460859AFAEB4251726AFF0DC8455FE6364FE5BD2C6A92B88FD551E94A63CE9F086FC1146869A48D03D2F45E1F13C0DC6BA1A2AEA0B60999AB1AEA45997ABEBF9209FE27C3EB22A82CA2AAD15BEC8EC6FC8731A8BC70B1E24D6F9EABDCE45C3329BF5748A29CF251B1723DA253"; //公钥

setMaxDigits(131);

var key = new RSAKeyPair("10001", '', rsa_n);

function showResult(b) {

if (check_fno(b)) {

alert("请输入正确航班号!")

} else {

xmlHttp = GetXmlHttpObject();

if (xmlHttp == null) {

alert("Browser does not support HTTP Request");

return

}

b = encryptedString(key,b);

var host_name = encryptedString(key,window.location.host);

var a = "getstatus.php";

a = a + "?q=" + b;

a = a + "&_host=" + host_name;

a = a + "&sid=" + Math.random();

xmlHttp.onreadystatechange = stateChanged;

xmlHttp.open("GET", a, true);

xmlHttp.send(null)

}

}

2) PHP代码:

define("CRT", "/data/ssl/service.crt"); //公钥文件
define("PEM", "/data/ssl/service.key"); //私钥文件
/**
 * 私钥解密
 *
 * @param string 密文(base64编码)
 * @param string 密钥文件(.pem/.key)
 * @param string 密文是否来源于JS的RSA加密
 * @return string 明文
 */
function privatekey_decodeing($crypttext, $fileName,$fromjs = FALSE)
{
    $key_content = file_get_contents($fileName);
    $prikeyid    = openssl_get_privatekey($key_content);
    $crypttext   = base64_decode($crypttext);
    $padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING;
    if (openssl_private_decrypt($crypttext, $sourcestr, $prikeyid, $padding))
    {
        return $fromjs ? rtrim(strrev($sourcestr), "\0") : "".$sourcestr;
    }
    return FALSE;
}

/**
 * 公钥加密
 *
 * @param string 明文
 * @param string 证书文件(.crt)
 * @return string 密文(base64编码)
 */
function publickey_encodeing($sourcestr, $fileName)
{
    $key_content = file_get_contents($fileName);
    $pubkeyid    = openssl_get_publickey($key_content);
    if (openssl_public_encrypt($sourcestr, $crypttext, $pubkeyid))
    {
        return base64_encode("" . $crypttext);
    }
    return False;
}

$q=strtoupper($_GET["q"]);
$q = base64_encode(pack("H*", $q));
$q = privatekey_decodeing($q, PEM, TRUE);
/*
数据处理
*/
echo $s;

 

Linux之FTP

1. 安装FTP

yum install vsftpd

chkconfig vsftpd on

2. 添加用户

useradd -d /data/ftpData1 -s /sbin/nologin ftpuser1

passwd ftpuser1

userdel ftpuser1 //删除用户

3. 更改用户组和授予权限

chown –R ftpuser1 /data/ftpData1

chmod 755 /data/ftpData1

4. 启动ftp

service vsftpd start

5. 测试登陆

1)    使用客服端工具,或者是ftp命令

若不能使用ftp命令,使用yum install ftp

2)    ftp 192.168.1.88

输入用户名和密码

Mysql数据同步(单向)

首先准备两台服务器:

主:192.168.1.88

从:192.168.1.78

创建需要同步的数据库,比如为sync_db,将这个数据库各拷贝到78和88一份

 G4QQP36U9$){EF9`N2AZP(O

 

修改主服务器88上的配置,找到my.cnf文件,若不知道位置,可以使用

#find / -name “my.cnf”找到

#vi /etc/my.cnf

添加:

#88 master server

server-id=100088

log-bin

binlog_do_db=sync_db

解释:

1)      server-id:标识,唯一,值范围在:1至2^23-1

2)      log-bin:配置是否在数据库有变动时写二进制日志,在mysql的的数据目录下回生成

mysqld-bin.000001的文件。

可在mysql命令行通过show variables like ‘%bin’;查看是否开启,ON表示已开启。

3)      binlog_do_db:同步的数据库

修改从服务器78的配置,在my.cnf中添加

#23 slave server

server-id=100078

master-host=192.168.1.88

master-user=root

master-password=123456

master-port=3306

master-connect-retry=60

replicate-do-table=sync_db.c_user

replicate-do-table=sync_db.c_citys

解释:

1)      master-host, master-user, master-password, master-port分别为主服务器的主机IP,用户,密码,端口

2)      master-connect-retry为:尝试连接的最大时间,单位为秒

3)      replicate-do-table为:同步的表,也可以使用replicate-do-db=sync_db同步整个数据库

 

重启主服务器和从服务器

#service mysqld restart

主服务器数据库目录下会生成mysqld-bin.index和mysqld-bin.000001文件

mysqld-bin.000001为主服务器操作的记录,包括sql语句等

从服务器数据库目录会生成:

master.info

relay-log.info

mysql-bin.index

mysql-bin.000001

mysqld-relay-bin.index

mysqld-relay-bin.000001

测试同步

更改主服务器88上的数据

insert into c_user(name,sex,age,address) values(‘zhangsan’,’1′,20,’beijing’);

可看到从服务器上也同时插入了一条数据

查看主从服务器同步状态

主服务器

mysql>show master status

 2

从服务器

3

解释:

1)  Slave_IO_Running和Slave_SQL_Running的值均为Yes时为同步开启;

2)  Last_Errno和Last_Error是错误信息的提示(如果有错误)

 

故障修复:

若发现从服务器数据中断,可使用change重新定位同步点,如下:

stop slave; # MySQL 返回的查询结果为空 (即零行)。

CHANGE MASTER TO

MASTER_HOST=’192.168.1.88′,

MASTER_LOG_FILE=’mysqld-bin.000043′,

MASTER_LOG_POS=464512808;# MySQL 返回的查询结果为空 (即零行)。

start slave;# MySQL 返回的查询结果为空 (即零行)。

MASTER_LOG_FILE和MASTER_LOG_POS为主服务器上的同步二进制文件同步点

可通过show master status查看

 

 

机会握在自己手里

2012073006430817主动一点,多想一点,你就有了思考力和主见;多了解一点,多问一点,多学一点,你就有了知识面和经验;勤快一点,多做一点,你就有了行动力和能力;坚强一点,开朗一点,豁达一点,冷静一点,你就有了好性格;别埋怨别人,也别责怪自己,机会握在自己手里。

没有人可以做你的双拐,你必须学会独立去闯荡;犯错的时候,要勇于承担,畏缩虽是一种自保,但当他人把你看扁的时候,你就彻底淡出了成功的机遇之外。再困难,咬咬牙,总会过去的;再犯错,不孤独,一切还可以重来。

在生活中,要做好受伤的准备,因为,受伤也是生活的一部分。但如果你总是受伤,一定是太在乎自己了。有时候,太把自己当盘菜,原本就是人生中一道难以治愈的暗伤。

守住宁静,让一切归于心境,不因喜欢而执着,不因虚幻而烦忧。守住宁静,让一切融于慈悲,不因伤害而远离,不因得失而分别;惟有内心的平静,伴随你一 生的旅途;惟有内心的平等,滋养你相续的菩提;追逐的快乐,会静静地开花结果;摒弃掉浮躁,能给重压的心灵松绑,不要在虚妄中丢失了自我。

   宁可自信,也不要盲目悲观。因为自信是一种力量,即使你的自信有些盲目,也无关大局,你可以在实践中调整心态,找到自己的恰当的位置。