(腾讯云)centos下配置安装nginx+php+ftp+mysql

一、安装环境:

centos6.8×86(腾讯云主机)
工具secureCRT(或者putty)+Filezilla
(工具是在客户端使用的)

二、使用客户端链接远程服务器,这里使用的是SecureCRT

1.先建立一个session,地址是腾讯云的ip地址
账号和密码是你当初设的(注意要使用公网IP)

2.使用SSH客户端登陆成功:

三、现在开始安装nginx:

1.安装nginx:
添加centos资源库:
在ssh中输入:

vi /etc/yum.repos.d/nginx.repo

更改为以下内容:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

使用yum 命令去安装 nginx
yum install nginx
测试nginx服务状态:
service nginx status
显示已停止
测试nginx配置文件:
nginx -t
显示OK则安装成功,稍后可以启动nginx服务
service nginx start
此时使用之前SSH的IP地址已经可以成功访问静态网页,但是为了让其支持动态,还需要进行下一步操作。
2.配置nginx:
将你的域名指向腾讯云主机,腾讯1元主机抢到 的话还送一张CN域名首年优惠券。然后编辑nginx的配置文件支持你的域名:

vi /etc/nginx/conf.d/default.conf

修改这两项server_name 是你的域名,location是站点根目录

server {
listen 80;
server_name youdomian.com;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /var/youdomian.com;
index index.html index.htm;
}

修改下面的项使其支持php
location ~ \.php$ {
# root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}

详见:
default.conf
重新加载nginx使其生效
service nginx reload

四、安装php-fpm

1.为了 nginx 能够执行 php 文件,还需要安装php-fpm
直接使用yum源安装
yum install php-fpm
2.安装成功以后检查php-fpm运行状态,方法和nginx检查方法一致,这里不再赘述
重启nginx,使其支持php。
service nginx restart
3.现在可以在网站根目录下新建一个index.php进行测试
cd /var/youdomian.com
vi index.php

只需加上这样一句:

可以得到如下结果,说明成功:

你的php版本可能和我的不同,但是建议升级到5.6,升级php可以看:

五、安装mysql

1.配置扩展,并令php-fpm支持:

yum install php-pecl-apc php-mysql php-gd php-mcrypt php-pear php-mbstring php-xmlrpc php-dom
service php-fpm restart

2.安装mysql

yum install mysql-server

3.启动mysql服务

service mysqld start

4.进行mysql安全设置,这里可以一路y下去:

mysql_secure_installation

这里可能还有一个问题,就是mysql不能正常链接,需要添加外网访问的支持。
使用phpmyadmin(可选)来管理mysql:

 

六、安装服务端FTP管理工具VSFTP

安装vsftp:
yum install vsftpd
启用vsftpd
service vsftpd restart
当然这样的话只能使用root用户登陆,是不安全的,为了更好保护数据,我们通常会建立相关的ftp虚拟账户,请看vsftp搭建多站点,这个过程通过虚拟账户来实现,能够更好的保护root。
VSFTP实现多用户:

VSFTP实现多用户访问,基于虚拟用户架设VSFTP

 

这样本篇文章就结束了,如果大家再安装过程中遇到什么问题,可以给我留言,看到以后会尽快回复大家的。

centos6安装phpmyadmin 管理mysql

一、安装环境:

centos6.8 32位腾讯云主机
php5.6+mysql5.5
(如果不升级可能会导致各种奇怪的错误)
但是基本上所有的主机刚开始都是过时版本,所以可能需要升级,安装升级方法参考:

二、开始安装:

1.首先去phpmyadmin官网查看最新包:

https://www.phpmyadmin.net/downloads/

可以看到最新版为4.66,可以用wget命令获取到linux或者使用ftp工具上传即可

wget https://files.phpmyadmin.net/phpMyAdmin/4.6.6/phpMyAdmin-4.6.6-all-languages.tar.gz
2.解压:
tar -xvzf phpMyAdmin-4.6.6-all-languages.tar.gz
此处要和你下载的版本名一致。
解压以后,将其放在你网站的根目录,并修改文件夹名称如:
mv phpMyAdmin-4.6.6-all-languages /var/x.wolfmark.org/
cd /var/x.wolfmark.org
mv phpMyAdmin-4.6.6-all-languages phpmyadmin

3.最后修改一下config.sample.inc.php这个文件就可以使用了
cp config.sample.inc.php config.inc.php
vi config.inc.php

后面也可以参考官方文档:https://docs.phpmyadmin.net/zh_CN/latest/setup.html#manually-creating-the-file
为$cfg[‘blowfish_secret’]项加密
$cfg['blowfish_secret'] = '1{dd0`<Q),5XP_:R9UK%%8\"EEcyH#{o';
分号之间的内容随便填,越复杂越好
更改授权,允许ip段登陆:
$cfg['Servers'][$i]['host'] = '127.0.0.1';
127.0.0.1更改为你的ip地址
现在就可以访问你的phpmyadmin了
如:https://x.wolfmark.org/phpmyadmin

centos下升级mysql5.5+php5.6

现在windows中的软件随着需求量每时每刻都在更新,不更新再难满足用户需求。linux也是一样,落伍的软件版本已经不再试用,本篇文章主要针对linux环境下php和mysql的升级。

测试环境:

CENTOS6.8(腾讯云学生机) mysql 版本 5.1 php 版本5.3

一、更新php版本为5.6

1.查看并删除原有的php5.3(如果没有安装可以直接安装php5.6)

查看原本的php版本:
 php -V
查看已经安装的php的包:
 yum list installed | grep php
然后删除这些包:
yum remove ... ...
检查是否删除完毕:
yum list installed | grep php
结果为空则证明删除完毕
2.安装php5.6
添加源:
rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

使用yum list命令查看可安装的包:
yum list --enablerepo=remi --enablerepo=remi-php56 | grep php
安装php5.6
yum install ... ...
省略号为上面显示的和php5.6有关的内容
比如我这里是:
yum install php56w.i386 php56w-bcmath.i386 php56w-cli.i386 php56w-common.i386 php56w-dba.i386 php56w-devel.i386 php56w-embedded.i386 php56w-enchant.i386 php56w-fpm.i386 php56w-gd.i386 php56w-imap.i386 php56w-interbase.i386 php56w-intl.i386 php56w-ldap.i386 php56w-mbstring.i386 php56w-mcrypt.i386 php56w-mssql.i386 php56w-mysql.i386 hp56w-mysqlnd.i386 php56w-odbc.i386 php56w-opcache.i386 php56w-pdo.i386
一定要把目录中的所有项都安装,否则会出现未知错误,只能卸了重新安装。
成功以后,我们可以查看现在的php版本:
php --version
重启php-fpm:
service php-fpm restart

二、升级mysql到5.5

1.卸载原来的mysql5.1
查看是否安装了mysql:
rpm -qa| grep mysql
卸载mysql5.1:
rpm -e mysql-libs --nodeps
2.安装mysql5.5
添加源
rpm -Uvh http://mirror.steadfast.net/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

查看是否增加成功:

yum --enablerepo=remi,remi-test list mysql mysql-server

得到如下结构:

Loading mirror speeds from cached hostfile
* remi: mirrors.tuna.tsinghua.edu.cn
* remi-safe: mirrors.tuna.tsinghua.edu.cn
* remi-test: mirrors.tuna.tsinghua.edu.cn
* webtatic: sp.repo.webtatic.com
Installed Packages
mysql.i686 5.5.54-1.el6.remi @remi
mysql-server.i686 5.5.54-1.el6.remi @remi

安装mysql5.5
yum --enablerepo=remi,remi-test install mysql mysql-server
到最后显示complete表示安装成功
启动mysql
/etc/init.d/mysqld start
支持mysql开机启动
chkconfig --levels 345 mysqld on

以后还可以安装phpmyadmin来管理mysql,详见:

笑盐生

笑盐生

——————脩于而公元二零一七年二月二十四日凌晨,夜不能昧

孤舟披蓑问苍穹,腾龙搅海枭愚鰕。

盐生万里富船去?乌云一号复空舣!

穿着蓑衣,脚踏孤舟,(如浩宇间的一颗孤星般)质问苍穹,高高在上的龙们吹一口气,就可以翻江倒海,高傲而冷漠它们从不知道那小小的鰕虎鱼。盐生想着这些都快忘记了自己远渡万里来到彼岸,就是这船上的东西,也许卖完一船的盐巴就可以得到他此生都难以想象的财富,他就是要用这些来为家中病倒的母亲凑足药费,也许还有剩下的……可以娶个勤劳善良的媳妇也说不定……乌云一下遮住了半边的苍天,盐生被怒号的狂风刮得东倒西歪,他拼命的朝前划着船,可是瘦弱的他在瓢泼大雨下不堪一击,可是他还是不停的将盐巴往船舱里靠紧一点。不知过了多久,船到了彼岸,又和他来这里前一样干干净净,什么都没有剩下。

兰山蓝

兰山蓝
牛大香
安宁深处有单家
肉蛋双飞吃不腻
小菜加上来解乏
凡年双归冬不寒
一栽难得一回聚

——————————————修于公元二零一七年一月三十日

梦虚旎天涯乐于春

水中望月月压湾,
镜中看花画弗圆?
愚拙蘧心伴汝玩,
春风得意知不远。

——————————————脩于公元二零一七年一月

(No title)

愿四域友乐享冬至

雨漱间尖山峦平,
旦改乡音亦难云。
行军侧卧百朝行,
鱼虾百万亿金轮。
至东多食饺,南地更团圆?

__________________________脩于二零一六年冬至日

关于stl标准库里的list的删除

使用C++ STL里的list 我刚开始用的是remove();
这个方法现在发现真的是捉襟见肘。
因为每次移除是按值匹配移除,
所以相同的值的所有元素都被移除:

例子,转置一个链表的一段值:

//程序详见:
template
void ReverseInPart( T & L ,int n )
{//实现功能的主要部分,反转f到t的f-t个元素
cout << "Enter two number as changed form and to :" ; int f, t ; cin >> f >> t ;

if(f >= t || t > n || f < 1) { cout << "Do not need reverse!\n" ; return; } Literator lt= L.begin(); int l = 1 ; while ( l < f) { lt++; l++ ; } Literator ch = lt ;//使用迭代器来完成 ++ch; //迭代器始终指向一个元素的位置,所以lt迭代器每次都前移 //而ch每次指向下一个元素,即第i+1个元素 for(int i = f ; i < t ; ++i,--lt) { int x = *ch ; ++ch; //由于remove会删除所有值为*ch 的元素,所以ch 应该先增加 //使用erase更方便,详见gx/abort_stl_list L.remove(x); L.insert(lt,x); } //remove void remove( const TYPE &val );删除所有值为val的元素 }
可以看出如果输入链表元素都是不同的值的话都无所谓
比如说 1→2→3→4→5,现在逆转2~5
得到:1→5→4→3→2
但是如果输入中有相同的数就会发生错误,
如原链表:1→2→2→1
(其实是个镜像链表,这个在《程序员面试算法》的第17题有体现)
逆转3~4后,L.remove(x);这里x值为1时,
将导致删除两个元素,最后得到的链表就变成了:
2→1→2
后面发现erase()这个方法,可以直接删除迭代器
指向的链表元素,这个方法是很方便的:

template
void ReverseInPart( T & L ,int n )
{//实现功能的主要部分,反转f到t的f-t个元素
cout << "Enter two number as changed form and to :" ; int f, t ; cin >> f >> t ;

if(f >= t || t > n || f < 1) { cout << "Do not need reverse!\n" ; return; } Literator lt= L.begin(); int l = 1 ; while ( l < f) { lt++; l++ ; } Literator ch = lt ;//使用迭代器来完成 ++ch; //迭代器始终指向一个元素的位置,所以lt迭代器每次都前移 //而ch每次指向下一个元素,即第i+1个元素 for(int i = f ; i < t ; ++i,--lt) { int x = *ch ; Literatir d_ch; ++ch; //由于remove会删除所有值为*ch 的元素,所以ch 应该先增加 //使用erase更方便,详见gx/abort_stl_list L.erase(d_ch); L.insert(lt,x); } //remove void remove( const TYPE &val );删除所有值为val的元素 }

初识C++引用&

在将左程云的《程序员面试代码指南》JAVA版转化为C++版中遇到的问题之一就是JAVA的一切皆引用:
C++引用:

void swap(int &a,int &b)

两种写法,比如用来交换数组a的i和j两个位置的值:
写法1:

//1:声明为指针型:
template
void Swap(T *a,T *b)
{
T tmp ;
tmp = *a ;
*a = *b;
*b = tmp ;
}
//调用时:
Swap(&a[i],&a[j]);

写法2:

//2:声明为引用类型;
void Swap(T &a,T &b)
{
T c = a;
a = b ;
b = c;
}
//调用时:
swap(list[i],list[k]);

未完待续!

关于C++的动态数组

一、动态数组的优点:
动态分配内存,用一个指针传值方便。

二、为什么我要用动态数组?
在程序中遇到数组的传递时,函数中的创建的数组由于在函数作用域
外无效,所以不能有效的传递。

三、动态数组实例:

一维动态数组:

#include
using namespace std;
int main()
{
//使用new,在程序运行时动态分配空间
int * arr = new int[10];
//赋值方法和普通数组通用
for(int i = 0 ; i < 10 ; i++ ) { arr[i] = i; } //释放空间 delete []arr; return 0; }

使用new 和delete时应当注意:
1.不要使用delete来释放不是new分配的内存
2.不要使用delete来释放同一个内存块两次
3.如果使用new[]维数组分配内存,则应使用delete[]来释放
4.如果使用new[]来为一个实体分配内存,则应使用delete(没有方括号)来释放内存
5.对空指针使用delete是安全的

二维动态数组:

两种二维数组开辟空间的方法:
方法1:

int r,c;//r is rows ,c is cols
r = 5 ;
c = 8 ;
//method 1 to initialize a dynamic-planar arr
int **arr = new int*[r];
for (int i = 0 ; i
上面方法的创建的二维数组是不连续的,所以需要进行寻址,
如果要进行赋初值,必须一一赋值,而不能一次用:
arr[0]={0}将arr全部赋值为0。

寻址和赋初值为0:

//method 1 to initialize a dynamic-planar arr
//寻址
for(int i = 1 ; i < r ; ++i) { arr[i] = arr[i - 1] + c ; } //赋初值为0 for(int i = 0 ; i < r ; i++) { for(int j = 0 ; j < c ; j++ ) { arr[i][j] = 0; } }

方法2:


//method 2 to initialize a dynamic-planar arr
int ** arr = new int*[r];
int size = r*c;
arr[0]= new int[size];
for(int i = 1 ; i < r ; i++) { arr[i] = &arr[0][i*c]; } //using std::fill to fill 0 std::fill( &arr[0][0], &arr[0][0]+r*c, 0); //上面的方法1寻址后即可用此方法填满

二维动态数组空间释放:

for(int i = 0 ; i < r ; i++) { delete [] arr[i]; } delete [] arr;

如果二维动态数组作为返回值或者参数的方法见完整函数:
https://github.com/ghostxiu/justfortest/blob/master/arr.cc