ubuntu12.04下vncserver的安装

  1. 安装:
    1
    sudo apt-get install vnc4server
  2. 启动:
    1
    vncserver :1

关闭:

1
vncserver -kill :1

还需配置图形界面:
配置~/.vnc/xstartup

1
2
3
4
5
6
7
8
9
10
11
12
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
# exec /etc/X11/xinit/xinitrc

# 中间部分配置不变

# x-window-manager &
export DESKTOP_SESSION=ubuntu-2d
# 这个 `ubuntu-2d`参考 `/usr/share/gnome-session/sessions/` 下的文件名设置成不同的值:
export GDMSESSION=ubuntu-2d
export STARTUP="/usr/bin/gnome-session --session=ubuntu-2d"
$STARTUP

别漏了最后的$STARTUP。
完整配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh
# Uncomment the following two lines for normal desktop:
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
# exec /etc/X11/xinit/xinitrc
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
export DESKTOP_SESSION=ubuntu-2d
export GDMSESSION=ubuntu-2d
export STARTUP="/usr/bin/gnome-session --session=ubuntu-2d"
$STARTUP

然后再启动vncserver就可以远程用vncviewer登录访问图形界面了。
启动:

1
vncserver :1

关闭:

1
vncserver -kill :1

例如win7下使用vncviewer,vncserver栏里输入ip和端口号10.2.2.147:1,其他保持默认,让vncserver选择。输入vncserver端启动vncserver :1时用户的密码。即可登录。

  • vnc远程桌面屏幕大小:
    在运行vncserver的时候可通过指定参数,在适合的屏幕下进行图形界面的访问。
    1
    2
    3
    vncserver -geometry 1600x900 -depth 24 :1
    vncserver -geometry 1920x1080 -depth 32 :1
    vncserver -geometry 1900x1000 :1

hdfs编程

Eclipse/mvn下使用hdfs的java API

  1. 首先下载J2EE版本的Eclipse,这样eclipse里能自带maven,省得自己下载和配置了。
  2. 建立mvn工程,或者建立java工程后转为mvn工程。
  3. 下载hadoop并解压,记录一下本地库的路径。(我的为/usr/local/hadoop/lib/native)由于要使用hdfs的新feature(hdfs storagepolicies),所以安装的是目前最新的2.7.1版。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    hdfs storagepolicies -listPolicies
    # 结果
    Block Storage Policies:
    BlockStoragePolicy{COLD:2, storageTypes=[ARCHIVE], creationFallbacks=[], replicationFallbacks=[]}
    BlockStoragePolicy{WARM:5, storageTypes=[DISK, ARCHIVE], creationFallbacks=[DISK, ARCHIVE], replicationFallbacks=[DISK, ARCHIVE]}
    BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}
    BlockStoragePolicy{ONE_SSD:10, storageTypes=[SSD, DISK], creationFallbacks=[SSD, DISK], replicationFallbacks=[SSD, DISK]}
    BlockStoragePolicy{ALL_SSD:12, storageTypes=[SSD], creationFallbacks=[DISK], replicationFallbacks=[DISK]}
    BlockStoragePolicy{LAZY_PERSIST:15, storageTypes=[RAM_DISK, DISK], creationFallbacks=[DISK], replicationFallbacks=[DISK]}
    以温数据的策略为例,当前的策略是:把温数据存储到磁盘或归档设备中(storageTypes=[DISK, ARCHIVE]),如果创建文件时无法访问指定的设备,则回退到磁盘或归档设备中(creationFallbacks=[DISK, ARCHIVE]),如果创建副本时无法访问指定设备则回退到磁盘或归档设备中(replicationFallbacks=[DISK, ARCHIVE])。
  4. 编写pom.xml文件:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>Runner</groupId>
    <artifactId>Runner</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <hadoop.version>2.7.1</hadoop.version>
    <jackson.version>2.5.0</jackson.version>
    </properties>
    <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
    <scope>test</scope>
    </dependency>

    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-minicluster</artifactId>
    <version>${hadoop.version}</version>
    </dependency>
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>${hadoop.version}</version>
    </dependency>
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-assemblies</artifactId>
    <version>${hadoop.version}</version>
    </dependency>
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-maven-plugins</artifactId>
    <version>${hadoop.version}</version>
    </dependency>
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>${hadoop.version}</version>
    </dependency>
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>${hadoop.version}</version>
    </dependency>
    </dependencies>
    <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
    <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.3</version>
    <configuration>
    <source>1.8</source>
    <target>1.8</target>
    </configuration>
    </plugin>
    </plugins>
    </build>
    </project>
    我是用java工程转的mvn工程,所以可能其他配置有所不同。但dependency应该是差不多的。hadoop版本为2.5.2,可以灵活修改properties部分的hadoop.version
  5. 把之前记录的hadoop库地址配置进运行配置里,(Run configuration里在vm arguments里填上:
    1
    -Djava.library.path=/usr/local/hadoop/lib/native
    )这样虚拟机运行的时候就能去本地库目录下调用hadoop*.so等文件了
  6. 编写java文件:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    import java.util.Date;

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.BlockLocation;
    import org.apache.hadoop.fs.FSDataInputStream;
    import org.apache.hadoop.fs.FSDataOutputStream;
    import org.apache.hadoop.fs.FileStatus;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.hdfs.DistributedFileSystem;
    import org.apache.hadoop.hdfs.DFSClient.*;
    import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
    import org.apache.hadoop.hdfs.server.namenode.dfsclusterhealth_jsp;

    public class HadoopFSOperations {

    private static Configuration conf = new Configuration();
    private static final String HADOOP_URL = "hdfs://feng:9000";
    private static final String ENCODE = "utf-8";
    private static FileSystem fs;

    private static DistributedFileSystem hdfs;

    static {
    try {
    FileSystem.setDefaultUri(conf, HADOOP_URL);
    fs = FileSystem.get(conf);
    hdfs = (DistributedFileSystem) fs;
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    /**
    * 列出所有DataNode的名字信息
    */
    public void listDataNodeInfo() {
    try {
    DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats();
    String[] names = new String[dataNodeStats.length];
    System.out.println("List of all the datanode in the HDFS cluster:");

    for (int i = 0; i < names.length; i++) {
    names[i] = dataNodeStats[i].getHostName();
    System.out.println(names[i]);
    }
    System.out.println(hdfs.getUri().toString());
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    /**
    * 查看文件是否存在
    */
    public void checkFileExist(String filepath) {
    try {
    Path f = new Path(filepath);
    boolean exist = fs.exists(f);
    System.out.println("Whether exist of this file:" + exist);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    public void deleteFile(String filepath) {
    try {
    Path f = new Path(filepath);
    boolean exist = fs.exists(f);
    System.out.println("Whether exist of this file:" + exist);
    // 删除文件
    if (exist) {
    boolean isDeleted = hdfs.delete(f, false);
    if (isDeleted) {
    System.out.println("Delete success");
    }
    } else {
    System.out.println("file not found:" + filepath);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    /**
    * 创建文件到HDFS系统上
    */
    public void createFile(String filepath, String content) {
    try {
    Path f = new Path(filepath);
    System.out.println("Create and Write :" + f.getName() + " to hdfs");

    FSDataOutputStream os = fs.create(f, true);
    Writer out = new OutputStreamWriter(os, ENCODE);// 以UTF-8格式写入文件,不乱码
    out.write(content);
    out.close();
    os.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    /**
    * 读取本地文件到HDFS系统<br>
    * 请保证文件格式一直是UTF-8,从本地->HDFS
    */
    public void copyFileToHDFS(String localFile, String hdfsFile) {
    try {
    Path f = new Path(hdfsFile);
    File file = new File(localFile);

    FileInputStream is = new FileInputStream(file);
    InputStreamReader isr = new InputStreamReader(is, ENCODE);
    BufferedReader br = new BufferedReader(isr);

    FSDataOutputStream os = fs.create(f, true);
    Writer out = new OutputStreamWriter(os, ENCODE);

    String str;
    while ((str = br.readLine()) != null) {
    out.write(str + "\n");
    }
    br.close();
    isr.close();
    is.close();
    out.close();
    os.close();
    System.out.println("Write content of file " + file.getName() + " to hdfs file " + f.getName() + " success");
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    /**
    * 取得文件块所在的位置..
    */
    public void getLocation(String filePath) {
    try {
    Path f = new Path(filePath);
    FileStatus fileStatus = fs.getFileStatus(f);

    BlockLocation[] blkLocations = fs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
    for (BlockLocation currentLocation : blkLocations) {
    String[] hosts = currentLocation.getHosts();
    for (String host : hosts) {
    System.out.println(host);
    }
    }
    // 取得最后修改时间
    long modifyTime = fileStatus.getModificationTime();
    Date d = new Date(modifyTime);
    System.out.println("取得最后修改时间:\n" + d);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    // 文件重命名
    public void rename(String oldName, String newName) {
    Path oldPath = new Path(oldName);
    Path newPath = new Path(newName);
    boolean isok = false;
    try {
    isok = hdfs.rename(oldPath, newPath);
    } catch (IOException e) {
    e.printStackTrace();
    }
    if (isok) {
    System.out.println("rename ok!");
    } else {
    System.out.println("rename failure");
    }
    }

    // 创建目录
    public void mkdir(String path) {
    Path srcPath = new Path(path);
    boolean isok = false;
    try {
    isok = hdfs.mkdirs(srcPath);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    if (isok) {
    System.out.println("create dir ok!");
    } else {
    System.out.println("create dir failure");
    }
    }

    /**
    * 读取hdfs中的文件内容
    */
    public void readFileFromHdfs(String filePath) {
    try {
    Path f = new Path(filePath);

    FSDataInputStream dis = fs.open(f);
    InputStreamReader isr = new InputStreamReader(dis, ENCODE);
    BufferedReader br = new BufferedReader(isr);
    String str;
    while ((str = br.readLine()) != null) {
    System.out.println(str);
    }
    br.close();
    isr.close();
    dis.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    /**
    * list all file/directory
    *
    * @param args
    * @throws IOException
    * @throws IllegalArgumentException
    * @throws FileNotFoundException
    */
    public void listFileStatus(String path) throws FileNotFoundException, IllegalArgumentException, IOException {
    FileStatus fileStatus[] = fs.listStatus(new Path(path));
    int listlength = fileStatus.length;
    for (int i = 0; i < listlength; i++) {
    if (fileStatus[i].isDirectory() == false) {
    System.out
    .println("filename:" + fileStatus[i].getPath().getName() + "\tsize:" + fileStatus[i].getLen());
    } else {
    String newpath = fileStatus[i].getPath().toString();
    listFileStatus(newpath);
    }
    }
    }

    public static void main(String[] args) {
    // default dir : /user/root
    String createdFile = "/user/hadoop/test1";
    String content = "测试上传文件";
    String localFile = "/root/Downloads/hdfs编程.md";
    String hdfsFile = "/user/hadoop/fromLocal";
    String dirName = "/user/hadoop/dir1";
    String oldName = hdfsFile;
    String newName = "/user/hadoop/fromLocal_newname";
    //

    HadoopFSOperations a = new HadoopFSOperations();
    a.listDataNodeInfo();
    a.createFile(createdFile, content);
    a.checkFileExist(createdFile);
    a.copyFileToHDFS(localFile, hdfsFile);
    a.getLocation(createdFile);
    a.readFileFromHdfs(createdFile);
    a.deleteFile(newName);
    a.mkdir(dirName);
    a.rename(oldName, newName);

    try {
    a.listFileStatus(HADOOP_URL + "/");
    hdfs.close();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    注意灵活修改自己的HADOOP_URL
    我这台机器是ubuntu 12.04
    hosts文件里把127.0.1.1那行删掉改成自己的ip和机器名。
    而且有运行hdfs。所以一切安好,运行后木有warning。
  • 设置hdfs每个数据卷的保留空间:hdfs-site.xml
    1
    2
    3
    4
    5
    6
    <property>
    <name>dfs.datanode.du.reserved</name>
    <value>6000000000</value>
    <description>Reserved space in bytes per volume. Always leave this much space free for non dfs use.
    </description>
    </property>

pyqt绘图库

先记录下ubuntu下pygal的安装命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo pip install pygal
sudo pip install cssselect
sudo pip install tinycss
sudo apt-get update
sudo apt-get install libxml2 libxml2-dev
sudo apt-get install python-libxml2 python-libxslt1
sudo apt-get install python2.7-dev
sudo apt-get install idle
sudo apt-get install libxslt-dev
sudo apt-get install libxml2 libxml2-dev
sudo pip install lxml
sudo apt-get install python-lxml
sudo apt-get install libffi-dev
sudo pip install cairosvg
sudo pip install cssselect

pycharm下配置Pyqt4:

  1. 1
    2
    sudo apt-get install python-pip
    sudo apt-get install build-essential
  2. pyqt4:

    1
    sudo apt-get install libxext6 libxext-dev libqt4-dev libqt4-gui libqt4-sql qt4-dev-tools qt4-doc qt4-designer qt4-qtconfig "python-qt4-*" python-qt4

3.安装pycharm(官网下载)专业版支持django
解压到program下(用VNC图形界面下操作)
用户名:
EMBRACE
密钥:

1
2
3
4
14203-12042010
0000107Iq75C621P7X1SFnpJDivKnX
6zcwYOYaGK3euO3ehd1MiTT"2!Jny8
bff9VcTSJk7sRDLqKRVz1XGKbMqw3G

脚本默认启动目录:/usr/local/bin/charm

4.

1
2
3
4
5
6
7
apt-get install python-lxml
pip install lxml
apt-get install libffi-dev
pip install cairosvg
pip install tinycss
pip install cssselect
pip install pygal

5.pycharm+pyqt4配置:
http://www.jb51.net/softjc/127737.html

1
2
3
4
sudo apt-get install qdevelop 
sudo apt-get install libqwt5-qt4 libqwt5-qt4-dev
sudo apt-get install libqt4-sql-mysql
sudo apt-get install pyqt4-dev-tools

6.sip安装:
pip install sip不成功的话:
easy_install sip
估计还是不行 绿色安装吧:
http://www.riverbankcomputing.com/software/sip/download
解压缩,进文件夹然后:
python configure.py
检查sip -V是否成功。

7.用ubuntu的软件中心安装软件cx_Freeze失败所以:

1
sudo pip install cx_Freeze
  1. pycharm连接qtdesigner:
    pycharm中:
    File->settings->Tools->external tools
    ‘+’增加一个工具,
    Program选择qtdesigner的运行路径;
    Working directory中输入$ProjectFileDir$

  2. pycharm连接pyuic:
    先安装:

    1
    sudo apt-get install pyqt4-dev-tools

    测试pyuic命令能否运行。

    1
    pyuic

    pycharm中:
    File->settings->Tools->external tools
    ‘+’增加一个工具,
    Program输入:
    pyuic4
    参数输入:
    -x $FileName$ -o $FileNameWithoutExtension$.py
    Working directory中输入:
    $ProjectFileDir$

示例命令:

1
pyuic4 -x untitled.ui -o untitled.py

三种绘制表格的库:

1.第一种pygal:
http://pygal.org/

1
2
3
4
5
6
apt-get install python-lxml
pip install lxml
pip install cairosvg
pip install tinycss
pip install cssselect
pip install pygal
  1. 第二种matplotlib:

    1
    2
    3
    4
    5
    apt-get install python-numpy
    apt-get install python-scipy
    apt-get install libpng-dev
    apt-get install python-matplotlib
    pip install matplotlib
  2. 第三种pycha:

    1
    pip install pycha

apache配置笔记

cat /etc/httpd/conf/httpd.conf

整个日志分为三部分:
(1)全局环境
(2)主配置:
虚拟主机没有处理的请求该如何处理;同时也是虚拟主机配置的缺省值;
(3)虚拟主机的设置,接收发往不同IP或不同域名的请求,用同一个apache2服务器进程进行处理。
没有框在<VirtualHost>标签里的设置会覆盖默认设置,所以尽量把自定义设置放在标签里。

  1. HostnameLookups Off
    这个选项表示:日志记录来访者时,只记录IP。
    如果Off改成On,那就每次要先去DNS查该IP对应的域名,太麻烦了。

  2. DirectoryIndex index.html index.html.var index.php
    当请求的地址对应的是一个目录时,apache就会在改目录下找index.html..等等。

  3. ServerRoot /etc/httpd
    此时,logs/foo.log(相对路径)被解释为/etc/httpd/logs/foo.log
    绝对路径/logs/foo.log依然还是/logs/foo.log
    若NFS下运行apache,则此配置比较复杂,需要参考:(或再百度下研究下)
    http://httpd.apache.org/docs/2.2/mod/mpm_common.html#lockfile

  4. MPM:多道处理模块,没研究。

  5. User apache
    Group apache

设置apache运行的用户。我猜测改成root,访问权限就全开了,但是也危险了。

  1. DocumentRoot "/var/www/html"
    放置服务文档的目录, 默认状态下,所有的请求都以这个目录为基础, 但是直接符号连接和别名可用于指向其他位置.
  1. ServerAdmin xxx@qq.com
    这个指令用来设置服务器返回给客户端的错误信息中包含的管理员邮件地址。便于用户在收到错误信息后能及时与管理员取得联系。

  2. ServerSignature On
    方便调试,显示服务器信息;
    安全的话,关掉,改成Off

  3. 对于Order deny,allow
    Allow from all的解释:http://zhanshenny.iteye.com/blog/1654332

  4. Options这个子句用来说明一些主要的设置,目前可以使用的设置有IndexesIncludesFollowSymLinksExecCGIMultiView,当然还有两个最简单的选择就是NoneAll
      None是禁止所有选择,而All 允许上面的所有Options。一般我们主要关心的是IndexesFollowSymLinksIndexes 是设定是否允许在目录下面没有index.html 的时候显示目录,而FollowSymLinks 决定是否可以通过符号连接跨越DocumentRoot。例如,尽管/ftp 不在/home/httpd/html 下面,但是我们仍然可以使用符号连接建立一个/home/httpd/html/ftp使得可以直接输入http://mydomain.com/ftp 来访问这个目录。
      使用FollowSymLinks 的办法很简单,就是首先在合适的目录段落里面Options Follow SymLinks,(符号连接的上层就可以)然后建立一个别名:
      Alias /ftp/ "home/httpd/html/ftp/"
      后面的是你建立的到/ftp 的符号连接。注意这一行应该位于所有目录段落之外。

  5. 虚拟主机配置:
    http://man.chinaunix.net/newsoft/ApacheManual/vhosts/name-based.html
    http://man.chinaunix.net/newsoft/ApacheManual/vhosts/examples.html
    http://man.chinaunix.net/newsoft/ApacheManual/vhosts/mass.html
    http://httpd.apache.org/docs/2.2/
    Listen指令并不实现虚拟主机,它只是告诉主服务器去监听哪些地址和端口。 如果没有<VirtualHost>指令,服务器对所有请求一视同仁; 但是如果有<VirtualHost>,则服务器会作出不同的响应。 要实现虚拟主机,首先必须告诉服务器需要监听的地址和端口, 然后为特定的地址和端口建立一个<VirtualHost>段。 注意,如果<VirtualHost>段设置为服务器没有监听的地址和端口, 则此段无效。

  6. 暂无需求,待续.

centos下nginx配置笔记

日志文件位置:

1
2
3
4
5
cat /var/log/nginx/host.access.log
cat /var/log/nginx/access.log
cat /var/log/nginx/error.log
cat /var/log/nginx/NginxStatus.log
cat /var/log/nginx/StatusError.log

用户名:webadmin
密码: nginx

配置文件:

1
2
cat /etc/nginx/nginx.conf
cat /etc/nginx/conf.d/default.conf

root命令和alias命令使用:
http://blog.csdn.net/bjash/article/details/8596538

如果没有配置root或alias,nginx默认会去/etc/nginx中找,可通过error日志查看具体找的路径。
如果在server里配置了root(location外面),则会去root命令配置的目录下寻找。

location命令总结:
http://blog.chinaunix.net/uid-25196855-id-108805.html

自己笔记:

  1. 1
    2
    3
    4
    location ~ .*\.(html|gif|jpg|jpeg|png|bmp|swf)$  {  
    root /usr/share/nginx/html;
    expires 30d;
    }

~表示下面将进行区分大小写的正则匹配;
(注意~后面有一个空格);
.* 任意个任意字符;
\. (转义斜杠)一个点;
(html|...)$这些后缀名之一结尾。
所以其实可以简化为: location ~ \.(html|gif|jpg|jpeg|png|bmp|swf)$
反正前面都是任意,一堆废话。

  1. ~ 区分大小写的正则;
    ~*不区分大小写的正则;
    ^~匹配优先级比较高的正则;

  2. 注意写正则的时候先使用在线正则测试工具进行测试。

  3. 规范的nginx配置示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    #使用的用户和组
    user www www;
    #指定工作衍生进程数(一般等于CPU的总核数或者总核数的两倍),每个进程耗费10MB-12MB内存
    worker_processes 8;
    #指定错误日志存放的路径,错误日志记录级别可选项为:[debug | info | noticd | warn | error | crit]
    error_log logs/error.log;
    #指定错误日志级别
    #error_log logs/error.log notice;
    #error_log logs/error.log info;
    #指定pid存放的路径,文件内记录当前nginx主进程的ID,kill -HUP 'logs/nginx.pid'
    #pid logs/nginx.pid;

    #指定文件描述符数量
    worker_rlimit_nofile 51200;

    #工作模式及连接数上限
    events {
    #提高linux的io操作选项,Linux系统推荐采用epoll模型,FreeBSD系统推荐采用kequeue,linux下建议开启
    use epoll;
    #允许最大连接数
    worker_connections 51200;
    }

    http {
    #mimie.types 浏览器请求的文件媒体类型
    include mime.types;
    #用来告诉浏览器请求的文件媒体类型
    default_type application/octet-stream;
    #设置使用的字符集,如果一个网站有多种字符集,请不要随便设置,应该让程序员在HTML代码中通过Meta标签设置
    #charset gb2312;

    #日志记录格式
    #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    # '$status $body_bytes_sent "$http_referer" '
    # '"$http_user_agent" "$http_x_forwarded_for"';

    #日志名称,和日志记录格式采用main
    #access_log logs/access.log main;

    server_names_hash_bucket_size 128;
    #用于设置客户端请求的Header头缓冲区大小,大部分情况1KB大小足够。不能超过large_client_header_buffers缓冲区大小的设置
    client_header_buffer_size 32k;
    #该指令用于设置客户端请求的Header头缓冲区大小,默认值为4KB。
    large_client_header_buffers 4 32k;

    #设置客户端能够上传的文件大小,默认为1m
    client_max_body_size 8m;

    sendfile on;
    #该指令允许或禁止使用FreeBSD上的TCP_NOPUSH,或者Linux上的TCP_CORK套接字选项。
    #tcp_nopush on;


    #keepalive_timeout 0该指令可以使客户端到服务器端的连接持续有效
    keepalive_timeout 60;
    #该指令允许或禁止使用套接字选项TCP_NODELAY,仅适用于keep-alive连接
    tcp_nodelay on;


    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    #该指令用于设置upstream模块等待FastCGI进程发送数据的超时时间,默认值为60s;
    fastcgi_read_timeout 200;
    #该指令设置FastCGI服务器相应头部的缓冲区大小。通常情况,该缓冲区大小设置等于fastcgi_buffers指令设置的一个缓冲区的大小。
    fastcgi_buffer_size 64k;
    #该指令设置了读取FastCGI进程返回信息的缓冲区数量和大小。
    fastcgi_buffers 4 64k;

    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_writer_size 128k;

    #开启gzip压缩,对网页文件、css、js、xml等启动gzip压缩,减少数据传输量,提高访问速度。
    gzip on;
    #该指令允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。
    gzip_min_length 1k;
    #设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。下面的设置代表16k为单位,按照原始数据大小以16k为单位的4倍申请内存。
    gzip_buffers 4 16k;
    #识别http的协议版本。
    gzip_http_version 1.1;
    #gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理速度最慢(传输快但比较消耗cpu)
    gzip_comp_level 2;
    #匹配mime类型进行压缩,无论是否指定,“text/html”类型总是会被压缩的。
    gzip_types text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    #该指令定义了一个数据区,其中记录会话状态信息。 定义一个叫“crawler”的记录去,总容量为10MB,以变量$binary_remote_addr作为会话的判断基准(即一个地址一个会话)
    #limit_zone crawler $binary_remote_addr 10m;

    #允许客户端请求的最大单个文件字节数
    client_max_body_size 300m;

    #缓冲区代理缓冲用户端请求的最大字节数,可以理解为先保存到本地再传给用户
    client_body_buffer_size 128k;

    #跟后端服务器连接的超时时间_发起握手等候响应超时时间
    proxy_connect_timeout 600;

    #连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理
    proxy_read_timeout 600;

    #后端服务器数据回传时间_就是在规定时间内后端服务器必须传完所有的数据
    proxy_send_timeout 600;

    #代理请求缓存区_这个缓存区会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可
    proxy_buffers 16k;

    #同上 告诉Nginx保存单个用的几个Buffer最大用多大空间
    proxy_buffers 4 32k;

    #如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2
    proxy_busy_buffers_size 64k;

    #proxy缓存临时文件的大小
    proxy_temp_file_write_size 64k;

    #缓存 proxy_temp_path和proxy_cache_path必须在同一个分区
    proxy_temp_path /data2/proxy_temp_path;
    #该指令用于设置缓存文件的存放路径,设置缓存区名称为cache_one ,内存缓存空间大小为200M,自动清除超过1天没有被访问的缓存数据,硬盘缓存空间大小为30GB
    proxy_cache_path /data2/proxy_cache_path levels=1:2 keys_zone=cache_one:2000m inactive=1d max_size=30g;


    #include指令,使用此指令,可以包含任何你想要包含的配置文件,支持文件名匹配。
    #include vhosts/*.conf;

    upstream php_server_pool{
    #weight=NUMBER ——设置服务器的权重,权重数高被分配访问数越高,默认权重1.
    #max_fails=NUMBER——在参数fail_timeout指定的时间内对后端服务器请求失败的次数,如果检测到后端服务器无法连接及发生服务器错误(404错误除外),则标记为失败。默认值为1.设置为0这关闭这项检查
    #fail_timeout=TIME——在经历参数max_fails设置的失败次数后,暂停的时间
    #down——标记服务器为永久离线状态,用于ip_hash指令
    #backup——仅仅在非backup服务器全部繁忙的时候才启动

    #upstream模块拥有以下变量:
    # $upstream_addr:处理请求的upstream服务器地址
    # $upstream_status:upstream服务器的应答状态
    # $upstream_response_time:Upstream服务器响应时间(毫秒),多个响应以逗号和冒号分隔。
    # $upstream_http_$HEADER:任意的HTTP协议头信息,例如:$upstream_http_host

    server 192.168.1.10:80 weight=1 max_fails=2 fail_timeout=30s;
    server 192.168.1.11:80 weight=1 max_fails=2 fail_timeout=30s;
    server 192.168.1.12:80 weight=1 max_fails=2 fail_timeout=30s;
    }

    upstream message_server_pool{
    #ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器。但无法保证后端服务器的负载均衡,所以建议后端服务器能做到session共享来代替nginx的ip_hash方式。
    #且如果后端服务器有时要从Nginx负载均衡中摘除一段时间,你必须将其标记为“down”
    #ip_hash;
    server 192.168.1.13:3245;
    server 192.168.1.14:3245 down;
    }

    upstream bbs_server_pool{
    server 192.168.1.15:80 weight=1 max_fails=2 fail_timeout=30s;
    server 192.168.1.16:80 weight=1 max_fails=2 fail_timeout=30s;
    server 192.168.1.17:80 weight=1 max_fails=2 fail_timeout=30s;
    }

    #第一个虚拟主机,反向代理php_server_pool这组服务器
    server
    {
    #该指令用于设置虚拟主机监听的服务器地址和端口号。
    #listen127.0.0.1:8080;
    #listen 8000;
    #listen *:8000;
    #listen localhost:8000;
    listen 80;
    server_name www.yourdomain.com;

    #SSL加密浏览
    ssl on
    ssl_certificate www.yourdomain.com.crt;
    ssl_certificate_key www.yourdomain.com.key;

    location /
    {
    #限制下载速度256KB/秒
    limit_rate 256k;
    #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移
    proxy_next_upstream http_502 http_504 error timeout invalid_header;
    proxy_pass http://php_server_pool;
    proxy_set_header Host www.yourdomain.com;
    proxy_set_header X-Forwarded-For $remote_addr;
    }

    access_log /data1/logs/www.yourdomain.com_access.log;
    }

    #第二个虚拟主机,反向代理message_server_pool这组服务器
    server
    {
    listen 80;
    server_name www1.yourdomain.com;

    #访问http://www1.yourdomain.com/message/***地址,反向代理message_server_pool这组服务器
    location /
    {
    proxy_pass http://message_server_pool;
    proxy_set_header Host $host;
    }

    #访问除了/message/之外的http://www1.yourdomain.com/***,反向代理php_server_pool这组服务器
    location /message/
    {
    #DNS解析服务器的IP地址,可以在IE 工具-Internet选项-连接-局域网设置-代理服务器 中设置代理服务器IP地址和端口
    resolver 8.8.8.8;
    #该指令用于设置被代理服务器端口或套接字,以及URI
    proxy_pass http://php_server_pool;
    #该指令可以设置哪些从后端服务器传送过来的文件被Nginx存储。on保持文件与alias或root指令设置的目录一致,参数off不存储文件
    #proxy_store /data/www$original_uri;
    proxy_store on;
    #该指令用于指定创建文件和目录的权限
    proxy_store_access user:rw group:rw all:r;
    #指定一个本地目录来缓冲较大的代理请求
    proxy_temp_path /data/temp;
    #该指令用于在URL和文件系统路径之间实现映射。
    alias /data/www;
    #该指令允许重新定义或添加Header行道转发给被代理服务器的请求信息中,它的值可以是文本,也可以是变量,或者是文本和变量的组合。
    #使用$host变量,它的值相当于服务器的主机名(如果使用域名访问,则该值为域名;如果使用IP访问,则该值为IP)。此外可以将主机名和被代理服务器的端口一起传递 $host:$proxy_port
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;

    }

    access_log /data1/logs/www.yourdomain.com_access.log;
    }

    #第三个虚拟主机
    server
    {
    listen 80;
    server_name bbs.yourdomain.com *.bbs.yourdomain.com;

    location /
    {
    proxy_pass http://bbs_server_pool;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    #禁止指定的IP地址或者IP段访问某些虚拟主机或目录
    #deny 192.168.1.1/24;
    #允许指定的IP地址或者IP段访问某些虚拟主机或目录
    #allow 192.168.1.0/24;

    }

    #不记录日志
    access_log off;
    }

    }

centos6.4安装vnc

  1. 安装vnc
    yum install tigervnc-server

  2. 安装vnc字体
    yum install libXfont

  3. 查看vnc安装
    rpm -q vnc tigervnc-server
    安装成功显示
    package vnc is not installed
    tigervnc-server-1.1.0-8.el6_5.x86_64

4、设置远程桌面用户 root 密码

1
2
3
vncpasswd
Password: 密码
Verify: 验证

5、把远程桌面的用户加入到配置文件中
vi /etc/sysconfig/vncservers

6、使用vi编辑器打开配置文件,在文件中添加下面两行命令

1
2
VNCSERVERS="1:root"             #指定远程用户
VNCSERVERARGS[1]="-geometry 1024x768 -nolisten tcp -localhost" #指定远程桌面分辨率

7、开启VNC端口
vi /etc/sysconfig/iptables
使用vi编辑器打开配置文件,在文件中添加下面一行命令(最好放上面一行)
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5901 -j ACCEPT

8、重启防火墙
service iptables restart

9、手动开启vnc
vncserver

lanmp获取真实IP

1
2
3
wget https://github.com/ttkzw/mod_remoteip-httpd22/raw/master/mod_remoteip.c
/usr/local/apache/bin/apxs -i -c -n mod_remoteip.so mod_remoteip.c
vi /etc/httpd/conf/httpd.conf

加入:
Include conf/extra/httpd-remoteip.conf
/etc/httpd/conf下创建extra文件夹
创建httpd-remoteip.conf文件,
内容如下:

1
2
3
LoadModule remoteip_module modules/mod_remoteip.so
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1

然后
service httpd restart

selinux学习笔记

  1. 先安装工具:

    1
    2
    yum install setools
    yum install setroubleshoot
  2. selinux是提供日志文件来记录错误信息的,错误信息记录在/var/log/messages/var/log/setroubleshoot/* 里头,需要重启auditd服务来开启selinux的log服务:
    service auditd restart

  3. 宽容模式:(只写日志)
    setenforce Permissive
    严格:
    setenforce Enforcing
    查看当前模式:
    getenforce

  1. audit日志超级长,而且看不懂;
    先把它清空然后再现错误(只记录最新的错误):
    echo >/var/log/audit/audit.log
    sealert -a /var/log/audit/audit.log >./qq.txt
    把出错日志转化为人能看懂的内容
    比如里面会提示你:
    1
    2
    3
    4
    setsebool -P httpd_can_network_relay 1
    setsebool -P httpd_can_network_connect 1
    grep nginx /var/log/audit/audit.log | audit2allow -M mypol
    semodule -i mypol.pp
    可以试着照着做。一般能解决权限访问问题。

关闭Selinux:

vi /etc/selinux/config

1
2
3
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加

:wq #保存,关闭
shutdown -r now #重启系统

如果只是为了phpadmin则可以这样: 一条命令解决权限

chcon -R -t httpd_sys_content_t /var/www/html/phpmyadmin

权限:

namei -om /var/www/html/phpadmin

centos下LANMP各个配置及日志的位置

  1. 开机启动服务及自动联网:
    vi /etc/sysconfig/network-scripts/ifcfg-eth0
    把ONBOOT=no改为yes

ifcfg-eth0配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DEVICE=eth0
HWADDR=B8:AC:6F:34:AE:FD
TYPE=Ethernet
UUID=ae099b3e-bc3b-4907-8020-b618ef5c25b3
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
#BOOTPROTO=dhcp
#BROADCAST=10.2.14.128
IPADDR=10.2.2.54
NETMASK=255.255.255.0
#NETWORK=10.2.14.0
GATEWAY=10.2.2.1
DNS1=202.112.128.51
#DNS2=10.2.0.251
HOSTNAME=pc54

2.
http://www.jb51.net/article/37987.htm

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

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

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

查看mysql监听端口:
netstat -tulpn | grep -i mysql

CustomLog logs/access_log

apache日志在:
cat /var/log/httpd/access_log

nginx配置文件在:
cat /etc/nginx/nginx.conf
其他在 /etc/nginx/conf.d/

使用命令查看nginx相关文件位置:
rpm -ql nginx
防火墙配置:
vi /etc/sysconfig/iptables
加入要放开的端口:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
然后:
service iptables restart

nginx日志:
cat /var/log/nginx/host.access.log

一了百了解决权限:
setenforce Permissive

1
2
3
4
location /phpmyadmin {
index index.php;
disable_symlinks off;
}