最近要求搭建Linux+nginx+mysql+php以下简称(lnmp)环境来实现校内资源网,,事情来的太过于突然,重点是对以上的平台并不是特别的了解,于是开始了折腾的道路,以下记录了我这三天来的搭建实例,可复现。
开始之前先科普一下上述中的基本知识。
**Linux:**采用的是VMware12版本开启的是Ubuntu16.04版本,64位。
nginx: 采用Ubuntu apt-get 安装方式安装的1.10.3版本
MySQL 也是Ubuntu apt-get 安装方式,版本为5.7.20
php 同上 版本为5.6
nexusPHP: 这是NexusPHP由来自浙江大学的Nexus团队发起并开发完成。它的目标是代替TBSource项目,提供一个完整的、有序的、重视用户信誉和知识的资源分享社区的解决方案。
这是一个比较老的BT开源项目,2010年开源的。源码库:源码镜像
介绍完毕,开始干活!
下载VMware
因为采用的是VMware平台所以,首先下载VMware12pro,推荐腾讯高速下载地址,速度很快,几分钟完事。然后安装好VMware。
下载Linux
推荐阿里云镜像网站,选择ubuntu-releases,然后选择Ubuntu版本,下载速度很快,10分钟解决。
然后请参照网络教程配好VMware+Linux环境,这里不再赘述。
虚拟机Linux环境:
sudo apt-get update
sudo apt-get install mysql-server
sudo apt install libmysqlclient-dev
补充: sudo apt-get install mysql-server
上述命令会安装以下包:
apparmor
mysql-client-5.7 //MySQL的命令行工具
mysql-common
mysql-server
mysql-server-5.7
mysql-server-core-5.7
因此无需再安装mysql-client等。安装过程会提示设置mysql root用户的密码,设置完成后等待自动安装即可。默认安装完成就启动了mysql。
上面的libmysqlclient-dev 官方解释是Connector/C (libmysqlclient) is a client library for C development.
• 启动和关闭mysql服务器:
service mysql start
service mysql stop
安装成功后可以通过下面的命令测试是否安装成功:
sudo netstat -tap | grep mysql
出现以下错误
Enter password:
ERROR 1698 (28000): Access denied for user ‘root’@'localhost’
使用sudo解决权限问题
sudo mysql –u root -p
查看MySQL字符集,不懂的可以查看我以前的MySQL文章
使用以下命令
sudo gedit /etc/mysql/mysql.conf.d/mysqld.cnf
在[mysqld]下添加一行 character_set_server=utf8
(则上面的character_set_server 和character_set_database 将会设置为uft8,
同理添加[mysql]组中的default_character_set=utf8,
则character_set_client、character_set_connection以及character_set_results
将会被修改为utf8,因为已设置所以忽略)
重启MySQL服务。service mysql restart
登陆MySQL,并查看MySQL目前设置的编码show variables like “char%”;
成功!
如果安装失败建议卸载干净,重新来过。
下面回顾一下安装过程中我遇到的问题:
1、安装到Renaming removed key_buffer and myisam-recover options (if present)就卡住了,而且ctrl+C 也无法退出,最后我关闭了终端强制退出了,但是我发现运用sudo netstat -tap | grep mysql 居然显示是启动成功的,可是进入shell界面就会出现问题,提示**ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password:YES)**网上找了一堆方法,都无法解决。
无奈考虑卸载重装:
sudo apt-get autoremove mysql --purge*
s udo apt-get remove apparmor //这个apparmor是在装mysql-server时装上的,和安全有关
2、重启电脑后(很多时候重启是法宝),再次利用命令apt-get安装mysql-server,运行到Renaming removed key_buffer and myisam-recover options (if present)仍然卡住了,我再次中止了终端,发现启动也是成功的,尝试进入shell界面,出现另一种新的错误:ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2), 然后又是找了很多国内外资料,国内百度无法搜索出和这个错误完全相关的,还是老实FQ上谷歌,提出的方案是需要删除一些重复的配置文件,但是我连这个/var/run/mysqld/mysqld.sock没有,因此仍然无法解决。
再次卸载。考虑一定要卸载非常彻底。
sudo apt-get autoremove mysql --purge*
sudo apt-get remove apparmor
sudo rm /var/lib/mysql/ -R //非常重要
sudo rm /etc/mysql/ -R //非常重要
3、重启电脑,再次利用命令sudo apt-get install mysql-server 顺利安装成功!
ps:
附上vi编辑要点:点击i进入编辑模式,在按esc键输入:wq!(保存并退出vi编辑模式)
写一个简单的程序来访问该数据库,实现 show tables 功能:
#include
#include
#include
int main()
{
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
char server[] = "localhost";
char user[] = "root";
char password[] = "mima";
char database[] = "mysql";
conn = mysql_init(NULL);
if (!mysql_real_connect(conn, server,user, password, database, 0, NULL, 0))
{
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}
if (mysql_query(conn, "show tables"))
{
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}
res = mysql_use_result(conn);
printf("MySQL Tables in mysql database:\n");
while ((row = mysql_fetch_row(res)) != NULL)
{
printf("%s \n", row[0]);
}
mysql_free_result(res);
mysql_close(conn);
printf("finish! \n");
return 0;
}
编译代码的时候需要链接mysql的库,可以通过如下方式编译:
g++ -Wall mysql_test.cpp -o mysql_test -lmsqlclient
然后运行编译好的代码:
怎么样,是不是很酷!
Nginx安装:
nginx的核心是http路由,但是还有反向代理、负载均衡甚至邮件服务器等功能。
nginx的安装有两种方式:其一,源代码安装; **其二,linux packages安装。**从linux packages安装方便简洁。
先来说一说Linux—packages安装方法:
1、首先添加nginx_signing.key(必须,否则出错)
$ wget http://nginx.org/keys/nginx_signing.key
$ sudo apt-key add nginx_signing.key
2、添加]Nginx](http://nginx.org/)官方提供的源
$ echo "deb http://nginx.org/packages/ubuntu/ trusty nginx" >> /etc/apt/sources.list
$ echo "deb-src http://nginx.org/packages/ubuntu/ trusty nginx" >> /etc/apt/sources.list
3、更新源并安装Nginx
$ sudo apt-get update
$ sudo apt-get install nginx
4、安装Nginx完成后可查看版本号,输入
$ /usr/sbin/nginx -v
查看端口:
sudo lsof -i :80
浏览器输入localhost 出现如下则表示成功
Ubuntu安装之后的文件结构大致为:
• 一、通过apt-get安装:
• 所有的配置文件都在/etc/nginx下,并且每个虚拟主机已经安排在了/etc/nginx/sites-available下
• 程序文件在/usr/sbin/nginx
• 日志放在了/var/log/nginx中
• 并已经在/etc/init.d/下创建了启动脚本nginx
• 默认的虚拟主机的目录设置在了/var/www/nginx-default
二、通过源码安装。
而自己利用默认配置编译的,则放在/usr/local/nginx下,以下是目录结构:
• /usr/local/nginx/conf 配置目录
• /usr/local/nginx/html 默认的网站根目录
• /usr/local/nginx/logs 日志和pid文件目录
• /usr/local/nginx/sbin 执行文件目录
Ubuntu apt-get安装请运行:
sudo service nginx restart
源码安装请运行:
sudo /usr/local/nginx/sbin/nginx
建议:源码安装是一个坑,建议ubuntu自带的apt-get install nginx,当然如果您喜欢折腾,完全可以使用源码安装,只是希望您能够没有我当时的倒霉运气,源码安装可参考Ubuntu16.04.1 安装Nginx
安装PHP5.6
1、添加PPA
$ sudo apt-get install python-software-properties software-properties-common
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get update
2、安装PHP5.6以及所需的一些扩展
$ sudo apt-get install php5.6-fpm php5.6-mysql php5.6-common php5.6-curl php5.6-cli php5.6-mcrypt php5.6-mbstring php5.6-dom
3、配置PHP5.6
打开php.ini配置文件:
$ sudo gedit /etc/php/5.6/fpm/php.ini
找到cgi.fix_pathinfo选项,去掉注释;,然后将值设置为0:
cgi.fix_pathinfo = 0;
display_errors = on
sudo gedit /etc/nginx/sites-available/default
找到以下内容,并修改为如下所示
location ~ \.php$ {
# include snippets/fastcgi-php.conf;
#
# # With php7.0-cgi alone:
# fastcgi_pass 127.0.0.1:9000;
# # With php7.0-fpm:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php5.6-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
sudo service php5.6-fpm restart
sudo service nginx restart
测试是否安装nginx和php5.6成功
普及一下,讲一讲default文件的基本知识:
如果想要更深层次的了解nginx+php原理,可以移步nginx+php的配置与原理
特别说明一下 的是搭建NexusPHP需要memcache支持,
MemCache虽然被称为”分布式缓存”,但是MemCache本身完全不具备分布式的功能
Memcache 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。 MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储,数据可以来自数据库调用、API调用,或者页面渲染的结果。MemCache设计理念就是小而强大,它简单的设计促进了快速部署、易于开发并解决面对大规模的数据缓存的许多难题,而所开放的API使得MemCache能用于Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程序语言。
Ubuntu 下安装 MemCache
使用命令 sudo apt-get install -y memcached 来安装memcache
安装完成后默认会在 localhost:11211 上启动一个默认实例
使用命令 ps aux | grep memcached 来查看是否正常运行
查看安装
dpkg -s memcached
使用命令 telnet localhost 11211 来连接memcache实例
安装Memcache的PHP扩展
sudo apt-get install php-memcache
3.上述安装完后会有类似这样的提示:
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-2007xxxx/
无法找到的可以去php.ini中寻找 ,我的是在 extension_dir=/usr/lib/php/20131226/
4.把php.ini中的extension_dir = "./"修改为
extension_dir = “/usr/lib/php/20131226/”
5.添加一行来载入memcache扩展:extension=memcache.so
< ?php
$mem = new Memcache;
$mem->connect("127.0.0.1", 11211);
$mem->set('key', 'This is a test!', 0, 60);
$val = $mem->get('key');
echo $val;
?>
root@unclelu:~# apt-get install postfix
可以借鉴 (ubuntu安装phpmyadmin)
安装过程中没有nginx选项,可以跳过。
建立软连接
重启nginx
sudo service nginx restart
然后打开浏览器访问 localhost/phpmyadmin/index.php 出现如下界面则表示成功。
首先从NexusPHP官网下载源码程序,源码库:源码镜像
恢复原网站msyqldump文件
导入数据库文件,(根目录_db下的dbstructure.sql文件)
经过分析发现源备份mysql版本为5.1,存储引擎默认为MyISAM,字符集为utf8,而安装的MySQL版本如下:
查阅资料可知MySQL自5.5版本后已经存储引擎更改为InnoDB,故而首先更改会话存储引擎(注意:这个只是当前会话更改,下次重启还是InnoDB存储引擎,想要永久更改请修改my.cnf文件)
因为之前已经更改过了字符集为utf8,故不再赘述。
之后先创建一个以前备份过同名数据库,然后开始执行dump后的sql文件(\.
或者source
)
使用空密码是无法和php连接的,故而需要修改MySQL密码。
修改MySQL(版本5.7.20)密码注意大小写
执行修改密码操作!
**1、**首先将my.ini中加入在[mysqld]节点上加skip-grant-tables
主要作用是:跳过表中的验证,可以无密码登陆。
**2、**登录之后查询plugin字段值:
mysql> select plugin from user where user = ‘root’;
执行结果plugin字段为空。
**3、**更新plugin字段为mysql默认值:
mysql>update user set plugin=“mysql_native_password” where User=‘root’
**4、**更新成功,继续执行更新密码操作:
mysql> update user set authentication_string=password(’******’) where user=‘root’ and host=‘localhost’;
**5、**刷新权限:
mysql> flush privileges;
**6、**将my.ini中的skip-grant-tables注释掉或者删掉
重启mysql,密码更新成功
切记一定不要忘记 这条语句 否则密码依旧会更改失败
update user set plugin="mysql_native_password" where User='root';
重启MySQL
service mysql restart
重启nginx
service nginx restart
重启php-fpm
service php5.6-fpm restart
然后导入数据库文件,(根目录_db下的dbstructure.sql文件)导入完毕后修改配置文件,在config文件下下面有一个allconfig.php 的文件,修改下面的内容:
‘SITENAME’ => ‘站点名称’
‘baseURL’ => ‘网站URL’
‘announce_url’ => ‘localhost/announce.php’(announce的url地址)
‘mysql_host’ => ‘MySQL主机’
‘mysql_user’ => ‘数据库用户名’
‘mysql_pass’ => ‘数据库密码’
‘mysql_db’ => ‘数据库名’
值得注意的是(修改’classes\class_cache.php’中的localhost为127.0.0.1)好像是为了避免出现下面这个错误的**(如果没有错误则不需要修改)**:
**Warning: Memcache::connect() [memcache.connect]: Can’t connect to localhost: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 **
最后配置
想将网站目录权限设置为777
root@unclelu:~# chmod -R 777 /var/www
上传nexusphp的所有文件到/var/www 再将config目录权限为777,否则最后无法更新网站配置
root@unclelu:~# chmod -R 777 /var/www/config
接下来是设置管理员
首先自己访问网站然后注册一个用户名,接着进入数据库管理(phpMyAdmin),在users表里面找到你注册的用户,编辑它的class属性为16
还可以通过下面的方法设置:
1.使用正常方式在网站注册一个新用户,假设用户名为admin。
2.输入以下命令进入MySQL命令行管理工具: mysql -u root -p nexusrocks -h localhost 注意:将’root’,’nexusrocks’,’localhost’分别替换成你的MySQL用户名、密码、主机地址。
2.在MySQL命令行管理工具输入以下命令: USE nexus; UPDATE users SET class=’16′ WHERE username=’admin’; 注意:将以上命令中的’nexus’替换成你的数据库名,将’admin’替换成你注册的用户名。
3.退出MySQL命令行管理工具:
到这里PT基本上就架设完毕了,现在只需要利用管理员帐号对站点进行设置和调整就可以了。
测试是否可以正常使用
浏览器输入localhost/nexusphp/login.php 出现如下页面则表示成功。
如果验证码无法加载
如果出现验证码无法加载的情况,多半是php的扩展没有安装完全。
无非是GD库没有加载,或者是session写入权限问题。
① GD库没有加载
sudo apt-get install php5.6-gd
修改php.ini:
extension_dir="/usr/lib/php/20*********"
再添加一行
extension=gd.so
重启nginx
sudo service nginx restart
② session写入权限问题
首先通过php测试脚本获取到session的保存路径,然后赋予该文件路径权限777
修改权限为777.
呼~,终于在规定的时间内完成了这项艰巨的任务,一开始的环境搭建其实是充满着非常多的坑的,建议如果是着急时间的话最好采取最简单可行的办法去完成(能apt-get就不要源码安装),否则你也会像楼主一样有那么一段焦躁的时间,果然《黑客与画家》里面讲的几点原则是对的,首先什么都不要管,最要紧的是如何在最短的时间里做出成果,哪怕是简陋版的也行,只要运行起来就可以了,后期再逐渐完善就好了,弄完之后,心得很多,感触最多的就是虚拟机真好,在此期间重装过很多次系统,因为总是有那么一点点强迫症,还有特别感谢阿里云镜像的Ubuntu系统,十分钟下完系统也是没谁了,不过最应该感谢的还是自己,养成了一个开干过程中每进行一个阶段就赶紧记录的好习惯,这也是完成这篇博文的原因之一,更多的好戏还在后头,希望能够在更短的时间内完成更多的任务,为世界继续发挥我的光与热!