Nginx 负载均衡简单配置

* 内网测试
本机: 127.0.0.1
VM1: 192.168.1.119:80
VM2: 192.168.1.120:80

* 代理机(127.0.0.1本机)配置
在hosts文件中添加一行 127.0.0.1 www.a.com
在http模块中添加如下代码,或者在vhosts添加引入配置文件如www.a.com

upstream www.a.com{
    server 192.168.1.119:80 weight=5;
    server 192.168.1.120:80 weight=5;
}

server {
    listen 80;
    server_name www.a.com;

    charset utf-8;
    location / {
        proxy_pass http://www.a.com;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

* 负载机配置
VM1: 192.168.1.119
VM2: 192.168.1.120

server{
    listen 80;
    server_name www.a.com;
    index index.php index.html;
    root /var/www/html;
}

配置完重启NGINX,访问www.a.com测试,weight为负载权重,刷新页面会访问不同的主机,配置成功!

Mysql主从机制搭建

注意事项
1、主从服务器操作系统版本和位数一致。
2、MySQL版本一致。

服务器配置
master:192.168.1.120
slave:192.168.1.119

Master(192.168.1.120)服务器配置

vim /etc/my.cnf
[mysqld]
# 唯一的服务辨识号,数值位于 1 到 2^32-1之间.
# 此值在master和slave上都需要设置.
# 如果 “master-host” 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效.
server-id=1

# 打开二进制日志功能.
# 在复制(replication)配置中,作为 MASTER 主服务器必须打开此项
# 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志.
log-bin=master-bin
log-bin-index=master-bin.index

#需要备份的数据库
binlog-do-db=orders

#不需要备份的数据库
#若没有配置binlog-do-db和binlog_ignore_db,表示备份全部数据库。
binlog-ignore-db=mysql

2、重启mysqld服务

service mysqld restart

3、为从MySQL创建用户

#登录
mysql -uroot -p
Enter password: 

#创建用户
mysql> create user 'slave'@'192.168.1.119(从机ip)' identified by '1';
        
#配置主从复制权限
mysql> grant replication slave on *.* to 'slave'@'192.168.1.119(从机ip)' identified by '1';

4、若orders中已有数据,还需要锁定主服务器数据库,然后将数据导入到从数据库

#锁定
mysql> flush tables with read lock;

#数据复制到从数据库后,查看主数据库master状态并解锁:
mysql> show master status;  
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000004 |      648 | orders       | mysql            |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)  
  
mysql> unlock tables;

Slave(192.168.1.119)服务器配置
1、配置服务ID

vim /etc/my.cnf 

[mysqld]
#server_id是必须的,而且唯一
server-id=2

# 使得slave只读.只有用户拥有SUPER权限和在上面的slave线程能够修改数据.
# 你可以使用此项去保证没有应用程序会意外的修改slave而不是master上的数据
#read_only

# 如果你在使用链式从服务器结构的复制模式 (A->B->C),
# 需要打开slave的二进制日志
#log_bin=mysql-bin

# 如果你在使用链式从服务器结构的复制模式 (A->B->C),
# 你需要在服务器B上打开此项.
# 此选项打开在从线程上重做过的更新的日志, 并将其写入从服务器的二进制日志.
# 如果打开log_bin,却没有设置log_slave_updates,这是一种错误的配置。
#log_slave_updates

2、重启MySQL服务
3、复制配置

#登录
mysql -uroot -p
Enter password: 
       
#执行
mysql> change master to master_host='192.168.1.120',
       master_user='slave',
       master_password='1',
       master_port=3306,
       master_log_file='master-bin.000004',
       master_log_pos=648,
       master_connect_retry=10;

参数详解:
master_host:主服务器的IP。
master_user:配置主服务器时建立的用户名
master_password:用户密码
master_port:主服务器mysql端口,如果未曾修改,默认即可。
master_log_file:日志文件名称,填写查看master状态时显示的File
master_log_pos:日志位置,填写查看master状态时显示的Position
master_connect_retry:重连次数

4、启动进程

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.120
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: master-bin.000004
          Read_Master_Log_Pos: 648
               Relay_Log_File: magic-VirtualBox-relay-bin.000003
                Relay_Log_Pos: 507
        Relay_Master_Log_File: master-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

若Slave_IO_Running和Slave_SQL_Running均为Yes,则表示配置成功。

5、中间遇到了一些问题,解决如下

Slave_IO_Running: No
Slave_SQL_Running: No
Last_Errno: 1146
Last_Error: Error 'Table 'orders.user_orders' doesn't exist' on query. Default database: 'orders'. Query: 'INSERT INTO `orders`.`user_orders` (`id`, `user_id`, `user_name`) VALUES (NULL, '2', 'magic.shen')'

# 首先停止主从同步,
# stop slave;
# 检查 master status,中 Position 是否和配置的一致
# 手动将master上的orders库结构、数据导入到slave上
# 重启slave
# start slave;

git上添加了公钥,每次更新还是要提示输入密码的解决办法

问题:
每次执行git pull后会提示输入公钥密码

Enter passphrase for key '/root/.ssh/id_rsa':

解决办法参考:
http://askubuntu.com/questions/362280/enter-ssh-passphrase-once
依次执行:

$ssh-agent bash
$ssh-add /home/username/.ssh/id_rsa
Enter passphrase for /home/username/.ssh/id_rsa: 
Identity added: /home/username/.ssh/id_rsa (/home/username/.ssh/id_rsa)

输入密码后,出现Identity added后解决。

Mac利用jpegoptim 无损压缩jpg jpeg图片

先用macport安装jpegoptim

port install jpegoptim

安装完毕后,即可使用,-h 查看参数用法

$ jpegoptim banner1.jpg
banner1.jpg 1024x683 24bit Exif Adobe  [OK] 156339 --> 155426 bytes (0.58%), optimized.

还可以在某个文件夹下批量进行压缩

find . -iname '*.jpg' -print0 | xargs -0 jpegoptim --max=90 --strip-all --preserve --totals --all-progressive

除此之外,还有一个专门压缩PNG的软件 optipng

为网站设置https安全协议

1.获取证书,有一些官方出售的证书,但也有免费的比如SSL For Free,而且背后有一些主要的赞助商,例如Mozilla,Chrome,Akamai和Cisco。
2.进入网站后输入您网站的域名,按照提示,选择自动FTP验证或手动验证,验证成功后就可以获得证书,下载应该得到一个sslforfree.zip的压缩包,解压后有3个文件,依次是:ca_bundle.crt(CA /链证书) certificate.crt(针对网站的SSL证书) private.key(证书私钥)
3.接着网站提示的步骤”Installing your SSL Certificate”,找到对应自己web服务器的标签,这里我以Nginx为例:

  • 将刚才解压的3个文件上传到服务器比如:/etc/ssl/
  • 合并 certificate.crt ca_bundle.crt 为 cert_chain.crt
$ cat certificate.crt ca_bundle.crt >> cert_chain.crt
  • 注意!!合并完检查cert_chain.crt文件,如果看上去想这样:
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
  • 请改为
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE----
  • 修改nginx虚拟主机配置
#http访问时301重定向到https
server {
    listen 80;
    server_name www.ssmvv.com ssmnx.com;
    return 301 https://$server_name$request_uri;
}
server {
    listen 443;
    ssl on;
    ssl_certificate /etc/ssl/cert_chain.crt;
    ssl_certificate_key /etc/ssl/www.ssmvv.com.key;

    server_name www.ssmvv.com ssmnx.com;
    ...
}
  • 设置完毕后重启nginx服务器

Nginx 防止图片盗链

默认的配置是:

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ 
{ 
    expires      30d; 
}

改成如下:

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ 
{ 
    valid_referers none blocked *.ssmnx.com ssmnx.com *.qq.com *.baidu.com *.google.com; 
    if ($invalid_referer) { 
        rewrite ^/ http://www.ssmvv.com/epinv.png; 
    } 
    expires      30d; 
}

解释:
1.”gif|jpg|jpeg|png|bmp|swf” 设置防盗链文件类型,自行修改,每个后缀用 “|” 符号分开!
2.”valid_referers none blocked *.ssmnx.com ssmnx.com *.qq.com *.baidu.com *.google.com;” 允许文件链出的域名白名单 域名与域名直接用空格分开,*.google.com 搜索引擎收录时可能有图片加载,所以这里加入了白名单。
3.”rewrite ^/ http://www.ssmvv.com/epinv.png;” 盗链后返回的图片,注意!此图片要放在没有设置防盗链的网站上。

搭建git服务器

github私有仓库的费用太贵,有VPS可以自己搭建一个专属git服务器

其实没什么需要安装的,git的默认协议SSH不需要什么配置,主要是方便和安全方面的优化

初始化环境

为了安全,我们为git仓库专门设置一个管理用户git,约定使用 /srv/git 放置仓库

$ sudo useradd \
--create-home \
--home-dir=/srv/git \
--root=/srv/git \
--base-dir=/srv/git \
--shell=/usr/bin/git-shell \
git
$ sudo passwd git

上面的参数作用

--create-home --home-dir=/srv/git

创建用户主目录,将来可以添加SSH KEY登录方式,和代码仓库放在一起方便管理

--root=/srv/git

限制这个用户的访问目录在/srv/git,不能访问其它路径,这是出于安全考虑

--base-dir=/srv/git

用户base目录,即默认的父目录.帮助简化了克隆时的目录前缀

--shell=/usr/bin/git-shell

只允许用户用于管理仓库,不得执行其它命令

创建仓库

初始化一个裸仓库,即只包含仓库信息,不包含代码

$ sudo git --bare init /srv/git/MY_PROJECT.git

不需要其它配置了,就这么简单

从客户端克隆

MYHOST就是VPS的主机地址

$ git clone git@MYHOST:MY_PROJECT.git

主机名后的目录只需要填写仓库目录

这是创建用户时指定的 –base-dir 立的功,让你不用输入完整的目录 /srv/git/MY_PROJECT.git

尝试用git用户登录会被阻止

$ ssh git@MYHOST
git@MYHOST's password: 
fatal: Interactive git shell is not enabled.hint: ~/git-shell-commands should exist and have read and execute access.
Connection to MYHOST closed.

web界面

首先安装gitweb软件包,它附带了访问仓库的cgi动态程序.

gitweb默认需要在 /var/www/git 下放置cgi程序和仓库代码,但我们把仓库安装在了 /srv/git 下,所以做个软链接

# ln -s /srv/git /var/www/git
# yum install gitweb
# ls /var/www/git
gitweb.cgi static PROJECT.git

可以看到yum安装后多出了这两个: gitweb.cgi static

接下来启动gitweb服务

刚才安装的gitweb只是一套动态程序,HTTP访问还要借助lighttpd apache等web服务器.而git自带的命令instaweb可以自动创建web服务器的配置文件.指定–httpd参数为lighttpd即可

# sudo -i
# cd /var/www/git
# git init

# yum install lighttpd
# git instaweb --httpd=lighttpd --port=1234
No known browser available.
http://127.0.0.1:1234
上面的命令解释:
# sudo -i
# cd /var/www/git

因为 /var/www/git 是git用户的home目录,因此普通用户可能没有权限cd,所以需要-i参数保持root权限.

注意:git instaweb 不能指定document root目录,所以在哪个目录下执行,就展示那个目录下的仓库.因而需要先cd到这里

# git init

git instaweb创建的web服务器配置文件,需要一个git仓库来存放.

外界访问控制

到这里就可以访问git仓库了,但没有完,还需要外界可以访问,并且要限制访问.这时可以借助nginx,或者修改lighttpd的配置文件

server {
    listen 80;
    server_name git.MYHOST.COM
    location / {
        auth_basic "git web require auth";
        auth_basic_user_file /srv/etc/passwd;
        proxy_pass http://127.0.0.1:1234/;
    }
}

有关auth_basic的配置可以参阅 http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html

大功告成

到这一步就结束了,现在访问 http://git.MYHOST.COM/ 即可浏览仓库信息

如果你觉得这个web界面太丑陋的话,可以看看 https://github.com/kogakure/gitweb-theme ,这个项目提供了更优雅的主题界面:http://kogakure.github.io/gitweb-theme/

如何将使用ssh公钥添加到git

将公钥添一行一个添加到 /srv/git/.ssh/authorized_keys 即可

转自:小艾的博客

Linux下拷贝目录结构

#使用find命令可以创建与源一致的目录结构
find  /usr/local   -type d -exec mkdir -p /tmp/{} \;
#这条命令将在/tmp目录下创建与  /usr/local一致的目录,此外如果要执行多个命令可以在分号后面继续添加-exec指令,如
find  /usr/local   -type d -exec mkdir -p /tmp/{} \;-exec print {} \;