11月 09

新购一台阿里云服务器。今天装了个mysql,记录一下期间遇到的坑。

 

安装就不描述了。本地用Native链接不上

http://blog.wx6.org/2015/434.htm  之前这篇已经介绍过了。

按照正常情况,现在应该轻轻松松连接上了。可是并没有,

出了一个10038的问题,

Telnet检查了链接不上。远程服务器上所有的防火墙都检查过了,没有问题。可是依然连接不上。

网上所有遇到的可能性都尝试了,依然连不上。

 

这时候想到是不是阿里云有什么特俗的地方。  搜了一下 阿里云 3306, 果然有人遇到过这个坑了。

阿里云的安全策略里面是阻断了3306端口,只要加入站规则进去即可。

记录下来,以后不要再犯。

 

随后使用Navicat for Mysql链接出现错误

1045 - Access denied for user 'root'@'X.X.X.X' (using password: YES)

这是需要更改密码

执行登录myql

mysql -h localhost -u root -p

 首先选中mysql表

use mysq;

修改密码

update mysql.user set authentication_string=password('root') where user='root' ;

退出

exit

重启mysql即可

service mysql restart

written by ocean

11月 06

安装完配好root登录之后,winscp一直连接不上

报错

Disconnected: Server protocol violation: unexpected SSH2_MSG_UNIMPLEMENTED packet

最后发现解决问题如下

For me the key was that the "Diffie-Hellman group exchange" key exchange algorithm was not implemented on the server (see Connection > SSH > KEX).

Moving this key exchange algorithm to the bottom of the list and making the algorithm "Diffie-Hellman group 14" first solved the problem for me.

written by ocean

10月 16

关注Docker很久了,这次刚好配了新电脑,自己配个试试。

我的是win10系统,首先安装了Hyper-v

Ubuntu选择了16.04版本(ubuntu-16.04.3-server-amd64.iso)

下载地址

http://releases.ubuntu.com/16.04/

按照惯例,更新Ubuntu包索引

sudo apt-get update

让服务器可以使用Https更新仓库

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

添加Docker官方的密钥对,如果没问题,会返回“OK”

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

设置官方稳定版的仓库来源

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

  

 

安装好系统之后,按照教程安装docker

首先更新一下包索引

sudo apt-get update

安装最新版本的Docker-CE社区版

sudo apt-get install docker-ce

查看是否安装成功

docker version

 试着运行一个测试镜像

sudo docker run hello-world

  

因为一些总所周知的原因,在国内使用docker拉取镜像会很慢,经常超时,因此需要添加国内的镜像源

/etc/docker/daemon.json

 添加如下内容

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

值得注意的是,该镜像库只包含流行的公有镜像。私有镜像仍需要从美国镜像库中拉取。

   

然后记录几个docker常用的命令

sudo docker pull microsoft/aspnetcore   //这个是用来跑web的
sudo docker pull microsoft/dotnet    //从docker仓库拉取一个名称为“microsoft/dotnet”的镜像
sudo docker images    //查看所有镜像
sudo docker rmi 63sf86332e    //删除一个imageid的镜像
sudo docker rmi $(docker images -q)    //删除所有镜像


sudo docker run microsoft/dotnet    //创建microsoft/dotnet镜像的一个容器
sudo docker ps -a    //查看所有容器
sudo docker rm 6f0c67de4b72    //删除一个containerid的容器
sudo docker rm $(sudo docker ps -a -q)   //删除所有容器

  

运行容器

docker start ebb86823ddf9   //后面跟的是容器id

停止容器

docker stop app1   //后面跟的是容器别名

查看运行的容器

docker ps

进入容器

docker attach ebb86823ddf9   //后面跟的是容器id

另外一种进入容器的方法,退出的时候容器可以继续执行

docker exec -it mainapp bash   //mainapp是容器别名

退出容器

exit

 

 把主机的文件copy到容器中

docker cp /www/ocean/default.conf mainapp:/etc/nginx/conf.d/default.conf    //mainapp是容器别名

把容器中的文件copy到主机中

docker cp mainapp:/etc/nginx/conf.d/default.conf  /var/ocean/   //mainapp是容器别名

 

接下来进入实战阶段

首先将asp.net core的程序通过winscp发布到Linux主机的 /var/ocean/ 这个路径下

然后执行下面这个命令

docker run -p 8001:80 -v /var/ocean:/wwwroot -w /wwwroot/ microsoft/aspnetcore dotnet /wwwroot/DockerTest.Web.dll

浏览器打开  http://172.28.3.125:8001/ 即可以看到运行成功

172.28.3.125是Linux主机的IP, 8001是对外暴露的端口,这些都是可以变的

这个命令可以再改变一下

docker run --name a1 -d -p 8001:80 -v /var/ocean:/wwwroot -w /wwwroot/ microsoft/aspnetcore dotnet /wwwroot/DockerTest.Web.dll

–name a1 是给容器命名叫a1,之后就可以直接拿a1来控制容器,不需要使用记不住的Id了

-d 命令是设置detach为true,根据官方的文档,意思是让这个命令在后台运行

 还有一个,可以指定容器的hostname,参数是 

-h 名字

例如

docker run --name appp -d  -h HOSTNAME  -p 8005:80 -v /ocean/www:/wwwroot -w /wwwroot/ microsoft/aspnetcore dotnet /wwwroot/Ascend.FrameworkCore.Authorization.dll

 

另外一种方式是Dockerfile,可以用Dockerfile来创建镜像

文件名 Dockerfile ,必须是这个,注意大小写

FROM microsoft/aspnetcore
WORKDIR /app
COPY . /app 
ENTRYPOINT ["dotnet", "/app/DockerTest.Web.dll"]

跟随asp.net core的程序同时copy到  /var/ocean/目录, 当然了,目录随意

Linux命令进入 /var/ocean/目录,然后输入命令打包

docker build -t oceanfirstimage .

成功之后查看镜像就可以看到一个叫coeantestapp的镜像了,居然有328M…

启动这个镜像

sudo docker run --name app1 -d  -p 8008:80 oceanfirstimage

浏览器中输入 http://172.28.3.125:8008/ 即可访问

 

 

 

接下来记录如何把本地做好的镜像传到hub.docker.com

登录到docker

docker login

上传之前需要对本地的镜像打标签,依然以oceantestapp这个本地镜像为例

docker tag oceantestapp oceanheyang/oceantestapp

推送到hub.docker.com

docker push oceanheyang/oceantestapp

其中oceanheyang是我在docker hub上的用户名。经过等待,我们本地的镜像就传到docker hub上了。我可以在任何机器上直接使用。值得注意的是这是公共的,所有人都可以使用我的镜像。所以一些私有的东西就不能这样传了。

再次使用非常简单,只需要一句话

sudo docker run --name app1 -d  -p 8001:80  oceanheyang/oceantestapp

好了,打开 http://172.28.3.125:8001/ 可以尽情享受了

继续完善它,当我们重启server的时候,也是希望容器自动重启的。因此要使用到 –restart参数,命令如下

sudo docker run --restart=always

不过我已经创建了的容器可以直接更新,而不用销毁重建

docker update --restart=always app1

 

 

  

 

 

继续记载docker中的nginx,做负载均衡

先运行起来5个容器,等下通过nginx负载分发到这5个容器上

sudo docker run --name app1 -d  -p 8001:80 oceanfirstimage
sudo docker run --name app2 -d  -p 8002:80 oceanfirstimage
sudo docker run --name app3 -d  -p 8003:80 oceanfirstimage
sudo docker run --name app4 -d  -p 8004:80 oceanfirstimage
sudo docker run --name app5 -d  -p 8005:80 oceanfirstimage

然后获取nginx的镜像

sudo docker pull nginx

运行

docker run --name mainweb -d -p 80:80  -v /var/ocean/d2.conf:/etc/nginx/conf.d/default.conf nginx

 我直接把配置文件放在外面了

具体可以参考这篇文章  linux下,用jexus配合nginx的使用

浏览器中输入 http://172.28.3.125  就可以看到了,随机访问

 

 

 

记录一下docker中启动redis,一句话搞定

docker run -p 6379:6379 --name oceanredis -d redis

一定要加 -p 6379:6379 才能将容器内的端口映射到外面,否则永远也连不上。
如果要自定义配置文件,则使用下面这句话

docker run -d -p 6379:6379 -v  /ocean/redis.conf:/usr/local/etc/redis/redis.conf --name oceanredis redis redis-server /usr/local/etc/redis/redis.conf

written by ocean

5月 06

查看状态

iptables -L

要允许ssh

iptables -A INPUT -p tcp  eth0 --dport ssh -j ACCEPT

 开放80端口

iptables -A INPUT -p tcp  eth0 --dport 80 -j ACCEPT

 屏蔽IP

iptables -I INPUT -s 59.151.119.180 -j DROP

written by ocean

5月 05

做负载用,记录一下配置

 

之前都是用mono的  Ubuntu安装配置笔记+运维常用命令,结果jexus作者做了免安装mono的版本,顺便测试一下

 

下载,解压

cd /tmp
wget linuxdot.net/down/jexus-5.8.1-x64.tar.gz
tar -zxvf jexus-5.8.1-x64.tar.gz

移动到usr下

sudo mv jexus /usr 
sudo rm -rf /tmp/jexus*

这样就安装完成了。so cool !

配置参考之前方式 程序迁移到Linode的Linux主机了

 

输入地址访问,一切OK!

 

然后是安装Nginx

之前有在windows下使用过 nginx本地开发

另外centos里也有安装过 CentOS下安装Nginx

今天试试ubuntu里的安装配置,果然很简单

apt-get install nginx

现在来配置一下
开启服务

sudo service nginx start

查询状态

sudo service nginx status

重新加载配置

sudo service nginx reload

配置文件

server {
	listen 80 ; 
	server_name www.wx6.org; 
	location / {
		if ($request_method = PUT ) {
			return 403;  
		}
		if ($request_method = DELETE ) {
			return 403;
		}
		if ($request_method = POST ) { #过滤POST请求
			return 403;
		}
		proxy_method GET;
		proxy_pass http://www.wx6.org:8080; 
	} 
}

另外因为我的网站比较特殊,需要本地修改host解析到本地

/etc/hosts

127.0.0.1	www.wx6.org

 

 

 

 

 

2018.4.20补充

nginx做负载均衡

首先在目录 /etc/nginx/conf.d/下面添加配置,任何名字都可以,但是需要以.conf为结尾

我在这里新建d2.conf作为文件名

upstream aspnetcoreservers {  
    server 172.28.3.125:8001;  
    server 172.28.3.125:8002;   
    server 172.28.3.125:8003;   
    server 172.28.3.125:8004;   
    server 172.28.3.125:8005;  
    } 

server {
    listen       80;
    server_name  172.28.3.125;

    location / {
        proxy_pass http://aspnetcoreservers;  
    } 
}

用了5个server做负载平衡,还有很多策略,需要用到的话再看。

特别重要一点,因为我使用的winscp修改的配置文件,文件的编码很重要 一定要选UTF-8 without BOM.

否则会出很多莫名其妙的问题,今天又在这个上面浪费时间了。

written by ocean

12月 24

apt-get install libgdiplus

 wget http://download.mono-project.com/sources/mono/mono-4.0.3.20.tar.bz2

 

tar jvxf mono-4.0.3.20.tar.bz2

  cd mono-4.0.3 

  ./configure –prefix=/usr

  make

  sudo make install

  cd ..

http://download.mono-project.com/sources/mono/

written by ocean \\ tags:

12月 16

Linux下首先需要安装xvfb

sudo apt-get install xvfb

安装phantomjs

apt-get install phantomjs

一般调用

/var/www/test# phantomjs rasterize.js http://www.baidu.com test.png

中文出现了乱码,是因为没有安装字体

sudo apt-get install xfonts-wqy

C#调用

            Process p = new Process();
            p.StartInfo.FileName = "phantomjs";
            p.StartInfo.Arguments = "rasterize.js http://www.baidu.com test.png";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();  
            p.Close();

rasterize.js

var page = require('webpage').create(),
    system = require('system'),
    address, output, size;

if (system.args.length < 3 || system.args.length > 5) {
    console.log('Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat] [zoom]');
    console.log('  paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"');
    console.log('  image (png/jpg output) examples: "1920px" entire page, window width 1920px');
    console.log('                                   "800px*600px" window, clipped to 800x600');
    phantom.exit(1);
} else {
    address = system.args[1];
    output = system.args[2];
    page.viewportSize = { width: 600, height: 600 };
    if (system.args.length > 3 && system.args[2].substr(-4) === ".pdf") {
        size = system.args[3].split('*');
        page.paperSize = size.length === 2 ? { width: size[0], height: size[1], margin: '0px' }
                                           : { format: system.args[3], orientation: 'portrait', margin: '1cm' };
    } else if (system.args.length > 3 && system.args[3].substr(-2) === "px") {
        size = system.args[3].split('*');
        if (size.length === 2) {
            pageWidth = parseInt(size[0], 10);
            pageHeight = parseInt(size[1], 10);
            page.viewportSize = { width: pageWidth, height: pageHeight };
            page.clipRect = { top: 0, left: 0, width: pageWidth, height: pageHeight };
        } else {
            console.log("size:", system.args[3]);
            pageWidth = parseInt(system.args[3], 10);
            pageHeight = parseInt(pageWidth * 3/4, 10); // it's as good an assumption as any
            console.log ("pageHeight:",pageHeight);
            page.viewportSize = { width: pageWidth, height: pageHeight };
        }
    }
    if (system.args.length > 4) {
        page.zoomFactor = system.args[4];
    }
    page.open(address, function (status) {
        if (status !== 'success') {
            console.log('Unable to load the address!');
            phantom.exit(1);
        } else {
            window.setTimeout(function () {
                page.render(output);
                phantom.exit();
            }, 200);
        }
    });
}

written by ocean \\ tags: ,

9月 15

自从做了苦逼的站长,就没安宁过,现在又要折腾服务器了

这次从日本的linode换回国内的vps

用惯了Ubuntu,可惜这家只有centos,又要折腾一次环境,做个记录

更新

yum update

  

首先安装需要的库

yum -y install wget glib2-devel libtiff libtiff-devel libjpeg libjpeg-devel giflib giflib-devel libpng libpng-devel libX11 libX11-devel freetype freetype-devel fontconfig fontconfig-devel libexif libexif-devel gcc-c++ gettext unzip zip bzip2 bzip2-devel curl-devel gtk2-devel boost-devel

 

添加rpm源

rpm --import " 
yum-config-manager --add-repo http://jenkins.mono-project.com/repo/centos/

 

查找可用的mono版本

yum search mono

 

安装

yum  install mono-complete

 

written by ocean

9月 14

小程序需要做个后台服务定时采集数据,本来是在global里面写的Timer,但是发现Jexus里面这样用会造成不稳定,于是想法设法做类似windows的服务.

 

最开始研究的使用mono-service 做,后来发现例子很少,一直不能成功.

于是转而用Supervisor,线上一段摘录

Supervisor是一个C/S系统,它可以在类unix操作系统让用户来监视和控制后台服务进程的数量,一个很重要的功能就是监控服务器的主要后台进程,并在出现问题是自动重启。

 

首先安装

安装完成之后做配置   /etc/supervisor/supervisord.conf

添加如下代码

[include]
files = /etc/supervisor/conf.d/*.conf

/etc/supervisor/conf.d 新建yhhz5.conf

[program:yhhz5s]  
command=mono /var/www/yhhz5s/XXX.Console.exe
directory=/var/www/yhhz5s/
user=root
stderr_logfile = /root/error.log
stdout_logfile = /root/main.log
autostart=true
autorestart=true
startsecs=10

启动服务和停止服务

supervisorctl stop yhhz5s
supervisorctl start yhhz5s

打开命令行

supervisorctl

打开命令行之后查看状态

status

 

程序本身写成一个console

            int second = int.Parse(System.Configuration.ConfigurationSettings.AppSettings["Interval"]); 
            if (DateTime.Now.Hour >= 21 || DateTime.Now.Hour < 9)  //晚上21点到第二天早上9点,采集频率降低为20分钟一次 
                second = int.Parse(System.Configuration.ConfigurationSettings.AppSettings["IntervalAtNight"]); 
            second = second / 2; 
            Thread.Sleep(second * 1000); 
            LogHelper.Info("__________________________________________________________");
            LogHelper.Info("====================End Application======================="); 
            CollectStart.Start(); 
            LogHelper.Info("====================End Application=======================");
            LogHelper.Info("ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ"); 
            Thread.Sleep(second * 1000);

 

written by ocean \\ tags:

5月 14

从ubuntu官网下载安装

首先配置上网

sudo vi /etc/network/interfaces
auto lo
iface lo inet loopback
#添加如下配置
auto eth0
iface eth0 inet static
address 172.28.3.28
netmask 255.255.255.0
getway 172.28.3.1

nameserver DNS配置

sudo vi /etc/resolv.conf
nameserver 172.28.3.10
nameserver 8.8.8.8

这个会被覆盖,需要设置成永久DNS

cd /etc/resolvconf/resolv.conf.d/ 
sudo vi base
nameserver 172.28.3.10
nameserver 8.8.8.8

添加默认路由

route add default gw 172.28.3.1

这个默认路由会随着重启而失效,永久添加方法如下

vi /etc/rc.local

添加如下内容

route add default gw 172.28.3.1

 

重启网络

sudo /etc/init.d/networking restart

 

开启root远程SSH

sudo vi /etc/ssh/sshd_config

修改如下

PermitRootLogin yes

添加root用户

sudo passwd root

 开启root远程ssh登录

vi  /etc/ssh/sshd_config

在Authentication部分,注释掉“PermitRootLogin without-password”

在Authentication部分,添加“PermitRootLogin yes”

 重新启动ssh服务,命令:sudo service ssh restart

 

出现能ping通IP但是不能ping域名的情况

/etc/resolv.conf

添加默认DNS即可

nameserver 172.28.3.1

更换国内源,14.04.3

首先备份

sudo cp /etc/apt/sources.list /etc/apt/sources.list.old

更换内容如下

deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse 

deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse 

deb http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse

written by ocean