前言
公司业务扩展需要大力提高微信用户的关注度,但是主服务器都在境外,国内客户访问速度成为了最大的障碍。先后试验过CloudFlare跟腾讯DNS加速,但是都无法逾越我们的万里长城万里长。所以决定将服务区块整体迁移,将国际跟国内业务分开。在对比了腾讯跟阿里两朵云彩之后,决定牵手小肥鹅。老板问为啥用肥鹅?“便宜!” 我撇下两个字跟一个大大的惊叹号绝尘而去,留下老板一人在风中感激涕零......
系统配置
服务器的配置需要根据的不同的需求做不同的改动,云服务器的好处是比较灵活,可以根据后续发展做适当调整。根据我们公司的业务模式我选择了如下的配置:
- 基础配置:8核CPU 16G内存
- 系统硬盘:200G SSD云硬盘
- 数据硬盘:100G SSD云硬盘
- 操作系统:Ubuntu 16.04
对于系统,在CentOS跟Ubuntu之间我做了一个选择:Ubuntu. 这里做个简单的说明,很多人说用CentOS好因为支持周期长,而且优化效果更好。但是从公司运营成本角度讲,Ubuntu上的套件数量丰富,更新快,安装简单,部署速度快。基本上起一个服务器也就不到半个小时,多台的话可以自己做映射,然后修改dns路由器直接切换到新服务器上了。对于迭代频繁的项目来说还是非常适合的。
有点跑偏了,言归正传,老司机开车了,大家一起飞起来:
SSH配置
任何一个云都提供了SSH登陆模式,有的人喜欢给每个SSH登陆配一个专属的公钥,我个人的习惯是用我本身Mac电脑的公钥去匹配相关SSH登陆,这因人而异。其次,处于安全考虑腾讯云给Ubuntu系统自动配置一个用户ubuntu,这个用户不是root用户,这个要注意一下。 具体的Linux登陆实例网上有很多,我就不在这里的嘚啵了,给个官网链接:
链接描述
Nginx配置
安装
如我前文提到的,Ubuntu已经套好了很多软件,安装Nginx也是简单到非常,只要执行下列命令即可安装:
$ sudo apt-get update // 先升级apt管理包!先升级apt管理包!先升级apt管理包!
$ sudo apt-get install nginx // 再安装Nginx
// 注意,从Ubuntu 16.04开始 Nginx已经实现自动配置,装完即可运行.
防火墙
然后检查一下Ubuntu自带的防火墙管理工具UFW是否为开启状态:
$ sudo ufw status
如果是第一次安装,通常的输出结果为:
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
如果你在上面的输出没看到Nginx字样,请执行下面命令:
$ sudo ufw allow 'Nginx HTTP' // 允许接受Nginx的HTTP请求
然后你可以检测UFW的支持列表:
$ sudo ufw app list // 可重复上面的命令吧Nginx的HTTPS协议也安装好
关于UFW,可以自行查阅相关文档,使用很简单,可以通过它控制你的网站链接,屏蔽IP地址,数据库链接,邮件端口...
最后,让我们检查一下Nginx的安装情况吧:
$ systemctl status nginx
如果安装顺利,输出结果会有Active: active (running)
字样.
测试
现在我们可以看看服务器访问是否顺利,首先是得到当前服务器IP地址:
$ ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
上面命令会返回几行结果,其中包括你的服务器的外网IP地址,然后你可以通过:http://外网IP地址
来访问你的服务器,如果一切顺利,你就会看到久违的画面:
知识点
?关于Ngixn常用的文件以及目录:
-
/etc/nginx
这个是存放所有Nginx相关的配置文件的目录。 -
/etc/nginx/nginx.conf
这个是Nginx的全局默认配置文件,不建议修改如果你不清楚的话。 -
/etc/nginx/sites-available/
这个目录可以理解为你所有网站的配置文件目录,但是并不是所有的网站都发布了。 -
/etc/nginx/sites-enabled/
这个目录是你所有发布的网站的配置文件目录。是通过symbolic link连接起来了,所有网站都是已经发布的网站。 -
/var/log/nginx/access.log
Nginx的access日志 -
/var/log/nginx/error.log
Nginx的错误日志
其他目录及文件请参考:常用目录手册
?启动和停止Nginx服务:
//方法一:
$ sudo /etc/init.d/nginx start // 开启
$ sudo /etc/init.d/nginx stop // 停止
$ sudo /etc/init.d/nginx restart // 重启
//方法二:
$ sudo systemctl start nginx // 开启
$ sudo systemctl stop nginx // 停止
$ sudo systemctl restart nginx // 重启
数据库配置
安装
简简单单:
$ sudo apt-get install mysql-server mysql-client
然后会有个提示 Do you want to continue? [Y/n]
输入 Y
即可。在快安装完毕时,会跳出设置 root 密码的界面。注意该root
为数据库的用户,而非服务器账户, 别搞混了。
然后测试数据库登陆是否正常:
$ mysql -u root –p // 输入上一步设置的密码
然后测试数据库端口监听是否正常:
$ netstat -an | grep 3306
处于安全考虑,我个人不太推荐配置远程访问。所以有需要了解远程设置的童鞋请自行解决,我不负责?
知识点
?关于远程设置,千万别忘记修改/etc/mysql/my.cnf
文件,把bind-address = 127.0.0.1
开启 。
?如果在后续开发过程中遇到了类似下面这个错误,
SELECT list is not in GROUP BY clause and contains nonaggregated column 错误
解决办法:得修改/etc/mysql/mysql.cnf
文件,添加下面一行代码
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
?启动和停止MySql服务:
$ sudo /etc/init.d/mysql start
$ sudo /etc/init.d/mysql stop
$ sudo /etc/init.d/mysql restart
PHP7配置
安装
因为PHP7并不在Ubuntu 16.04的预备库中,所以需要借用第三方仓库安装:
// 由于我装的是7.1版本的PHP,所以仅以此为例,各位看官自行参考
$ sudo apt-add-repository ppa:ondrej/php
$ sudo apt-get install php7.1 php7.1-fpm
// 然后可执行下面命令决定安装那些php组件
$ sudo apt-cache search php7.1
// 我选择的组件是:
$ sudo apt-get install php7.1-cli php7.1-common php7.1-json php7.1-opcache php7.1-mysql php7.1-mbstring php7.1-mcrypt php7.1-zip php7.1-xml php7.1-gd php7.1-curl php7.1-soap php-mongodb php-uuid php-radius php-http php-memcached php-memcache php-mailparse php-sass php7.1-bcmath
配置php.ini
经过上面的几个命令,PHP安装成功后,接下来我们需要走一些基本配置。首先是要找到你的php.ini文件,捂脸呐喊在哪里是没有用的,要用下面的命令来找:
// 查找php.ini文件。这里要注意很多网上的文章只给出默认的路径但不是真正的执行的路径。
$ php --ini |grep Loaded
// 然后打开php.ini
$ vim /path_to_php_ini/php.ini
- 找到
cgi.fix_pathinfo=0
并且取消注释并且设置值为0
这是一个很不安全的设置,因为它告诉PHP如果找不到请求的文件(比如:store.php),那么就试图执行最接近的文件(比如:stores.php)。问你怕没?? - 控制php脚本能访问的目录。使用
open_basedir
选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问不应该访问的文件,一定程度上限制了phpshell的危害。 - 关闭危险函数。如果打开了安全模式,那么函数禁止是可以不需要的,但是我们为了安全还是考虑进去。
disable_functions = system,passthru,exec,shell_exec,popen,phpinfo
- 关闭PHP版本信息。为了防止黑客通过telnet获取服务器中php版本的信息,可以选择关闭该信息斜路:
expose_php = Off
- 防止SQL注入。设置
magic_quotes_gpc = On
将自动把用户提交对sql的查询进行转换,比如把 ' 转为 '等,这对防止sql注射有重大作用。 - 错误信息控制。
display_errors = Off
将全部关闭错误信息显示,如果必须要显示建议控制错误显示级别:error_reporting = E_WARNING & E_ERROR
。 当然如果是开发环境另当别论。这里要特别注意一下,在Ubuntu系统里,如果需要显示php错误,要修改pool.d
文件:
$ sudo vim /etc/php/7.1/fpm/pool.d
// 找到并修改catch_workers_output = yes 来显示php错误
配置完后要记得重启PHP.
PhpMyAdmin配置
安装
啥也不说了,开整:
$ sudo apt install phpmyadmin
注意
这里没有Nginx的选项,所只需要点击TAB按键,然后选择OK,然后点击回车键
下面这一步要选择Yes
:
下面这一步请输入一个高强度密码:
知识点
这里提前说一下,在域名配置完成后,当你访问你的phpMyAdmin(这里登陆是用到了之前设置的root用户跟密码)的时候你会看到很多系统的数据库,如果你不想显示这些系统信息可以通过修改数据库配置文件隐藏相关数据库。
phpMyAdmin的config文件在: /var/lib/phpmyadmi/config.inc.php
如果你没有找到这个文件,那么你可以执行下面的命令:
$ sudo mv /usr/share/phpmyadmin/config.sample.inc.php /var/lib/phpmyadmin/config.inc.php
然后你可以添加下面的code在该文件最后:
$cfg['Servers'][$i]['hide_db'] = '^(information_schema|performance_schema|mysql|phpmyadmin|sys)$';
// 你可以根据自己的需要选择隐藏不同的数据库
然后还要记得填写一个加密盐,不然会报错。
$cfg['blowfish_secret'] = '写入你自己的加密字串' ;
/* 例如:bc9{8IdRoGm5Sdf(qt!s */
腾讯云域名配置
各种云的域名解析界面做的都非常友好,很直接。在这里我就简单说几个知识点方便大家快速理解跟配置域名。
知识点
?首先的首先,无论你的域名是否在其他地方备案成功,腾讯云都要求你在他们那里在备案一次,不然网站访问不了。
?首先,如果你的域名是在腾讯云以外的商家买的,你要去到你的域名管理界面修改域名的DNS设置,指向腾讯云。
f1g1ns1.dnspod.net
f1g1ns2.dnspod.net
这个文档,腾讯云的官网写的比较详细,可自行参考。点击这里产看手册
?其次,假设你的域名是rocknroll.com
,服务器外网IP为119.29.1.1
。
如果你希望访客可以通过: www.rocknroll.com
访问你的网站,设置为:
如果你希望访客可以通过: rocknroll.com
访问你的网站,设置为:
如果你希望所有的子域名(*.rocknroll.com
)都可以访问,设置为:
都设置好后给腾讯云一些时间,然后你就可以ping你的网址,如果一切顺利将会返回你的外网IP:
$ ping rocknroll.com
// 你的外网IP会返回
其他关于的记录CNAME、TXT、MX、AAAA、SRV等等可以参考官网手册
HTTPS配置
为什么需要HTTPS?因为26岁以上的程序猿、工程狮都觉得需要,你自己看着办吧。
腾讯云提供了免费的SSL证书,虽然级别不高,不过对普通人绝对够了,这点要给肥鹅个赞。
腾讯云基本上用不了20分钟就会批准https申请,并且会发送一封邮件到上面指定的邮箱。 收到邮件后可以去下载编辑好的SSL文件。下载后,可以通过scp命令上传到你的网站上,因为我们的服务器是Nginx,所以你要记得选择打开Nginx文件夹。
知识点
?上传跟管理SSL证书:
$ scp /本地机目录Nginx/1_domain_bundle.crt ssh [email protected]:/tmp
$ scp /本地机目录Nginx/2_domain_.key ssh [email protected]:/tmp
// ubuntu 是腾讯云提供的用户名
// 119.29.1.1 是你网站的外网ip
// tmp文件夹是服务器文件夹可以不用修改权限直接上传
然后要建立文件夹来管理你的SSL证书,我的习惯是在/etc/ssl/
下面创建立相应的域名管理对应的SSL证书:
$ sudo mkdir cd /etc/ssl/domain.com
$ sudo mv /tmp/1_domain_bundle.crt /etc/ssl/domain.com
$ sudo mv /tmp/2_domain_.key /etc/ssl/domain.com
完事具备 只欠东风破
前面安装的各种组件都是为了这个最后的组合:建立Nginx网站对应文件:Server Block
。在Nginx配置里面我介绍了2个特殊目录:
-
/etc/nginx/sites-available/
这个目录可以理解为你所有网站的配置文件目录,但是并不是所有的网站都发布了。 -
/etc/nginx/sites-enabled/
这个目录是你所有发布的网站的配置文件目录。是通过symbolic
link连接起来了,所有网站都是已经发布的网站。
这连个目录就是Ngixn网站的核心配置文件。他们的关系是:sites-available
是本体;sites-enabled
是分身。初级的设置是:在你的服务器上每个网站拥有一个单一的配置文件并且存放到本体里面。然后根据需要可以开启一个对应的分身去打,去浪,去碰撞。
// 主体目录结构。我个人喜好用域名做为文件夹的名字,这个完全取决于个人。
etc/nginx/sites-available/
- rocknroll.com
- me.rocknroll.com
- phpmyadmin.rocknroll.com
// 建立对应的分身:
$ sudo ln -s /etc/nginx/sites-available/rocknroll.com /etc/nginx/sites-enabled/
$ sudo ln -s /etc/nginx/sites-available/me.rocknroll.com /etc/nginx/sites-enabled/
$ sudo ln -s /etc/nginx/sites-available/phpmyadmin.rocknroll.com /etc/nginx/sites-enabled/
// 分身目录结构
etc/nginx/sites-enabled/
- rocknroll.com
- me.rocknroll.com
- phpmyadmin.rocknroll.com
网站骨架搭好了,现在我们来介绍怎样网站配置Server Block
。举个例子,如果通过phpmyadmin.rocknroll.com
访问我们之前设置好的phpMyAdmin软件,可以通过穿件配置文件达到目的:
// 网上有很多不同的方法生成下列文件,我这里列出来的是相对容易理解跟阅读的初级设置方法,仅供参考
server {
listen 80; # 监听80端口
root /usr/share/phpmyadmin; # 网站的绝对路径
index index.php index.html index.htm index.nginx-debian.html; # Index的可执行文件
server_name phpmyadmin.rocknroll.com; # 你的域名。这里可以用变量代替域名$host
rewrite (.*) https://phpmyadmin.rocknroll.com$1 permanent; # 跳转到HTTPS协议。这里可以用变量代替域名$host
}
server {
listen 443; # 监听443端口
server_name phpmyadmin.rocknroll.com; # 你的域名。
# 以下为SSL证书设置
ssl on;
ssl_certificate /etc/ssl/phpmyadmin.rocknroll.com/1_phpmyadmin.rocknroll.com_bundle.crt; # 存放SSL证书的绝对路径
ssl_certificate_key /etc/ssl/phpmyadmin.rocknroll.com/2_phpmyadmin.rocknroll.com.key; # 存放SSL证书的绝对路径
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # 按照这个套件配置
ssl_prefer_server_ciphers on;
root /usr/share/phpmyadmin; # 网站的绝对路径
access_log /var/log/nginx/phpmyadmin.rocknroll.com.access.log; # 网站的访问日志
error_log /var/log/nginx/phpmyadmin.rocknroll.com.error.log; # 网站的错误日志
#location决定客户端发过来的请求URI如何处理
location / { # 处理所有请求
index index.php;
try_files $uri $uri/ /index.php$is_args$query_string;
}
location ~ \.php$ { # 处理以php结尾的文件的所有请求
try_files $uri =404;
fastcgi_pass unix:/run/php/php7.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
关于配置文件,我们需要注意的几个关键点:
检测配置文件是否正确:
# 每次修改配置文件都要检查一下,如果有错误会报错。
$ sudo nginx -t
# 然后根据需要重启相关服务。
$ sudo /etc/init.d/nginx restart //重启Nginx
$ sudo /etc/init.d/php7.1-fpm restart //重启PHP
网站的绝对路径,Nginx通常的配置喜欢是将网站放置到/var/www/html
这个目录下面,当然也可以根据个人喜欢放到其他路径下面。好比我个人比较偏向放到 /srv/www
下面.
root /usr/share/phpmyadmin;
# 网站的绝对路径, 如有需要可以创建
网站域名:
server_name phpmyadmin.rocknroll.com;
# 这里是指定你的域名,可以是一个可以是多个, 用空格链接。这样如果有用户访问该域名就会自动检测这里配对其他设置。
强制HTTPS访问
rewrite (.*) https://phpmyadmin.rocknroll.com$1 permanent;
# 这个是Nginx用于跳转的一种方法, 类似htaccess的rewrite,主要是目的是强制改成https访问增加安全性
大功告成
到此为止,LEMP(Linux, Nginx, MySQL, PHP)服务器的基础设置完成!
最后简单说一下基础的服务器安全问题。
- 要时常更新服务器软件
$ sudo apt-get update && apt-get -s upgrade
这样可以杜绝很多最新的服务器脚本漏洞 - 能不用远程就不用远程。如果实在要用请加强密码设置。坚决不是用
root
远程。并且改掉22端口: 修改/etc/ssh/sshd_config
取消#Port 22
的注释改成其他号码。一定要记得重启sshd服务。 - 隐藏Nginx的版本号码。大牛可以根据这个查找对应版本漏洞攻击你的网站。 修改
/etc/nginx/nginx.conf
文件,设置server_tokens off;
- 强制使用HTTPS协议。
- 数据库也不要开启远程,要强制设置
bind-address = 127.0.0.1
在文件/etc/mysql/my.cnf
里面 - PHP的安全要记得设置
disable_functions
禁止不安全函数,控制最大文件上传Size,然后记得修改max_execution_time
,max_input_time
,memory_limit
, 记得修改cgi.fix_pathinfo=0
总算嘚啵完了,大家辛苦了?
*本文的一些图片来自网络,如有任何侵权告之必删