首页 文章 精选 留言 我的

精选列表

搜索[centos7],共1058篇文章
优秀的个人博客,低调大师

Nginx系列问题之Centos7 安装配置

一、下载安装Nginx 1. 创建文件夹 cd /root/ mkdir downloads #在root目录下创建downloads 文件夹 2.打开官网 浏览器打开:https://nginx.org/en/download.html下载最新的稳定版本.Nginx下载地址 选中红框单击右键,选择复制链接地址。 3.下载编译安装Nginx 下载&解压-在终端输入: wget https://nginx.org/download/nginx-1.17.1.tar.gz #下载文件 tar -zxvf nginx-1.17.1.tar.gz #解压文件 ls #得到nginx-1.17.1文件夹 编译安装 cd nginx-1.17.1 ./configure --prefix=/usr/local/nginx #安装到/usr/local/nginx目录 # 报错 ./configure: error: the HTTP rewrite module requires the PCRE library # 解决-安装pcre-devel yum install pcre-devel -y # 报错 ./configure: error: the HTTP gzip module requires the zlib library # 解决-安装zlib-devel yum install zlib-devel -y # 重新执行 ./configure --prefix=/usr/local/nginx make && make install # 编译安装完成 启动Nginx cd /usr/local/nginx/sbin/ ./ nginx # 启动Nginx 在浏览器输入http://你的-ip。 若出现welcome to Nginx字样。说明安装成功。 二、常见配置 一、无法访问 如果是在阿里云,京东云等国内云主机购买的机器,请放行相应的安全组端口。 国内云主机如果没有备案,则无法访问80端口。需要修改Nginx的配置文件。修改端口之后,需要在安全组放行。 vim /usr/local/nginx/conf/nginx.conf # Nginx配置文件 server { listen xxxxx; # 修改端口号 server_name localhost; cd /usr/local/nginx/sbin/ ./ nginx -s reload # 重载使生效 修改防火墙的设置 firewall-cmd --zone=public --add-port=xxxxx/tcp --permanent # --permanent永久生效,没有此参数重启后失效 firewall-cmd --reload # 重载配置 firewall-cmd --list-ports # 查看放行端口 二、使用systemctl 管理Nginx 终端输入: vim /usr/lib/systemd/system/nginx.service # 编辑内容 [Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx # 跟实际路径相关 ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.targeta 按ESC--:--wq保存退出。 systemctl 常用命令 systemctl start nginx.service # 启动一个服务 systemctl stop nginx.service # 关闭一个服务 systemctl restart nginx.service # 重启一个服务 systemctl status nginx.service # 显示服务状态 systemctl enable nginx.service # 开机自启用 systemctl disable nginx.service # 禁用开机启动 systemctl is-enabled nginx.service # 查看服务是否开机启动 三、创建软链接 终端输入: ln -s /usr/local/nginx/sbin/nginx /usr/bin/python # 在 /usr/bin/目录下创建 nginx软链接(快捷方式) # ln -s /这里写命令实际所在目录 /要在哪个目录创建软链接(快捷方式) Nginx常用命令 nginx -t # 验证nginx配置文件 nginx -s reload # 使配置生效 nginx -v # 版本信息 nginx -V # 详细版本信息,包括编译参数 nginx -c filename # 指定配置文件 四、域名重定向 我想将域名www.aaa.com跳转到www.bbb.com终端输入 cd /usr/local/nginx/conf/ vim nginx.conf # Nginx默认配置文件 server { listen xxxxx; # 填端口号 server_name www.aaa.com; rewrite ^/(.*)$ http://www.bbb.com:xxx/$1 permanent; # rewrite 用来域名跳转,后面规则是正则表达式。端口号跟在域名后面 #charset koi8-r; #access_log logs/host.access.log main; # 保存退出。 nginx -t # 检测配置文件是否正确 nginx -s reload # 重载配置使生效 需要将www.aaa.com这个域名解析到nginx服务器所在ip。在域名服务商里面操作。 五、Nginx配置一个ip绑定多个域名 我想让这台Nginx服务器绑定两个域名,用端口号来区分。终端输入 cd /usr/local/nginx/conf/ vim nginx.conf server { listen 10001; server_name www.aaa.com; location / { root html; index index.html index.htm; } } # 配置第二个域名 server { listen 10001; server_name www.bbb.com; location / { index index.htm index.html index.php; #默认文件 root /var/www/; #网站根目录 } #include location.conf; #调用其他规则,也可去除 } # 注意大括号的完整性 # 保存退出 nginx -t # 检测配置文件是否正确 nginx -s reload # 重载配置使生效 将www.bbb.com解析到Nginx服务器的ip。在浏览器输入www.aaa.com:10000和www.bbb.com:10001进行测试。 有错误的地方请帮忙指出,菜鸟一枚努力学习中

优秀的个人博客,低调大师

CentOS7系统手动部署LNMP 环境操作演示

本文档介绍如何手动在ECS实例上搭建LNMP环境(CentOS 7),其中LNMP分别代表Linux、Nginx、MySQL和PHP。 项目配置 本篇教程在示例步骤中使用了以下版本的软件。操作时,请您以实际软件版本为准。 操作系统:CentOS 7.2 64位 Nginx版本:Nginx 1.10.2 MySQL版本:MySQL 5.6.24 PHP版本:PHP 5.6.38 适用对象 适用于熟悉Linux操作系统,刚开始使用阿里云进行建站的个人用户。 基本流程 使用云服务器ECS搭建LNMP平台的操作步骤如下: 准备编译环境。 安装Nginx。 安装MySQL。 安装PHP-FPM。 测试访问。 步骤一:准备编译环境。 本文主要说明手动安装LNMP平台的操作步骤,您也可以在云市场购买LNMP镜像直接启动ECS,以便快速建站。 使用向导创建实例。 说明本篇教程创建的ECS实例选用了CentOS 7.2 64位的操作系统,专有网络和公网IP。 使用管理终端连接ECS实例。 输入命令cat /etc/redhat-release查看系统版本。 关闭防火墙。 输入systemctl status firewalld命令查看当前防火墙的状态。 如果防火墙的状态参数是active,则防火墙为开启状态。如果防火墙的状态参数是inactive,则防火墙为关闭状态。如上图所示,此处防火墙为开启状态,需要运行如下命令关闭防火墙: 如果您想临时关闭防火墙,输入命令systemctl stop firewalld。 说明这只是暂时关闭防火墙,下次重启Linux后,防火墙还会开启。 如果您想永久关闭防火墙,输入命令systemctl disable firewalld。 说明您可参考firewalld官网信息来决定何时开启防火墙。 关闭SELinux。 如果您想临时关闭SELinux,输入命令setenforce 0。 说明这只是暂时关闭SELinux,下次重启Linux后,SELinux还会开启。 如果您想永久关闭SELinux,输入命令vi /etc/selinux/config编辑SELinux配置文件。回车后,把光标移动到SELINUX=enforcing这一行,按下i键进入编辑模式,修改为SELINUX=disabled, 按下Esc键,然后输入:wq并回车以保存并关闭SELinux配置文件。 说明您可参考redhat关于SELinux的官方文档来决定何时开启SELinux。 输入getenforce命令查看当前SELinux的状态。 如果SELinux状态参数是Enforcing,则SELinux为开启状态。如果SELinux状态参数是Disabled, 则SELinux为关闭状态。如上图所示,此处SELinux为开启状态,需要运行如下命令关闭SELinux: 重启系统使设置生效。 参考添加安全组规则,放行所需端口入方向规则。 步骤二:安装Nginx。 安装依赖包。 yumgroupinstall"Developmenttools"-yyuminstallzlib-develpcre-developenssl-devel-yyuminstallepel-release-yyuminstallperlperl-develperl-ExtUtils-Embedlibxsltlibxslt-devellibxml2libxml2-develgdgd-develGeoIPGeoIP-devel-y 下载源码包解压编译。 wgethttp://nginx.org/download/nginx-1.10.2.tar.gz tarxvfnginx-1.10.2.tar.gz-C/usr/local/src cd/usr/local/src/nginx-1.10.2 ./configure--prefix=/etc/nginx\ --sbin-path=/usr/sbin/nginx\--conf-path=/etc/nginx/nginx.conf\--error-log-path=/var/log/nginx/error.log\--http-log-path=/var/log/nginx/access.log\--pid-path=/var/run/nginx.pid\--lock-path=/var/run/nginx.lock\--http-client-body-temp-path=/var/tmp/nginx/client\--http-proxy-temp-path=/var/tmp/nginx/proxy\--http-fastcgi-temp-path=/var/tmp/nginx/fcgi\--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi\--http-scgi-temp-path=/var/tmp/nginx/scgi\--user=nginx--group=nginx\--with-pcre--with-http_v2_module\--with-http_ssl_module\--with-http_realip_module\--with-http_addition_module\--with-http_sub_module\--with-http_dav_module\--with-http_flv_module\--with-http_mp4_module\--with-http_gunzip_module\--with-http_gzip_static_module\--with-http_random_index_module\--with-http_secure_link_module\--with-http_stub_status_module\--with-http_auth_request_module\--with-mail--with-mail_ssl_module\--with-file-aio\--with-ipv6\--with-http_v2_module\--with-threads\--with-stream\--with-stream_ssl_modulemake&&makeinstall mkdir-p/var/tmp/nginx/client 输入命令nginx -v可查看Nginx的版本号。 添加运行Nginx服务进程的用户。 useraddnginx chown-Rnginx:nginx/etc/nginx/ 添加nginx.service启动配置文件。 输入命令vi /usr/lib/systemd/system/nginx.service打开Nginx的启动配置文件,按下i键,然后在配置文件中写下如下内容: [Unit]Description=nginx-highperformancewebserverDocumentation=https://nginx.org/en/docs/After=network-online.targetremote-fs.targetnss-lookup.targetWants=network-online.target [Service]Type=forkingPIDFile=/var/run/nginx.pidExecStartPre=/usr/sbin/nginx-t-c/etc/nginx/nginx.confExecStart=/usr/sbin/nginx-c/etc/nginx/nginx.confExecReload=/bin/kill-sHUP$MAINPIDExecStop=/bin/kill-sTERM$MAINPID[Install] WantedBy=multi-user.target 按下Esc键,然后输入:wq并回车以保存并关闭Nginx启动配置文件。 启动Nginx服务并设置开机自动启动。 systemctlstartnginx systemctlenablenginx 登录ECS管理控制台,单击左侧导航栏中的实例,在实例列表中找到正在部署环境的实例,从这个实例的IP地址项中复制它的公网IP,用浏览器访问这个IP地址可看到默认欢迎页面。 步骤三:安装MySQL。 准备编译环境。 yuminstallncurses-develbisongnutls-devel–y yuminstallcmake-y 准备MySQL数据存放目录。 mkdir/mnt/datagroupadd-rmysqluseradd-r-gmysql-s/sbin/nologinmysqlidmysql 更改数据目录属主和属组。 chown-Rmysql:mysql/mnt/data 下载稳定版源码包解压编译。 wgethttps://downloads.mysql.com/archives/get/file/mysql-5.6.24.tar.gztarxvfmysql-5.6.24.tar.gz-C/usr/local/srccd/usr/local/src/mysql-5.6.24cmake.-DCMAKE_INSTALL_PREFIX=/usr/local/mysql\ >-DMYSQL_DATADIR=/mnt/data\ >-DSYSCONFDIR=/etc\ >-DWITH_INNOBASE_STORAGE_ENGINE=1\ >-DWITH_ARCHIVE_STORAGE_ENGINE=1\ >-DWITH_BLACKHOLE_STORAGE_ENGINE=1\ >-DWITH_READLINE=1\ >-DWITH_SSL=system\ >-DWITH_ZLIB=system\ >-DWITH_LIBWRAP=0\ >-DMYSQL_TCP_PORT=3306\ >-DDEFAULT_CHARSET=utf8\ >-DDEFAULT_COLLATION=utf8_general_ci\ >-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock\ >-DWITH_SYSTEMD=1\ >-DINSTALL_SYSTEMD_UNITDIR=/usr/lib/systemd/system\ make&&makeinstall 修改安装目录的属组为mysql。 chown-Rmysql:mysql/usr/local/mysql/ 初始化数据库并复制配置文件。 cd/usr/local/mysql/usr/local/mysql/scripts/mysql_install_db--user=mysql--datadir=/mnt/data/mv/etc/my.cnf/etc/my.cnf.bak cp/usr/local/mysql/support-files/my-default.cnf/etc/my.cnf 修改配置文件中的安装路径及数据目录存放路径。 echo-e"basedir=/usr/local/mysql\ndatadir=/mnt/data\n">>/etc/my.cnf 添加mysql.service启动配置文件。 输入命令vi /usr/lib/systemd/system/mysql.service打开MySQL的启动配置文件,按下i键,然后在配置文件中写下如下内容: [Unit]Description=MySQLCommunityServerAfter=network.targetAfter=syslog.target [Install]WantedBy=multi-user.targetAlias=mysql.service [Service]User=mysqlGroup=mysqlPermissionsStartOnly=trueExecStart=/usr/local/mysql/bin/mysqldTimeoutSec=600Restart=alwaysPrivateTmp=false 按下Esc键,然后输入:wq并回车以保存并关闭MySQL启动配置文件。 设置PATH环境变量。 echo"exportPATH=$PATH:/usr/local/mysql/bin">/etc/profile.d/mysql.shsource/etc/profile.d/mysql.sh 设置开机启动MySQL。 systemctlenablemysql 启动MySQL服务。 systemctlstartmysql mysql–h127.0.0.1 步骤四:安装PHP-FPM。 Nginx作为web服务器,当它接收到请求后,不支持对外部程序的直接调用或者解析,必须通过FastCGI进行调用。如果是PHP请求,则交给PHP解释器处理,并把结果返回给客户端。PHP-FPM是支持解析PHP的一个FastCGI进程管理器。提供了更好管理PHP进程的方式,可以有效控制内存和进程、可以平滑重载PHP配置。 安装依赖包。 yuminstalllibmcryptlibmcrypt-develmhashmhash-devellibxml2libxml2-develbzip2bzip2-devel 下载稳定版源码包解压编译。 wgethttp://cn2.php.net/get/php-5.6.38.tar.bz2/from/this/mirror cpmirrorphp-5.6.38.tar.bz2 tarxvfphp-5.6.38.tar.bz2-C/usr/local/src cd/usr/local/src/php-5.6.38 ./configure--prefix=/usr/local/php\ --with-config-file-scan-dir=/etc/php.d\--with-config-file-path=/etc\--with-mysql=/usr/local/mysql\--with-mysqli=/usr/local/mysql/bin/mysql_config\--enable-mbstring\--with-freetype-dir\--with-jpeg-dir\--with-png-dir\--with-zlib\--with-libxml-dir=/usr\--with-openssl\--enable-xml\--enable-sockets\--enable-fpm\--with-mcrypt\--with-bz2make&&makeinstall 添加PHP和PHP-FPM配置文件。 cp/usr/local/src/php-5.6.38/php.ini-production/etc/php.inicd/usr/local/php/etc/ cpphp-fpm.conf.defaultphp-fpm.confsed-i's@;pid=run/php-fpm.pid@pid=/usr/local/php/var/run/php-fpm.pid@'php-fpm.conf 添加php-fpm.service启动配置文件。 输入命令vi /usr/lib/systemd/system/php-fpm.service打开PHP-FPM的启动配置文件,按下i键,然后在配置文件中写下如下内容: [Unit]Description=ThePHPFastCGIProcessManagerAfter=network.target[Service]Type=simplePIDFile=/usr/local/php/var/run/php-fpm.pidExecStart=/usr/local/php/sbin/php-fpm--nodaemonize--fpm-config/usr/local/php/etc/php-fpm.confExecReload=/bin/kill-USR2$MAINPIDPrivateTmp=true[Install]WantedBy=multi-user.target 按下Esc键,然后输入:wq并回车以保存并关闭PHP-FPM启动配置文件。 启动PHP-FPM服务并设置开机自动启动。 systemctlstartphp-fpm systemctlenablephp-fpm 启动服务。 servicephp-fpmstart 添加Nginx对FastCGI的支持。 备份默认的Nginx配置文件。 cp/etc/nginx/nginx.conf/etc/nginx/nginx.confbakcpnginx.conf.defaultnginx.conf.default.bakcp/etc/nginx/nginx.conf.default/etc/nginx/nginx.conf 输入命令vi /etc/nginx/nginx.conf打开Nginx的配置文件,按下i键,在所支持的主页面格式中添加PHP格式的主页,类似如下: location/{ root/etc/nginx/html;indexindex.phpindex.htmlindex.htm; } 取消以下内容前面的注释: location~\.php${roothtml;fastcgi_pass127.0.0.1:9000;fastcgi_indexindex.php;fastcgi_paramSCRIPT_FILENAME/scripts$fastcgi_script_name;includefastcgi_params; } 将root html;改成root /etc/nginx/html;。 将fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;改成fastcgi_param SCRIPT_FILENAME /etc/nginx/html/$fastcgi_script_name;。 按下Esc键,然后输入:wq并回车以保存并关闭Nginx配置文件。 输入命令systemctl restart nginx重新载入Nginx的配置文件。 输入命令vi /etc/nginx/html/index.php打开index.php文件,按下i键,然后在文件中写入如下内容: <?php$conn=mysql_connect('127.0.0.1','root','');if($conn){echo"LNMPplatformconnecttomysqlissuccessful!"; }else{echo"LNMPplatformconnecttomysqlisfailed!"; } phpinfo();?> 按下Esc键,然后输入:wq并回车以保存并关闭index.php文件。 步骤五:测试访问 登录ECS管理控制台,单击左侧导航栏中的实例,在实例列表中复制正在部署环境的实例的公网IP地址。用浏览器访问这个公网IP地址,如您看见如下图所示页面,则表示LNMP平台构建完成。

优秀的个人博客,低调大师

Linux(CentOS7)系统中部署Django web框架

1. 概述 github项目地址:https://github.com/superwujc 尊重原创,欢迎转载,注明出处:https://my.oschina.net/superwjc/blog/3003027 Django服务框架在逻辑上可以分为web层与数据库层:web前端通过实现了WSGI协议的模块对python代码进行解析,而python代码中则通过特定于数据库的操作接口对数据库进行读取与写入。 Django自身内置了轻量级的web服务器与sqlite数据库,可以用于简单的代码测试,并支持Apache httpd与Nginx作为web前端,以及PostgreSQL/MySQL/Oracle等数据库作为后端存储,用于实际的生产环境。 本文分别以MySQL + Apache httpd + mod_wsgi与MySQL + Nginx + uwsgi为例,通过源码安装的方式,简单描述Django服务框架在Linux系统生产环境下的部署过程。 2. 说明 1.示例中包含两台服务器,操作系统版本均为CentOS 7.6.1810,最小化全新安装,无其他项目运行。 django-web(192.168.9.129):web前端,安装的组件包括Python解析器,mysqlclient数据库操作接口,apache/nginx web服务器,WSGI协议处理模块。 django-db(192.168.9.130):后端存储,安装mysql。 2.示例中所使用的源码包均位于/usr/local/src,列表如下: Python-3.7.2.tgz Django-2.1.5.tar.gz mysql-boost-5.7.24.tar.gz mysqlclient-1.3.14.tar.gz httpd-2.4.37.tar.gz apr-1.6.5.tar.gz apr-util-1.6.1.tar.gz mod_wsgi-4.6.5.tar.gz tengine-2.2.3.tar.gz uwsgi-2.0.17.1.tar.gz 3.示例中对源码包进行安装时,均使用默认的目标安装路径。在实际的生产环境中,为避免覆盖,安装前务必确认目标安装路径与文件是否存在,若存在则应查看当前已安装版本,并选择其他目录。 3. 步骤 3.1 - 后端存储(MySQL) [root@django-db ~]# ip addr show eth0 | sed -n '/inet /p' | awk '{print $2}' 192.168.9.130/24 [root@django-db ~]# 安装依赖包: [root@django-db ~]# yum -y install gcc gcc-c++ make cmake ncurses-devel openssl-devel 下载集成boost库的mysql源码包: [root@django-db ~]# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.24.tar.gz -P /usr/local/src/ 解压源码包并进入源码目录,配置编译选项: 源码安装mysql的默认目标路径为/usr/local/mysql,可以通过cmake的-DCMAKE_INSTALL_PREFIX选项显式指定。 [root@django-db ~]# cd /usr/local/src/ [root@django-db src]# [root@django-db src]# ll total 47960 -rw-r--r-- 1 root root 49110448 Oct 4 04:02 mysql-boost-5.7.24.tar.gz [root@django-db src]# [root@django-db src]# tar axf mysql-boost-5.7.24.tar.gz [root@django-db src]# [root@django-db src]# ll total 47964 drwxr-xr-x 36 7161 31415 4096 Oct 4 06:02 mysql-5.7.24 -rw-r--r-- 1 root root 49110448 Oct 4 04:02 mysql-boost-5.7.24.tar.gz [root@django-db src]# [root@django-db src]# cd mysql-5.7.24/ [root@django-db mysql-5.7.24]# [root@django-db mysql-5.7.24]# ll /usr/local/mysql ls: cannot access /usr/local/mysql: No such file or directory [root@django-db mysql-5.7.24]# [root@django-db mysql-5.7.24]# [root@django-db mysql-5.7.24]# cmake . \ > -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ > -DWITH_BOOST=boost \ > -DWITH_INNOBASE_STORAGE_ENGINE=1 \ > -DWITH_PARTITION_STORAGE_ENGINE=1 \ > -DWITH_FEDERATED_STORAGE_ENGINE=1 \ > -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ > -DWITH_MYISAM_STORAGE_ENGINE=1 \ > -DENABLED_LOCAL_INFILE=1 \ > -DENABLE_DTRACE=0 \ > -DDEFAULT_CHARSET=utf8mb4 \ > -DDEFAULT_COLLATION=utf8mb4_general_ci \ > -DWITH_SSL=yes \ > -DWITH_EMBEDDED_SERVER=1 编译并安装: 可选择为make命令指定-j选项,执行多任务并行编译;该步骤耗时较长,建议在screen/tmux等终端中运行,或以nohup的方式后台运行,避免因终端关闭而导致运行终止。 [root@django-db mysql-5.7.24]# awk '/^processor/{print $3}' /proc/cpuinfo | wc -l 2 [root@django-db mysql-5.7.24]# make -j2 && make install 创建mysql用户和组: [root@django-db mysql-5.7.24]# id mysql id: mysql: no such user [root@django-db mysql-5.7.24]# [root@django-db mysql-5.7.24]# useradd mysql -s /sbin/nologin [root@django-db mysql-5.7.24]# [root@django-db mysql-5.7.24]# id mysql uid=1000(mysql) gid=1000(mysql) groups=1000(mysql) [root@django-db mysql-5.7.24]# [root@django-db mysql-5.7.24]# 创建mysql数据目录与日志目录(本例中分别为/usr/local/mysql/data与/usr/local/mysql/logs/): [root@django-db mysql-5.7.24]# ll /usr/local/mysql/ total 64 drwxr-xr-x 2 root root 4096 Jan 16 15:26 bin -rw-r--r-- 1 root root 17987 Oct 4 05:48 COPYING -rw-r--r-- 1 root root 17987 Oct 4 05:48 COPYING-test drwxr-xr-x 2 root root 55 Jan 16 15:25 docs drwxr-xr-x 3 root root 4096 Jan 16 15:25 include drwxr-xr-x 4 root root 192 Jan 16 15:26 lib drwxr-xr-x 4 root root 30 Jan 16 15:26 man drwxr-xr-x 10 root root 4096 Jan 16 15:26 mysql-test -rw-r--r-- 1 root root 2478 Oct 4 05:48 README -rw-r--r-- 1 root root 2478 Oct 4 05:48 README-test drwxr-xr-x 28 root root 4096 Jan 16 15:26 share drwxr-xr-x 2 root root 90 Jan 16 15:26 support-files [root@django-db mysql-5.7.24]# [root@django-db mysql-5.7.24]# mkdir -p /usr/local/mysql/{data,logs} 创建mysql运行时pid文件,错误日志文件,慢查询日志文件(本例中分别为/usr/local/mysql/logs/mysqld.pid,/usr/local/mysql/logs/mysqld-err.log与/usr/local/mysql/logs/mysqld-slw.log): [root@django-db mysql-5.7.24]# touch /usr/local/mysql/logs/{mysqld.pid,mysqld-err.log,mysqld-slw.log} [root@django-db mysql-5.7.24]# 将mysql安装的目标路径(本例中为/usr/local/mysql/)所有者设置为mysql用户和组: [root@django-db mysql-5.7.24]# chown -R mysql:mysql /usr/local/mysql/ [root@django-db mysql-5.7.24]# 将mysql可执行文件的路径(本例为/usr/local/mysql/bin)添加至系统的查找路径列表PATH中: [root@django-db mysql-5.7.24]# which mysqld /usr/bin/which: no mysqld in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) [root@django-db mysql-5.7.24]# [root@django-db mysql-5.7.24]# [root@django-db mysql-5.7.24]# sed -i '/^PATH/ s|$|:/usr/local/mysql/bin|' ~/.bash_profile [root@django-db mysql-5.7.24]# source ~/.bash_profile [root@django-db mysql-5.7.24]# [root@django-db mysql-5.7.24]# [root@django-db mysql-5.7.24]# which mysqld /usr/local/mysql/bin/mysqld [root@django-db mysql-5.7.24]# mysqld --version mysqld Ver 5.7.24 for Linux on x86_64 (Source distribution) 初始化数据库: [root@django-db mysql-5.7.24]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data 2019-01-16T15:51:56.003707Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2019-01-16T15:51:56.308083Z 0 [Warning] InnoDB: New log files created, LSN=45790 2019-01-16T15:51:56.355390Z 0 [Warning] InnoDB: Creating foreign key constraint system tables. 2019-01-16T15:51:56.414615Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: a6bc7921-19a6-11e9-a9ff-000c29000409. 2019-01-16T15:51:56.415817Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened. 2019-01-16T15:51:56.725302Z 0 [Warning] CA certificate ca.pem is self signed. 2019-01-16T15:51:56.897014Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. [root@django-db mysql-5.7.24]# 编辑mysql配置文件: MySQL服务器的运行参数需要根据实际的应用场景与服务器的硬件配置而进行调整。 [root@django-db mysql-5.7.24]# cd [root@django-db ~]# [root@django-db ~]# ll /etc/my.cnf -rw-r--r--. 1 root root 570 Aug 16 14:00 /etc/my.cnf [root@django-db ~]# [root@django-db ~]# cp -a /etc/my.cnf{,.ori} [root@django-db ~]# [root@django-db ~]# vi /etc/my.cnf [mysqld] user = mysql port = 3306 server-id = 1 character-set-server = utf8mb4 socket = /tmp/mysql.sock basedir = /usr/local/mysql datadir = /usr/local/mysql/data pid-file = /usr/local/mysql/logs/mysqld.pid log_error = /usr/local/mysql/logs/mysqld-err.log slow_query_log_file = /usr/local/mysql/logs/mysqld-slw.log skip-name-resolve = 1 back_log = 300 max_connections = 1000 max_connect_errors = 6000 open_files_limit = 65535 table_open_cache = 128 max_allowed_packet = 4M binlog_cache_size = 1M max_heap_table_size = 8M tmp_table_size = 16M read_buffer_size = 2M read_rnd_buffer_size = 8M sort_buffer_size = 8M join_buffer_size = 8M key_buffer_size = 4M thread_cache_size = 8 query_cache_type = 1 query_cache_size = 8M query_cache_limit = 2M ft_min_word_len = 4 log_bin = mysql-bin binlog_format = mixed expire_logs_days = 30 slow_query_log = 1 long_query_time = 1 performance_schema = 0 explicit_defaults_for_timestamp #lower_case_table_names = 1 skip-external-locking default_storage_engine = InnoDB innodb_file_per_table = 1 innodb_open_files = 500 innodb_buffer_pool_size = 64M innodb_write_io_threads = 4 innodb_read_io_threads = 4 innodb_thread_concurrency = 0 innodb_purge_threads = 1 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 2M innodb_log_file_size = 32M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 bulk_insert_buffer_size = 8M myisam_sort_buffer_size = 8M myisam_max_sort_file_size = 10G myisam_repair_threads = 1 interactive_timeout = 28800 wait_timeout = 28800 [mysqldump] quick max_allowed_packet = 16M [myisamchk] key_buffer_size = 8M sort_buffer_size = 8M read_buffer = 4M write_buffer = 4M 将mysql的共享库文件所在目录(本例中为/usr/local/mysql/lib)添加到系统共享库查找路径列表的配置文件中: [root@django-db ~]# echo "/usr/local/mysql/lib" >> /etc/ld.so.conf.d/mysql-v5.7.24.conf [root@django-db ~]# [root@django-db ~]# cat /etc/ld.so.conf.d/mysql-v5.7.24.conf /usr/local/mysql/lib [root@django-db ~]# [root@django-db ~]# ldconfig [root@django-db ~]# 添加mysql服务,并设置为随系统启动: [root@django-db ~]# cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld [root@django-db ~]# chmod 755 /etc/init.d/mysqld [root@django-db ~]# chkconfig --level 35 mysqld on [root@django-db ~]# 启动mysql服务: [root@django-db ~]# /etc/init.d/mysqld start Starting MySQL.. SUCCESS! [root@django-db ~]# 设置mysql的root用户密码,并添加相应的授权(初始密码为空,本例中将root密码设置为django): [root@django-db ~]# mysql -uroot -e "use mysql; set password for 'root'@'localhost' = password('django');" [root@django-db ~]# [root@django-db ~]# mysql -uroot -pdjango -e "grant all privileges on *.* to root@'192.168.9.%' identified by 'django' with grant option;" mysql: [Warning] Using a password on the command line interface can be insecure. [root@django-db ~]# MySQL服务器安装与配置完成。 3.2 - Django环境 [root@django-web ~]# ip addr show eth0 | sed -n '/inet /p' | awk '{print $2}' 192.168.9.129/24 [root@django-web ~]# 3.2.1 - Python3 安装依赖包: [root@django-web ~]# yum -y install gcc make libffi-devel readline-devel zlib-devel openssl-devel 下载python3源码包: [root@django-web ~]# wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz -P /usr/local/src/ 解压源码包并进入源码目录,执行安装: 源码安装python3的默认目标路径为/usr/local,可以通过configure命令的--prefix选项显式指定。该步骤耗时较长,建议在screen/tmux等终端中运行,或以nohup的方式后台运行,避免因终端关闭而导致运行终止。 [root@django-web ~]# cd /usr/local/src/ [root@django-web src]# [root@django-web src]# ll total 22364 -rw-r--r-- 1 root root 22897802 Dec 24 03:42 Python-3.7.2.tgz [root@django-web src]# [root@django-web src]# tar axf Python-3.7.2.tgz [root@django-web src]# [root@django-web src]# cd Python-3.7.2/ [root@django-web Python-3.7.2]# [root@django-web Python-3.7.2]# ./configure --enable-shared --enable-optimizations ... [root@django-web Python-3.7.2]# awk '/^processor/{print $3}' /proc/cpuinfo | wc -l 2 [root@django-web Python-3.7.2]# make -j2 && make install 将python3的共享库文件所在目录(本例中为/usr/local/lib)添加到系统共享库查找路径列表的配置文件中: [root@django-web Python-3.7.2]# which python3 /usr/local/bin/python3 [root@django-web Python-3.7.2]# [root@django-web Python-3.7.2]# python3 -V python3: error while loading shared libraries: libpython3.7m.so.1.0: cannot open shared object file: No such file or directory [root@django-web Python-3.7.2]# [root@django-web Python-3.7.2]# ll /usr/local/lib total 12072 lrwxrwxrwx 1 root root 20 Jan 16 17:05 libpython3.7m.so -> libpython3.7m.so.1.0 -r-xr-xr-x 1 root root 12337216 Jan 16 17:05 libpython3.7m.so.1.0 -r-xr-xr-x 1 root root 7656 Jan 16 17:05 libpython3.so drwxr-xr-x 2 root root 67 Jan 16 17:06 pkgconfig drwxr-xr-x 35 root root 8192 Jan 16 17:06 python3.7 [root@django-web Python-3.7.2]# [root@django-web Python-3.7.2]# [root@django-web Python-3.7.2]# echo '/usr/local/lib' >> /etc/ld.so.conf.d/python-v3.7.2.conf [root@django-web Python-3.7.2]# ldconfig [root@django-web Python-3.7.2]# [root@django-web Python-3.7.2]# [root@django-web Python-3.7.2]# python3 -V Python 3.7.2 [root@django-web Python-3.7.2]# Python3解析器安装完成。 3.2.2 - MySQL数据库操作接口(mysqlclient) 安装依赖包mysql-devel: mysqlclient依赖于mysql服务端开发库,若本机中先前已安装mysql服务器,则无需此步骤。 [root@django-web ~]# yum -y install mysql-devel 下载mysqlclient源码包: [root@django-web ~]# wget https://files.pythonhosted.org/packages/f7/a2/1230ebbb4b91f42ad6b646e59eb8855559817ad5505d81c1ca2b5a216040/mysqlclient-1.3.14.tar.gz -P /usr/local/src/ 解压源码包并进入源码目录,执行安装: [root@django-web ~]# cd /usr/local/src/ [root@django-web src]# [root@django-web src]# ll total 22460 -rw-r--r-- 1 root root 91391 Dec 4 10:06 mysqlclient-1.3.14.tar.gz drwxr-xr-x 19 501 501 4096 Jan 16 17:05 Python-3.7.2 -rw-r--r-- 1 root root 22897802 Dec 24 03:42 Python-3.7.2.tgz [root@django-web src]# [root@django-web src]# tar axf mysqlclient-1.3.14.tar.gz [root@django-web src]# cd mysqlclient-1.3.14/ [root@django-web mysqlclient-1.3.14]# python3 setup.py install 查看版本: [root@django-web mysqlclient-1.3.14]# python3 -c "import MySQLdb; print(MySQLdb.version_info)" (1, 3, 14, 'final', 0) [root@django-web mysqlclient-1.3.14]# mysqlclient安装完成。 3.2.3 - django 下载源码包: [root@django-web ~]# wget wget https://www.djangoproject.com/m/releases/2.1/Django-2.1.5.tar.gz -P /usr/local/src/ 解压源码包并进入源码目录,执行安装: [root@django-web ~]# cd /usr/local/src/ [root@django-web src]# [root@django-web src]# ll total 30876 -rw-r--r-- 1 root root 8612384 Jan 4 13:47 Django-2.1.5.tar.gz drwxrwxr-x 9 1000 1000 4096 Jan 16 17:16 mysqlclient-1.3.14 -rw-r--r-- 1 root root 91391 Dec 4 10:06 mysqlclient-1.3.14.tar.gz drwxr-xr-x 19 501 501 4096 Jan 16 17:05 Python-3.7.2 -rw-r--r-- 1 root root 22897802 Dec 24 03:42 Python-3.7.2.tgz [root@django-web src]# [root@django-web src]# tar axf Django-2.1.5.tar.gz [root@django-web src]# cd Django-2.1.5/ [root@django-web Django-2.1.5]# python3 setup.py install 查看版本: [root@django-web Django-2.1.5]# python3 -m django --version 2.1.5 [root@django-web Django-2.1.5]# 安装成功后,将生成用于django项目管理的命令行工具django-admin: [root@django-web Django-2.1.5]# which django-admin /usr/local/bin/django-admin [root@django-web Django-2.1.5]# 运行django-admin startproject命令,在指定目录中(本例中为/opt/webs/t_django)创建django项目: django-admin startproject命令的格式为:django-admin startproject 项目名 [目标目录] 项目名是必选参数,目标目录是可选参数,若忽略,则在当前目录下创建一个与项目名同名的目录。 [root@django-web Django-2.1.5]# cd [root@django-web ~]# [root@django-web ~]# mkdir -p /opt/webs/t_django [root@django-web ~]# django-admin startproject t_app /opt/webs/t_django [root@django-web ~]# [root@django-web ~]# tree /opt/webs/t_django/ /opt/webs/t_django/ ├── manage.py └── t_app ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py 1 directory, 5 files [root@django-web ~]# 以上显示的目录层级结构中,/opt/webs/下的t_djang为项目顶级目录,该目录下包含一个用于管理当前项目的manage.py程序,与一个python包(目录);该项目包内的settings.py用于配置当前项目的各项参数,urls.py用于定义当前项目的url路径,wsgi.py为web访问的入口。 为当前django项目创建单独的数据库以及相应的用户(本例中,数据库名称为t_django_db,用户名为u_django,密码为p_django): 步骤3.1中已添加root用户在192.168.9.%网段的登录权限。 在非mysql服务器所在主机上,运行mysql命令行客户端需要安装mysql软件包:yum -y install mysql [root@django-web ~]# mysql -h192.168.9.130 -P3306 -uroot -pdjango -e "create database t_django_db; grant all privileges on t_django_db.* to u_django@'192.168.9.129' identified by 'p_django';" 编辑项目配置文件settings.py,进行以下修改: 将ALLOWED_HOSTS = []修改为ALLOWED_HOSTS = ['*'],添加允许访问的主机: [root@django-web ~]# cd /opt/webs/t_django/ [root@django-web t_django]# ll total 4 -rwxr-xr-x 1 root root 537 Jan 16 17:33 manage.py drwxr-xr-x 2 root root 74 Jan 16 17:33 t_app [root@django-web t_django]# [root@django-web t_django]# [root@django-web t_django]# [root@django-web t_django]# cp -a t_app/settings.py{,.ori} [root@django-web t_django]# [root@django-web t_django]# sed -n '/^ALLOWED_HOSTS/p' t_app/settings.py ALLOWED_HOSTS = [] [root@django-web t_django]# sed -i '/^ALLOWED_HOSTS/ s|\[\]|\['\''*'\''\]|' t_app/settings.py [root@django-web t_django]# [root@django-web t_django]# sed -n '/^ALLOWED_HOSTS/p' t_app/settings.py ALLOWED_HOSTS = ['*'] [root@django-web t_django]# 设置数据库信息,将数据库引擎由sqlite3修改为mysql,并设置数据库IP与端口,数据库名称,用户名与密码,以及时区信息(注意缩进格式保持一致): [root@django-web t_django]# sed -i '/ENGINE/ s/sqlite3/mysql/' t_app/settings.py [root@django-web t_django]# sed -i '/ENGINE/{n;d}' t_app/settings.py [root@django-web t_django]# sed -i -e '/ENGINE/ a\ '\''HOST'\'': '\''192.168.9.130'\'',\n '\''PORT'\'': '\''3306'\'',\n '\''NAME'\'': '\''t_django_db'\'',\n '\''USER'\'': '\''u_django'\'',\n '\''PASSWORD'\'': '\''p_django'\'',\n '\''TIME_ZONE'\'': '\''Asia/Shanghai'\'',\n '\''USE_TZ'\'': False' t_app/settings.py 修改前: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } 修改后: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '192.168.9.130', 'PORT': '3306', 'NAME': 't_django_db', 'USER': 'u_django', 'PASSWORD': 'p_django', 'TIME_ZONE': 'Asia/Shanghai', 'USE_TZ': False } } settings.py末尾添加一行STATIC_ROOT = os.path.join(BASE_DIR, 'static'),指定静态文件的根目录: [root@django-web t_django]# sed -i '$a\STATIC_ROOT = os.path.join(BASE_DIR, '\''static'\'')' t_app/settings.py [root@django-web t_django]# [root@django-web t_django]# sed -n '$p' t_app/settings.py STATIC_ROOT = os.path.join(BASE_DIR, 'static') 运行python3 manage.py collectstatic命令,收集静态文件: 该命令在当前django项目的顶级目录/opt/webs/t_django下创建静态文件目录/static/ [root@django-web t_django]# pwd /opt/webs/t_django [root@django-web t_django]# ll total 4 -rwxr-xr-x 1 root root 537 Jan 16 17:33 manage.py drwxr-xr-x 2 root root 97 Jan 16 17:57 t_app [root@django-web t_django]# [root@django-web t_django]# python3 manage.py collectstatic 119 static files copied to '/opt/webs/t_django/static'. [root@django-web t_django]# [root@django-web t_django]# ll total 4 -rwxr-xr-x 1 root root 537 Jan 16 17:33 manage.py drwxr-xr-x 3 root root 19 Jan 16 17:59 static drwxr-xr-x 3 root root 116 Jan 16 17:59 t_app [root@django-web t_django]# [root@django-web t_django]# du -sh static/ 1.7M static/ [root@django-web t_django]# 连接数据库并创建相应的表: [root@django-web t_django]# mysql -h192.168.9.130 -P3306 -uu_django -pp_django -Dt_django_db -e "show tables;" [root@django-web t_django]# [root@django-web t_django]# python3 manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying sessions.0001_initial... OK [root@django-web t_django]# mysql -h192.168.9.130 -P3306 -uu_django -pp_django -Dt_django_db -e "show tables;" +----------------------------+ | Tables_in_t_django_db | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | +----------------------------+ [root@django-web t_django]# [root@django-web t_django]# ss -atn | grep :3306 ESTAB 0 0 192.168.9.129:44518 192.168.9.130:3306 [root@django-web t_django]# 运行python3 manage.py runserver 0:8000命令,以tcp的8000端口启动django内置的web服务器: 内置的web服务器初始化需要几秒钟。 [root@django-web t_django]# python3 manage.py runserver 0:8000 & [1] 30910 [root@django-web t_django]# Performing system checks... System check identified no issues (0 silenced). January 16, 2019 - 18:06:19 Django version 2.1.5, using settings 't_app.settings' Starting development server at http://0:8000/ Quit the server with CONTROL-C. [root@django-web t_django]# ss -atn | grep :8000 [root@django-web t_django]# ss -atn | grep :8000 [root@django-web t_django]# ss -atn | grep :8000 [root@django-web t_django]# ss -atn | grep :8000 [root@django-web t_django]# ss -atn | grep :8000 [root@django-web t_django]# ss -atn | grep :8000 [root@django-web t_django]# ss -atn | grep :8000 [root@django-web t_django]# ss -atn | grep :8000 [root@django-web t_django]# ss -atn | grep :8000 [root@django-web t_django]# ss -atn | grep :8000 [root@django-web t_django]# ss -atn | grep :8000 [root@django-web t_django]# ss -atn | grep :8000 [root@django-web t_django]# ss -atn | grep :8000 [root@django-web t_django]# ss -atn | grep :8000 LISTEN 0 10 *:8000 *:* 待8000端口处于LISTEN状态后,浏览器分别访问http://192.168.9.129:8000/与http://192.168.9.129:8000/admin,若显示以下页面,则说明设置成功: 终端输出的访问日志: [16/Jan/2019 18:08:26] "GET / HTTP/1.1" 200 16348 [16/Jan/2019 18:08:26] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423 Not Found: /favicon.ico [16/Jan/2019 18:08:26] "GET /favicon.ico HTTP/1.1" 404 1975 [16/Jan/2019 18:08:26] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 80304 [16/Jan/2019 18:08:26] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 82564 [16/Jan/2019 18:08:26] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 81348 [16/Jan/2019 18:08:31] "GET /admin HTTP/1.1" 301 0 [16/Jan/2019 18:08:31] "GET /admin/ HTTP/1.1" 302 0 [16/Jan/2019 18:08:31] "GET /admin/login/?next=/admin/ HTTP/1.1" 200 1819 [16/Jan/2019 18:08:32] "GET /static/admin/css/responsive.css HTTP/1.1" 200 17976 [16/Jan/2019 18:08:32] "GET /static/admin/css/base.css HTTP/1.1" 200 16225 [16/Jan/2019 18:08:32] "GET /static/admin/css/login.css HTTP/1.1" 200 1203 Django环境的安装与初始配置完成。 3.3 - web前端(Apache) [root@django-web ~]# ip addr show eth0 | sed -n '/inet /p' | awk '{print $2}' 192.168.9.129/24 [root@django-web ~]# 3.3.1 - 安装与基本配置 安装依赖包: [root@django-web ~]# yum -y install expat-devel pcre-devel 下载apr,apr-util,httpd,mod_wsgi源码包: [root@django-web ~]# wget \ > http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.6.5.tar.gz \ > http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.1.tar.gz \ > http://mirrors.hust.edu.cn/apache//httpd/httpd-2.4.37.tar.gz \ > https://files.pythonhosted.org/packages/47/69/5139588686eb40053f8355eba1fe18a8bee94dc3efc4e36720c73e07471a/mod_wsgi-4.6.5.tar.gz \ > -P /usr/local/src/ 解压apr源码包并进入源码目录,执行安装: 源码安装apr的默认目标路径为/usr/local,可以通过configure命令的--prefix选项显式指定。 [root@django-web ~]# cd /usr/local/src/ [root@django-web src]# [root@django-web src]# ll total 41920 -rw-r--r-- 1 root root 1073556 Sep 14 04:07 apr-1.6.5.tar.gz -rw-r--r-- 1 root root 554301 Oct 22 2017 apr-util-1.6.1.tar.gz drwxr-xr-x 12 1000 1000 4096 Jan 16 17:31 Django-2.1.5 -rw-r--r-- 1 root root 8612384 Jan 4 13:47 Django-2.1.5.tar.gz -rw-r--r-- 1 root root 9177278 Oct 22 14:13 httpd-2.4.37.tar.gz -rw-r--r-- 1 root root 490018 Oct 22 04:03 mod_wsgi-4.6.5.tar.gz drwxrwxr-x 9 1000 1000 4096 Jan 16 17:16 mysqlclient-1.3.14 -rw-r--r-- 1 root root 91391 Dec 4 10:06 mysqlclient-1.3.14.tar.gz drwxr-xr-x 19 501 501 4096 Jan 16 17:05 Python-3.7.2 -rw-r--r-- 1 root root 22897802 Dec 24 03:42 Python-3.7.2.tgz [root@django-web src]# [root@django-web src]# [root@django-web src]# tar axf apr-1.6.5.tar.gz [root@django-web src]# cd apr-1.6.5/ [root@django-web apr-1.6.5]# ./configure && make && make install 解压apr-util源码包并进入源码目录,执行安装: 以configure命令的--with-apr选项指定已安装的apr所在的目录。 [root@django-web apr-1.6.5]# cd .. [root@django-web src]# tar axf apr-util-1.6.1.tar.gz [root@django-web src]# cd apr-util-1.6.1/ [root@django-web apr-util-1.6.1]# ./configure --with-apr=/usr/local/apr && make && make install 解压httpd源码包并进入源码目录,执行安装: 源码安装httpd的默认目标路径为/usr/local,可以通过configure命令的--prefix选项显式指定。 [root@django-web apr-util-1.6.1]# cd .. [root@django-web src]# tar axf httpd-2.4.37.tar.gz [root@django-web src]# cd httpd-2.4.37/ [root@django-web httpd-2.4.37]# ./configure \ > --with-apr=/usr/local/apr/ \ > --with-apr-util=/usr/local/apr/ \ > --enable-mpms-shared=all && make -j2 && make install 将apache可执行文件的路径(本例为/usr/local/apache2/bin)添加至系统的查找路径列表PATH中: [root@django-web httpd-2.4.37]# ls /usr/local/apache2/ bin build cgi-bin conf error htdocs icons include logs man manual modules [root@django-web httpd-2.4.37]# ls /usr/local/apache2/bin/ ab apxs dbmmanage envvars-std htcacheclean htdigest httpd logresolve apachectl checkgid envvars fcgistarter htdbm htpasswd httxt2dbm rotatelogs [root@django-web httpd-2.4.37]# [root@django-web httpd-2.4.37]# which apachectl /usr/bin/which: no apachectl in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) [root@django-web httpd-2.4.37]# [root@django-web httpd-2.4.37]# sed -i '/^PATH/ s|$|:/usr/local/apache2/bin|' ~/.bash_profile [root@django-web httpd-2.4.37]# source ~/.bash_profile [root@django-web httpd-2.4.37]# which apachectl /usr/local/apache2/bin/apachectl [root@django-web httpd-2.4.37]# [root@django-web httpd-2.4.37]# apachectl -v Server version: Apache/2.4.37 (Unix) Server built: Jan 17 2019 22:35:36 [root@django-web httpd-2.4.37]# 解压mod_wsgi源码包并进入源码目录,执行安装: configure命令的--with-apxs与--with-python选项分别指定apache的apxs与python可执行文件的路径。 [root@django-web httpd-2.4.37]# cd .. [root@django-web src]# tar axf mod_wsgi-4.6.5.tar.gz [root@django-web src]# cd mod_wsgi-4.6.5/ [root@django-web mod_wsgi-4.6.5]# ./configure \ > --with-python=/usr/local/bin/python3 \ > --with-apxs=/usr/local/apache2/bin/apxs && \ > make -j && make install 创建用于运行apache的web用户与组(本例中为www): [root@django-web mod_wsgi-4.6.5]# cd [root@django-web ~]# id www id: www: no such user [root@django-web ~]# useradd www -s /sbin/nologin [root@django-web ~]# id www uid=1000(www) gid=1000(www) groups=1000(www) [root@django-web ~]# 编辑apache主配置文件(本例中为/usr/local/apache2/conf/httpd.conf),执行以下修改: 将默认的运行时用户和组daemon修改为www [root@django-web ~]# ll /usr/local/apache2/conf/httpd.conf -rw-r--r-- 1 root root 18541 Jan 17 13:57 /usr/local/apache2/conf/httpd.conf [root@django-web ~]# [root@django-web ~]# cp -a /usr/local/apache2/conf/httpd.conf{,.ori} [root@django-web ~]# [root@django-web ~]# sed -n '/^User\|^Group/p' /usr/local/apache2/conf/httpd.conf User daemon Group daemon [root@django-web ~]# sed -i '/^User\|^Group/ s/daemon/www/' /usr/local/apache2/conf/httpd.conf [root@django-web ~]# [root@django-web ~]# sed -n '/^User\|^Group/p' /usr/local/apache2/conf/httpd.conf User www Group www [root@django-web ~]# 添加ServerName为localhost:80 [root@django-web ~]# sed -n '/ServerName/p' /usr/local/apache2/conf/httpd.conf # ServerName gives the name and port that the server uses to identify itself. #ServerName www.example.com:80 [root@django-web ~]# [root@django-web ~]# sed -i '/^#ServerName/a\ServerName localhost:80' /usr/local/apache2/conf/httpd.conf [root@django-web ~]# [root@django-web ~]# sed -n '/ServerName/p' /usr/local/apache2/conf/httpd.conf # ServerName gives the name and port that the server uses to identify itself. #ServerName www.example.com:80 ServerName localhost:80 [root@django-web ~]# 默认的文档根目录为/usr/local/apache2/htdocs,首页为index.html [root@django-web ~]# sed -n '/^DocumentRoot/p' /usr/local/apache2/conf/httpd.conf DocumentRoot "/usr/local/apache2/htdocs" [root@django-web ~]# [root@django-web ~]# ll /usr/local/apache2/htdocs/ total 4 -rw-r--r-- 1 root 40 45 Jun 11 2007 index.html [root@django-web ~]# 测试配置文件语法,若无误则启动apache: [root@django-web ~]# apachectl configtest Syntax OK [root@django-web ~]# apachectl [root@django-web ~]# [root@django-web ~]# ss -atn | grep :80 LISTEN 0 10 *:8000 *:* ESTAB 0 0 192.168.9.129:8000 192.168.9.1:58666 ESTAB 0 0 192.168.9.129:8000 192.168.9.1:58665 ESTAB 0 0 192.168.9.129:8000 192.168.9.1:58667 ESTAB 0 0 192.168.9.129:8000 192.168.9.1:58663 LISTEN 0 128 :::80 :::* [root@django-web ~]# 浏览器访问http://192.168.9.129/,若页面显示"It works!",则说明配置成功。 3.3.2 - mod_wsgi模式配置 apache作为wsgi前端时,mod_wsgi可以配置为两种工作模式(mode): 内嵌(embedded)模式:mod_wsgi作为apache进程的一部分;apache主进程将django后端代码视为配置文件而在启动时加载,且在整个运行周期内一直保持,更新代码需要重新加载或重新启动apache主进程。 守护进程(daemon)模式;mod_wsgi作为独立于apache的进程,负责解析django后端代码;对于每一个传入的wsgi请求,mod_wsgi将以apache的名义为之分配一个守护进程,因而代码的更新无需重新加载或重新启动apache主进程。 对于非Windows平台,Django官方文档中推荐使用守护进程模式。 3.3.2.1 - 内嵌模式 内嵌模式的基本配置包括: 在server或virtual host上下文中,以LoadModule指令加载mod_wsgi模块。 在server上下文中,以WSGIPythonPath指令指定项目包所在的本地路径名(非项目包自身的路径名)。 在server或virtual host上下文中,以WSGIScriptAlias指定web url路径对应的本地文件名。 为django项目创建单独的文档根目录与虚拟主机配置文件(本例中分别为/opt/webs/documents与/usr/local/apache2/conf/extra/httpd-django.conf): Django自身并不提供文件服务,而是交由前端的web服务器处理;对于url路径到本地路径的映射,Apache通过server/virtual host/directory上下文中的Alias指令指定,而Nginx则通过location块中的alias指令指定。 [root@django-web ~]# mkdir -p /opt/webs/documents [root@django-web ~]# vi /usr/local/apache2/conf/extra/httpd-django.conf WSGIPythonPath /opt/webs/t_django <VirtualHost *:80> ServerName localhost:80 DocumentRoot /opt/webs/documents LoadModule wsgi_module modules/mod_wsgi.so WSGIScriptAlias / /opt/webs/t_django/t_app/wsgi.py Alias /static/ /opt/webs/t_django/static/ <Directory /opt/webs/t_django> Require all granted </Directory> </VirtualHost> 在apache主配置文件中包含django虚拟主机配置文件: [root@django-web ~]# sed -i '$a\Include conf/extra/httpd-django.conf' /usr/local/apache2/conf/httpd.conf [root@django-web ~]# sed -n '$p' /usr/local/apache2/conf/httpd.conf Include conf/extra/httpd-django.conf [root@django-web ~]# 测试配置文件并重新加载: [root@django-web ~]# apachectl configtest Syntax OK [root@django-web ~]# [root@django-web ~]# apachectl graceful [root@django-web ~]# [root@django-web ~]# apachectl -M | grep wsgi wsgi_module (shared) [root@django-web ~]# [root@django-web ~]# ss -atn | grep :80 LISTEN 0 10 *:8000 *:* LISTEN 0 128 :::80 :::* [root@django-web ~]# 浏览器访问http://192.168.9.129/与http://192.168.9.129/admin,若页面显示与步骤3.2.3中相同,则说明内嵌模式配置成功。 查看访问日志: [root@django-web ~]# tail -f /usr/local/apache2/logs/access_log 192.168.9.1 - - [17/Jan/2019:15:58:48 +0000] "GET /admin HTTP/1.1" 301 - 192.168.9.1 - - [17/Jan/2019:15:58:48 +0000] "GET /admin/ HTTP/1.1" 302 - 192.168.9.1 - - [17/Jan/2019:15:58:48 +0000] "GET /admin/login/?next=/admin/ HTTP/1.1" 200 1819 192.168.9.1 - - [17/Jan/2019:15:58:48 +0000] "GET /static/admin/css/base.css HTTP/1.1" 200 16225 192.168.9.1 - - [17/Jan/2019:15:58:48 +0000] "GET /static/admin/css/login.css HTTP/1.1" 200 1203 192.168.9.1 - - [17/Jan/2019:15:58:48 +0000] "GET /static/admin/css/responsive.css HTTP/1.1" 200 17976 192.168.9.1 - - [17/Jan/2019:15:58:48 +0000] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423 192.168.9.1 - - [17/Jan/2019:15:58:48 +0000] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 81348 192.168.9.1 - - [17/Jan/2019:15:58:48 +0000] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 80304 192.168.9.1 - - [17/Jan/2019:15:58:48 +0000] "GET /favicon.ico HTTP/1.1" 404 1970 192.168.9.1 - - [17/Jan/2019:16:00:20 +0000] "GET / HTTP/1.1" 200 16348 192.168.9.1 - - [17/Jan/2019:16:00:20 +0000] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 82564 3.3.2.2 - 守护进程模式 守护进程模式的基本配置包括: 在server或virtual host上下文中,以LoadModule指令加载mod_wsgi模块。 在server或virtual host/directory上下文中,以WSGIProcessGroup指令指定wsgi应用所属的进程组名称。 在server或virtual host上下文中,以WSGIDaemonProcess指令指定守护进程的名称,以及项目包所在的本地路径名(非项目包自身的路径名)。 在server或virtual host上下文中,以WSGIScriptAlias指定web url路径对应的本地文件名。 [root@django-web ~]# cp -a /usr/local/apache2/conf/extra/httpd-django.conf /usr/local/apache2/conf/extra/httpd-django-embedded.conf [root@django-web ~]# [root@django-web ~]# vi /usr/local/apache2/conf/extra/httpd-django.conf <VirtualHost *:80> ServerName localhost:80 DocumentRoot /opt/webs/documents LoadModule wsgi_module modules/mod_wsgi.so WSGIProcessGroup t_app WSGIDaemonProcess t_app python-path=/opt/webs/t_django WSGIScriptAlias / /opt/webs/t_django/t_app/wsgi.py process-group=t_app Alias /static/ /opt/webs/t_django/static/ <Directory /opt/webs/t_django> Require all granted </Directory> </VirtualHost> [root@django-web ~]# [root@django-web ~]# apachectl configtest Syntax OK [root@django-web ~]# apachectl [root@django-web ~]# ps aux | grep http | grep -v grep root 60941 0.0 0.2 85860 2820 ? Ss 01:02 0:00 /usr/local/apache2/bin/httpd www 60942 0.2 0.7 464672 7008 ? Sl 01:02 0:00 /usr/local/apache2/bin/httpd www 60943 0.2 0.9 483100 9148 ? Sl 01:02 0:00 /usr/local/apache2/bin/httpd www 60944 0.2 0.9 483100 9148 ? Sl 01:02 0:00 /usr/local/apache2/bin/httpd www 60945 0.1 0.9 483100 9144 ? Sl 01:02 0:00 /usr/local/apache2/bin/httpd [root@django-web ~]# pstree -a 60941 httpd ├─httpd │ └─17*[{httpd}] ├─httpd │ └─26*[{httpd}] ├─httpd │ └─26*[{httpd}] └─httpd └─26*[{httpd}] apache根据多进程处理模块(MPM, Multi-Processing Module)中指定的工作模式(prefork/worker/event)分配资源以处理请求,一般会预先分配若干进程或进程+线程,具体依赖于特定的模式以及相应的参数配置。根据tree命令与ps命令的输出可以看到,apache主进程60941以root启动后,预分配了4个以www运行的子进程(60942/60943/60944/60945),每一个子进程又各自包含若干线程。 [root@django-web ~]# apachectl -V Server version: Apache/2.4.37 (Unix) Server built: Jan 17 2019 22:35:36 Server's Module Magic Number: 20120211:83 Server loaded: APR 1.6.5, APR-UTIL 1.6.1 Compiled using: APR 1.6.5, APR-UTIL 1.6.1 Architecture: 64-bit Server MPM: event threaded: yes (fixed thread count) forked: yes (variable process count) Server compiled with.... -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled) -D APR_USE_SYSVSEM_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D DYNAMIC_MODULE_LIMIT=256 -D HTTPD_ROOT="/usr/local/apache2" -D SUEXEC_BIN="/usr/local/apache2/bin/suexec" -D DEFAULT_PIDLOG="logs/httpd.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_ERRORLOG="logs/error_log" -D AP_TYPES_CONFIG_FILE="conf/mime.types" -D SERVER_CONFIG_FILE="conf/httpd.conf" 从apachectl -V命令的输出可以看出,当前使用的event MPM,且为多进程+多线程方式;但此时无法区分mod_wsgi与apache的其他子进程;WSGIDaemonProcess指令的display-name选项为进程组指定名称,通过自定义字符串加以区分,若指定为display-name=%{GROUP},则mod_wsgi进程将显示为(wsgi:进程组名称)。 添加display-name: [root@django-web ~]# vi /usr/local/apache2/conf/extra/httpd-django.conf <VirtualHost *:80> ServerName localhost:80 DocumentRoot /opt/webs/documents LoadModule wsgi_module modules/mod_wsgi.so WSGIProcessGroup t_app WSGIDaemonProcess t_app python-path=/opt/webs/t_django display-name=%{GROUP} WSGIScriptAlias / /opt/webs/t_django/t_app/wsgi.py process-group=t_app Alias /static/ /opt/webs/t_django/static/ <Directory /opt/webs/t_django> Require all granted </Directory> </VirtualHost> [root@django-web ~]# [root@django-web ~]# apachectl configtest Syntax OK [root@django-web ~]# apachectl graceful [root@django-web ~]# [root@django-web ~]# ps aux | grep http | grep -v grep root 60941 0.0 0.3 85860 3864 ? Ss 01:02 0:00 /usr/local/apache2/bin/httpd www 61089 0.0 0.9 483100 9148 ? Sl 01:18 0:00 /usr/local/apache2/bin/httpd www 61090 0.0 0.9 483100 9144 ? Sl 01:18 0:00 /usr/local/apache2/bin/httpd www 61091 0.0 0.9 483100 9148 ? Sl 01:18 0:00 /usr/local/apache2/bin/httpd [root@django-web ~]# [root@django-web ~]# pstree -a 60941 httpd ├─httpd │ └─17*[{httpd}] ├─httpd │ └─26*[{httpd}] ├─httpd │ └─26*[{httpd}] └─httpd └─26*[{httpd}] [root@django-web ~]# ps aux | grep t_app www 61088 0.0 0.7 464656 7020 ? Sl 01:18 0:00 (wsgi:t_app) root 61195 0.0 0.0 112708 976 pts/0 S+ 01:19 0:00 grep --color=auto t_app [root@django-web ~]# [root@django-web ~]# ps -p 61088 -o pid,ppid,args PID PPID COMMAND 61088 60941 (wsgi:t_app) [root@django-web ~]# 从以上输出可以看出,ps aux | grep http仅显示了4个进程,包括一个以root用户启动的主进程以及3个以www用户运行的子进程;另一个预先分配的子进程被wsgi进程占据,仍作为httpd的子进程,但显示为(wsgi:t_app)。 守护进程模式的wsgi通过unix域套接字的方式与apache主进程通信;unix域套接字为本地文件,对于Apache + mod_wsgi,该文件一般位于apache的logs目录下,可以在配置文件的server上下文中,通过WSGISocketPrefix指令指定为其他目录;mod_wsgi官方文档中建议该指令指定的目录应仅对root用户或apache的运行时用户可写。 [root@django-web ~]# ll /usr/local/apache2/logs/ total 12 -rw-r--r-- 1 root root 655 Jan 17 22:41 access_log -rw-r--r-- 1 root root 2112 Jan 18 01:18 error_log -rw-r--r-- 1 root root 6 Jan 18 01:18 httpd.pid srwx------ 1 www root 0 Jan 18 01:18 wsgi.60941.1.1.sock [root@django-web ~]# [root@django-web ~]# file /usr/local/apache2/logs/wsgi.60941.1.1.sock /usr/local/apache2/logs/wsgi.60941.1.1.sock: socket Apache + mod_wsgi基本配置完成,更多参数配置可查看官方文档。 3.4 - web前端(Nginx) Nginx + uwsgi作为django前端时,Nginx起到的作用更多仍在于反向代理服务器,在逻辑架构上可以与具体的后端应用相分离,而uwsgi作为实现了wsgi协议的web服务器则以独立的进程运行。Nginx自0.8.40版本开始提供对uwsgi的原生支持,uwsgi自身可以指定通过本地unix域套接字或网络套接字与Nginx进行通信,且支持丰富的配置参数,整个服务框架相较于Apache + mod_wsgi的部署方式更加复杂与灵活。 [root@django-web ~]# ip addr show eth0 | sed -n '/inet /p' | awk '{print $2}' 192.168.9.129/24 [root@django-web ~]# 安装依赖包: [root@django-web ~]# yum -y install gcc make openssl-devel pcre-devel 下载nginx(本例使用tengine)与uwsgi源码包: [root@django-web ~]# wget \ > https://projects.unbit.it/downloads/uwsgi-2.0.17.1.tar.gz \ > http://tengine.taobao.org/download/tengine-2.2.3.tar.gz -P /usr/local/src/ 解压nginx源码包并进入源码目录,执行安装: 源码安装nginx的默认目标路径为/usr/local,可以通过configure命令的--prefix选项显式指定;--with-http_uwsgi_module=shared选项指定将uwsgi模块以共享库的方式安装。 [root@django-web ~]# cd /usr/local/src/ [root@django-web src]# ll total 44084 drwxr-xr-x 28 1001 1001 4096 Jan 17 13:51 apr-1.6.5 -rw-r--r-- 1 root root 1073556 Sep 14 04:07 apr-1.6.5.tar.gz drwxr-xr-x 21 1001 1001 4096 Jan 17 13:53 apr-util-1.6.1 -rw-r--r-- 1 root root 554301 Oct 22 2017 apr-util-1.6.1.tar.gz drwxr-xr-x 12 www www 4096 Jan 16 17:31 Django-2.1.5 -rw-r--r-- 1 root root 8612384 Jan 4 13:47 Django-2.1.5.tar.gz drwxr-sr-x 12 root 40 4096 Jan 17 13:57 httpd-2.4.37 -rw-r--r-- 1 root root 9177278 Oct 22 14:13 httpd-2.4.37.tar.gz drwxr-xr-x 8 501 games 325 Jan 17 14:02 mod_wsgi-4.6.5 -rw-r--r-- 1 root root 490018 Oct 22 04:03 mod_wsgi-4.6.5.tar.gz drwxrwxr-x 9 www www 4096 Jan 16 17:16 mysqlclient-1.3.14 -rw-r--r-- 1 root root 91391 Dec 4 10:06 mysqlclient-1.3.14.tar.gz drwxr-xr-x 19 501 501 4096 Jan 16 17:05 Python-3.7.2 -rw-r--r-- 1 root root 22897802 Dec 24 03:42 Python-3.7.2.tgz -rw-r--r-- 1 root root 2203079 Jan 3 04:17 tengine-2.2.3.tar.gz -rw-r--r-- 1 root root 800156 Jul 8 2018 uwsgi-2.0.17.1.tar.gz [root@django-web src]# [root@django-web src]# tar axf tengine-2.2.3.tar.gz [root@django-web src]# cd tengine-2.2.3/ [root@django-web tengine-2.2.3]# [root@django-web tengine-2.2.3]# ./configure \ > --with-http_uwsgi_module=shared \ > --with-http_gzip_static_module \ > --with-http_concat_module \ > --with-http_stub_status_module \ > --with-http_ssl_module \ > --with-pcre \ > --with-backtrace_module \ > --with-http_upstream_check_module \ > --with-http_sysguard_module \ > --with-http_slice_module \ > --with-http_upstream_ip_hash_module=shared \ > --with-http_upstream_session_sticky_module=shared \ > --with-http_upstream_least_conn_module=shared && \ > make -j && make install 将nginx可执行文件的路径(本例为/usr/local/nginx/sbin)添加至系统的查找路径列表PATH中: [root@django-web tengine-2.2.3]# ls /usr/local/nginx/ conf html include logs modules sbin [root@django-web tengine-2.2.3]# ls /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx [root@django-web tengine-2.2.3]# which nginx /usr/bin/which: no nginx in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/usr/local/apache2/bin) [root@django-web tengine-2.2.3]# [root@django-web tengine-2.2.3]# sed -i '/^PATH/ s|$|:/usr/local/nginx/sbin|' ~/.bash_profile [root@django-web tengine-2.2.3]# source ~/.bash_profile [root@django-web tengine-2.2.3]# which nginx /usr/local/nginx/sbin/nginx [root@django-web tengine-2.2.3]# nginx -v Tengine version: Tengine/2.2.3 (nginx/1.8.1) [root@django-web tengine-2.2.3]# 解压uwsgi源码包并进入源码目录,执行安装: [root@django-web tengine-2.2.3]# cd .. [root@django-web src]# tar axf uwsgi-2.0.17.1.tar.gz [root@django-web src]# cd uwsgi-2.0.17.1/ [root@django-web uwsgi-2.0.17.1]# python3 setup.py install 安装成功后将生成uwsgi管理程序/usr/local/bin/uwsgi: [root@django-web uwsgi-2.0.17.1]# which uwsgi /usr/local/bin/uwsgi [root@django-web uwsgi-2.0.17.1]# [root@django-web uwsgi-2.0.17.1]# uwsgi --version 2.0.17.1 [root@django-web uwsgi-2.0.17.1]# 以tcp套接字的方式启动uwsgi: --socket 127.0.0.1:8000 以tcp套接字的127.0.0.1:8000启动 --uid/--gid 指定运行时的用户与组 --master 守护进程方式运行 --pidfile 运行时的pid文件 --daemonize 守护进程方式的日志输出文件 --chdir 项目包所在的目录 --module 项目包:入口文件:方法 [root@django-web ~]# uwsgi \ > --socket 127.0.0.1:8000 \ > --uid=www --gid=www \ > --master \ > --pidfile=/opt/webs/t_django/t_app.pid \ > --daemonize=/opt/webs/t_django/t_app.log \ > --chdir=/opt/webs/t_django \ > --module=t_app.wsgi:application \ > --processes=5 \ > --harakiri=20 \ > --max-requests=500 \ > --vacuum [root@django-web ~]# [root@django-web ~]# ss -atn | grep 8000 LISTEN 0 100 127.0.0.1:8000 *:* [root@django-web ~]# 查看日志: [root@django-web ~]# tail -f /opt/webs/t_django/t_app.log mapped 437520 bytes (427 KB) for 5 cores *** Operational MODE: preforking *** WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0xd8e280 pid: 65614 (default app) *** uWSGI is running in multiple interpreter mode *** spawned uWSGI master process (pid: 65614) spawned uWSGI worker 1 (pid: 65615, cores: 1) spawned uWSGI worker 2 (pid: 65616, cores: 1) spawned uWSGI worker 3 (pid: 65617, cores: 1) spawned uWSGI worker 4 (pid: 65618, cores: 1) spawned uWSGI worker 5 (pid: 65619, cores: 1) 设置nginx将wsgi请求转发至127.0.0.1:8000 为django项目创建单独的配置文件: Nginx转发wsgi协议需通过wsgi_pass指令指定后端服务,且在location块中包含定义了uwsgi相关参数的uwsgi_params文件。 [root@django-web ~]# mkdir -p /usr/local/nginx/conf/vhosts [root@django-web ~]# vi /usr/local/nginx/conf/vhosts/upstream.conf upstream t_django { server 127.0.0.1:8000; } [root@django-web ~]# vi /usr/local/nginx/conf/vhosts/t_django.conf server { listen 80; server_name 192.168.9.129; charset utf-8; client_max_body_size 75M; location /static { alias /opt/webs/t_django/static; } location / { include /usr/local/nginx/conf/uwsgi_params; uwsgi_pass t_django; uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto; } access_log logs/t_django-access.log main; } 在nginx主配置文件(本例中为/usr/local/nginx/conf/nginx.conf)中设置全局参数: 转发wsgi需要加载ngx_http_uwsgi_module.so模块,且在http上下文中包含以上两个配置文件。 [root@django-web ~]# vi /usr/local/nginx/conf/nginx.conf user www www; worker_processes auto; pid /usr/local/nginx/logs/nginx.pid; error_log /usr/local/nginx/logs/error.log warn; #Specifies the value for maximum file descriptors that can be opened by this process. worker_rlimit_nofile 51200; events { use epoll; worker_connections 4096; } dso { load ngx_http_uwsgi_module.so; load ngx_http_upstream_ip_hash_module.so; load ngx_http_upstream_least_conn_module.so; load ngx_http_upstream_session_sticky_module.so; } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 16k; large_client_header_buffers 4 32k; client_max_body_size 8m; access_log off; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 30; proxy_cache_methods POST GET HEAD; open_file_cache max=655350 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; gzip on; gzip_min_length 1k; gzip_buffers 8 8k; gzip_http_version 1.0; gzip_comp_level 4; gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php; gzip_vary on; server_tokens off; log_format main '$remote_addr\t$upstream_addr\t[$time_local]\t$request\t' '$status\t$body_bytes_sent\t$http_user_agent\t$http_referer\t' '$http_x_forwarded_for\t$request_time\t$upstream_response_time\t$remote_user\t' '$request_body'; map $http_upgrade $connection_upgrade { default upgrade; '' close; } include /usr/local/nginx/conf/vhosts/upstream.conf; include /usr/local/nginx/conf/vhosts/t_django.conf; } 配置文件语法测试无误后,启动nginx: [root@django-web ~]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@django-web ~]# [root@django-web ~]# nginx [root@django-web ~]# [root@django-web ~]# ss -atn | grep 80 LISTEN 0 128 *:80 *:* 浏览器访问http://192.168.9.129/与http://192.168.9.129/admin,若配置正确则应显示步骤3.2.3中的页面。 查看日志: [root@django-web ~]# tail -f /usr/local/nginx/logs/t_django-access.log 192.168.9.1 127.0.0.1:8000 [18/Jan/2019:03:13:36 +0000] GET / HTTP/1.1 200 4191 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0 - -0.005 0.005 - - 192.168.9.1 - [18/Jan/2019:03:13:36 +0000] GET /static/admin/css/fonts.css HTTP/1.1 200 423 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0http://192.168.9.129/ - 0.000 - - - 192.168.9.1 - [18/Jan/2019:03:13:36 +0000] GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1 200 82564 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0 http://192.168.9.129/static/admin/css/fonts.css - 0.000 - -- 192.168.9.1 - [18/Jan/2019:03:13:36 +0000] GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1 200 80304 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0 http://192.168.9.129/static/admin/css/fonts.css - 0.000 --- 192.168.9.1 - [18/Jan/2019:03:13:36 +0000] GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1 200 81348 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0 http://192.168.9.129/static/admin/css/fonts.css - 0.000 --- 192.168.9.1 127.0.0.1:8000 [18/Jan/2019:03:13:40 +0000] GET /admin/ HTTP/1.1 302 0Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0 - -0.002 0.002 - - 192.168.9.1 127.0.0.1:8000 [18/Jan/2019:03:13:40 +0000] GET /admin/login/?next=/admin/ HTTP/1.1 200 781 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0 - - 0.010 0.010 - - 192.168.9.1 - [18/Jan/2019:03:13:40 +0000] GET /static/admin/css/responsive.css HTTP/1.1 200 3580 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0 http://192.168.9.129/admin/login/?next=/admin/ - 0.000 - - - 192.168.9.1 - [18/Jan/2019:03:13:40 +0000] GET /static/admin/css/base.css HTTP/1.1 200 3949 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0http://192.168.9.129/admin/login/?next=/admin/ - 0.000 - - - 192.168.9.1 - [18/Jan/2019:03:13:40 +0000] GET /static/admin/css/login.css HTTP/1.1 200 502 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0http://192.168.9.129/admin/login/?next=/admin/ - 0.000 - - - 停止绑定至tcp 8000端口的uwsgi,而以unix域套接字的方式启动: [root@django-web ~]# uwsgi --stop /opt/webs/t_django/t_app.pid [root@django-web ~]# uwsgi \ > --socket /tmp/t_app.sock \ > --uid=www --gid=www \ > --master \ > --pidfile=/opt/webs/t_django/t_app.pid \ > --daemonize=/opt/webs/t_django/t_app.log \ > --chdir=/opt/webs/t_django \ > --module=t_app.wsgi:application \ > --processes=5 \ > --harakiri=20 \ > --max-requests=500 \ > --vacuum [root@django-web ~]# tail -f /opt/webs/t_django/t_app.log uwsgi socket 0 bound to UNIX address /tmp/t_app.sock fd 3 Python version: 3.7.2 (default, Jan 17 2019, 22:21:08) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] *** Python threads support is disabled. You can enable it with --enable-threads *** Python main interpreter initialized at 0xccdda0 your server socket listen backlog is limited to 100 connections your mercy for graceful operations on workers is 60 seconds mapped 437520 bytes (427 KB) for 5 cores *** Operational MODE: preforking *** WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0xccdda0 pid: 69293 (default app) *** uWSGI is running in multiple interpreter mode *** spawned uWSGI master process (pid: 69293) spawned uWSGI worker 1 (pid: 69294, cores: 1) spawned uWSGI worker 2 (pid: 69295, cores: 1) spawned uWSGI worker 3 (pid: 69296, cores: 1) spawned uWSGI worker 4 (pid: 69297, cores: 1) spawned uWSGI worker 5 (pid: 69298, cores: 1) 本地unix域套接字已被创建: [root@django-web ~]# ll /tmp/t_app.sock srwxrwxrwx 1 www www 0 Jan 18 03:25 /tmp/t_app.sock [root@django-web ~]# 将nginx的upstream由127.0.0.1:8000改为unix:/tmp/t_app.sock并重新加载nginx配置文件: [root@django-web ~]# sed -n '/server/p' /usr/local/nginx/conf/vhosts/upstream.conf server 127.0.0.1:8000; [root@django-web ~]# [root@django-web ~]# sed -i '/server/ s|127.0.0.1:8000|unix:/tmp/t_app.sock|' /usr/local/nginx/conf/vhosts/upstream.conf [root@django-web ~]# [root@django-web ~]# sed -n '/server/p' /usr/local/nginx/conf/vhosts/upstream.conf server unix:/tmp/t_app.sock; [root@django-web ~]# [root@django-web ~]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@django-web ~]# [root@django-web ~]# nginx -s reload [root@django-web ~]# 浏览器再次访问http://192.168.9.129/与http://192.168.9.129/admin,并查看日志: [root@django-web ~]# tail -f /usr/local/nginx/logs/t_django-access.log 192.168.9.1 unix:/tmp/t_app.sock [18/Jan/2019:03:33:44 +0000] GET / HTTP/1.1 200 4191 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0 --0.038 0.038 - - 192.168.9.1 - [18/Jan/2019:03:33:44 +0000] GET /static/admin/css/fonts.css HTTP/1.1 304 0 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0http://192.168.9.129/ - 0.000 - - - 192.168.9.1 unix:/tmp/t_app.sock [18/Jan/2019:03:33:49 +0000] GET /admin/ HTTP/1.1 302 0 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0- - 0.013 0.013 - - 192.168.9.1 unix:/tmp/t_app.sock [18/Jan/2019:03:33:49 +0000] GET /admin/login/?next=/admin/ HTTP/1.1 200 781 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0 - - 0.080 0.080 - - Nginx + uwsgi基本配置完成,更多参数配置可查看官方文档。 4. 自动化安装脚本 以下脚本将上述步骤简单封装为脚本,分为两个文件: django-environment.sh为函数定义,实现了python3/django/apache/nginx/mysql的安装,以及apache mod_wsgi的守护进程模式。 django-setup.sh以单实例运行的方式调用django-environment.sh文件中定义的函数。 用法:将两个文件放在同一目录下,根据需要实现的组件安装与配置,在django-setup.sh中添加相应的函数调用。建议以nohup后台的方式执行,并将输出重定向至指定的日志文件,可以避免因终端关闭导致的运行意外终止情况,且可以通过刷新日志文件查看运行过程与结果,例如: nohup ./django-setup.sh &> /tmp/django-apache-daemon.log & django-environment.sh脚本文件: #! /bin/bash # 函数列表 #install_common_dependencies #install_python3_dependencies #install_mysqlclient_dependencies #install_apache_dependencies #install_nginx_dependencies #install_mysql_dependencies #make_source #path_not_exists #install_python3 #install_mysqlclient #install_apache #install_nginx #install_uwsgi #install_django #django_basic_setup #apache_djange_daemon_mode #install_setup_mysql readonly SOURCE_DIR="/usr/local/src" readonly USER_PROFILE="${HOME}/.bash_profile" readonly DEFAULT_LIB_CONF="/etc/ld.so.conf" readonly DJANGO_PROJECT_DIR="/opt/webs/t_django" readonly DJANGO_APP="t_app" readonly WEB_USER="www" readonly WEB_GROUP="www" readonly WEB_USER_SHELL="/sbin/nologin" install_common_dependencies() { yum -y install gcc make } install_python3_dependencies() { yum -y install libffi-devel readline-devel zlib-devel openssl-devel } install_mysqlclient_dependencies() { yum -y install mysql-devel } install_apache_dependencies() { yum -y install expat-devel pcre-devel } install_nginx_dependencies() { yum -y install openssl-devel pcre-devel } install_mysql_dependencies() { yum -y install gcc-c++ cmake ncurses-devel openssl-devel } #多核编译 make_source() { local CPU_CORES=$(awk '/^processor/{print $3}' /proc/cpuinfo | wc -l) local OPTIONS="$@" make -j ${CPU_CORES} ${OPTIONS} make install } # 检查第1个参数指定的路径是否位于系统环境变量PATH中,若不存在则返回0,反之则返回1 path_not_exists() { [[ ${1} != "" && ${1} != " " ]] && local PATH_ELEM=${1} || return 0 local OLD_IFS="${IFS}" local IFS=":" local PATH_LIST=($PATH) IFS=${OLD_IFS} for i in ${PATH_LIST[@]}; do [[ ${i} == ${PATH_ELEM} ]] && return 1 done return 0 } # 安装python3解析器 install_python3() { local PYTHON_BIN="/usr/local/bin/python3" [[ -x ${PYTHON_BIN} ]] && \ { echo "python3已存在,请检查当前版本"; return 0; } echo "开始安装python3解析器" local PYTHON_BIN_DIR="$(dirname ${PYTHON_BIN})" local PYTHON_LIB_CONF="/etc/ld.so.conf.d/python-v3.7.2.conf" local PYTHON_LINK="/usr/bin/python3" install_python3_dependencies # python3安装的目标路径为--prefix选项显式指定的目录,或默认的/usrl/local/bin目录 # 若使用默认路径,则与之相关的共享库位于/usr/local/lib目录 cd ${SOURCE_DIR} tar xaf Python-3.7.2.tgz cd Python-3.7.2/ ./configure --enable-shared --enable-optimizations make_source -Wno-error=coverage-mismatch echo "python3解析器安装成功" # 将python3的共享库目录/usr/local/lib添加到系统共享库查找路径列表的配置文件中 [[ ! -f ${PYTHON_LIB_CONF} ]] && \ echo '/usr/local/lib' > ${PYTHON_LIB_CONF} || \ echo '/usr/local/lib' >> ${DEFAULT_LIB_CONF} ldconfig # 若python3可执行文件的路径不在PATH中,则添加 path_not_exists "${PYTHON_BIN_DIR}" && \ sed -i "/^PATH/s|$|:${PYTHON_BIN_DIR}|" ${USER_PROFILE}; source ${USER_PROFILE} # 创建python3可执行文件的符号链接 [[ ! -L ${PYTHON_LINK} ]] && \ ln -s ${PYTHON_BIN} ${PYTHON_LINK} } install_mysqlclient() { python3 -c "import MySQLdb; print(MySQLdb.version_info)" &> /dev/null && \ { echo "mysqlclient已存在,请检查当前版本"; return 0; } install_mysqlclient_dependencies cd ${SOURCE_DIR} tar xaf mysqlclient-1.3.14.tar.gz cd mysqlclient-1.3.14/ python3 setup.py install echo "mysqlclient安装成功" } # 安装apache web环境,包括apr,apr-util,apache httpd,mod_wsgi模块 install_apache() { local APACHE_BIN="/usr/local/apache2/bin/httpd" # apr,apache安装的目标路径为--prefix选项显式指定的目录,或默认的/usrl/local/apr与/usrl/local/apache2目录 # 对于apache,若使用默认目标路径,则可执行文件的目录为/usrl/local/apache2/bin if [[ ! -x ${APACHE_BIN} ]]; then install_apache_dependencies local APR_BIN="/usr/local/apr/bin/apr-1-config" if [[ ! -x ${APR_BIN} ]]; then echo "开始安装apr" cd ${SOURCE_DIR} tar xaf apr-1.6.5.tar.gz cd apr-1.6.5/ ./configure make_source echo "apr安装成功" else echo "apr已存在,请检查当前版本" fi local APU_BIN="/usr/local/apr/bin/apu-1-config" if [[ ! -x ${APU_BIN} ]]; then echo "开始安装apr-util" cd ${SOURCE_DIR} tar xaf apr-util-1.6.1.tar.gz cd apr-util-1.6.1/ ./configure --with-apr=/usr/local/apr make_source echo "apr-util安装成功" else echo "apr-util已存在,请检查当前版本" fi echo "开始安装apache" cd ${SOURCE_DIR} tar xaf httpd-2.4.37.tar.gz cd httpd-2.4.37/ ./configure \ --with-apr=/usr/local/apr \ --with-apr-util=/usr/local/apr \ --enable-mpms-shared=all make_source echo "apache安装成功" local APACHE_BIN_DIR="$(dirname ${APACHE_BIN})" # 若apache可执行文件的目录不在PATH中,则添加 path_not_exists "${APACHE_BIN_DIR}" && \ sed -i "/^PATH/s|$|:${APACHE_BIN_DIR}|" ${USER_PROFILE}; source ${USER_PROFILE} else echo "apache已存在,请检查当前版本" fi local APACHE_WSGI="/usr/local/apache2/modules/mod_wsgi.so" if [[ ! -e ${APACHE_WSGI} ]]; then echo "开始安装mod_wsgi模块" cd ${SOURCE_DIR} tar xaf mod_wsgi-4.6.5.tar.gz cd mod_wsgi-4.6.5/ ./configure \ --with-apxs=/usr/local/apache2/bin/apxs \ --with-python=/usr/local/bin/python3 make_source echo "mod_wsgi模块安装成功" else echo "mod_wsgi模块已存在,请检查当前版本" fi } install_nginx() { local NGINX_BIN="/usr/local/nginx/sbin/nginx" [[ -x ${NGINX_BIN} ]] && \ { echo "nginx已存在,请检查当前版本"; return 0; } local NGINX_CONFIG_OPTS="--with-http_uwsgi_module=shared \ --with-http_gzip_static_module \ --with-http_concat_module \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-pcre \ --with-backtrace_module \ --with-http_upstream_check_module \ --with-http_sysguard_module \ --with-http_slice_module \ --with-http_upstream_ip_hash_module=shared \ --with-http_upstream_session_sticky_module=shared \ --with-http_upstream_least_conn_module=shared" install_nginx_dependencies local NGINX_BIN_DIR="$(dirname ${NGINX_BIN})" # nginx安装的目标路径为--prefix选项显式指定的目录,或默认的/usrl/local/nginx目录 # 若使用默认目标路径,则可执行文件的目录为/usrl/local/nginx/sbin echo "开始安装nginx" cd ${SOURCE_DIR} tar xaf tengine-2.2.3.tar.gz cd tengine-2.2.3/ ./configure ${NGINX_CONFIG_OPTS} make_source echo "nginx安装成功" # 若nginx可执行文件的目录不在系统的PATH中,则添加 path_not_exists "${NGINX_BIN_DIR}" && \ sed -i "/^PATH/s|$|:${NGINX_BIN_DIR}|" ${USER_PROFILE}; source ${USER_PROFILE} } install_uwsgi() { local UWSGI_BIN="/usr/local/bin/uwsgi" [[ -e ${UWSGI_BIN} ]] && \ { echo "uwsgi已存在,请检查当前版本"; return 0; } local UWSGI_BIN_DIR="$(dirname ${UWSGI_BIN})" echo "开始安装uwsgi" cd ${SOURCE_DIR} tar xaf uwsgi-2.0.17.1.tar.gz cd uwsgi-2.0.17.1/ python3 setup.py install echo "uwsgi安装成功" # 若uwsgi可执行文件的目录不在系统PATH中,则添加 path_not_exists "${UWSGI_BIN_DIR}" && \ sed -i "/^PATH/s|$|:${UWSGI_BIN_DIR}|" ${USER_PROFILE}; source ${USER_PROFILE} } install_django() { python3 -m django --version &> /dev/null && \ { echo "django已存在,请检查当前版本"; return 0; } echo "开始安装django" cd ${SOURCE_DIR} tar xaf Django-2.1.5.tar.gz cd Django-2.1.5/ python3 setup.py install echo "django安装成功" } # django项目基本配置 django_basic_setup() { local DJANGO_DB_NAME="t_django_db" local DJANGO_DB_USER="u_django" local DJANGO_DB_PASS="p_django" local DJANGO_DB_HOST="192.168.9.130" local DJANGO_DB_PORT="3306" [[ ! -d ${DJANGO_PROJECT_DIR} ]] && mkdir -p ${DJANGO_PROJECT_DIR} [[ ! -d ${DJANGO_PROJECT_DIR}/${DJANGO_APP} ]] && \ django-admin startproject ${DJANGO_APP} ${DJANGO_PROJECT_DIR} cd ${DJANGO_PROJECT_DIR} cp -a ${DJANGO_APP}/settings.py{,.ori} sed -i '/^ALLOWED_HOSTS/ s|\[\]|\['\''*'\''\]|' ${DJANGO_APP}/settings.py sed -i '/ENGINE/{n;d}' ${DJANGO_APP}/settings.py sed -i -e '/ENGINE/ s/sqlite3/mysql/' -e '/ENGINE/a\ '\''HOST'\'': '\'''${DJANGO_DB_HOST}''\'',\n '\''PORT'\'': '\'''${DJANGO_DB_PORT}''\'',\n '\''NAME'\'': '\'''${DJANGO_DB_NAME}''\'',\n '\''USER'\'': '\'''${DJANGO_DB_USER}''\'',\n '\''PASSWORD'\'': '\'''${DJANGO_DB_PASS}''\'',\n '\''TIME_ZONE'\'': '\''Asia/Shanghai'\'',\n '\''USE_TZ'\'': False' ${DJANGO_APP}/settings.py sed -i '$a\STATIC_ROOT = os.path.join(BASE_DIR, '\''static'\'')' ${DJANGO_APP}/settings.py python3 manage.py collectstatic python3 manage.py migrate # python3 manage.py runserver 0:8000 & } # mod_wsgi守护进程模式 apache_djange_daemon_mode() { local APACHE_BASE_DIR="/usr/local/apache2" local APACHE_DOC_ROOT_DIR="/opt/webs/documents" local APACHE_BASE_CONF="conf/httpd.conf" local APACHE_DJANGO_CONF="conf/extra/httpd-django.conf" local TAB="$(echo -ne '\t')" id -u ${WEB_USER} &> /dev/null || \ useradd ${WEB_USER} -N -s ${WEB_USER_SHELL} getent group ${WEB_GROUP} &> /dev/null || \ groupadd ${WEB_GROUP} id -gr ${WEB_USER} &> /dev/null || \ usermod -g ${WEB_GROUP} ${WEB_USER} [[ ! -d ${APACHE_DOC_ROOT_DIR} ]] && \ mkdir -p ${APACHE_DOC_ROOT_DIR} chmod +x ${APACHE_DOC_ROOT_DIR} cd ${APACHE_BASE_DIR} cp -a ${APACHE_BASE_CONF}{,.ori} sed -i 's/User daemon/User '${WEB_USER}'/' ${APACHE_BASE_CONF} sed -i 's/Group daemon/Group '${WEB_GROUP}'/' ${APACHE_BASE_CONF} sed -i '/^DocumentRoot/,/<\/Directory\>/ s/^/#/' ${APACHE_BASE_CONF} sed -i '$a\\nServerName localhost:80' ${APACHE_BASE_CONF} sed -i '$a\Include '${APACHE_DJANGO_CONF}'' ${APACHE_BASE_CONF} [[ -f ${APACHE_DJANGO_CONF} ]] && \ cp -a ${APACHE_DJANGO_CONF}{,.ori} cat > ${APACHE_DJANGO_CONF} <<-EOF WSGISocketPrefix ${DJANGO_PROJECT_DIR}/${DJANGO_APP} <VirtualHost *:80> ${TAB}ServerName localhost:80 ${TAB}DocumentRoot ${APACHE_DOC_ROOT_DIR} ${TAB}LoadModule wsgi_module modules/mod_wsgi.so ${TAB}WSGIDaemonProcess ${DJANGO_APP} python-path=${DJANGO_PROJECT_DIR} display-name=%{GROUP} ${TAB}WSGIProcessGroup ${DJANGO_APP} ${TAB}WSGIScriptAlias / ${DJANGO_PROJECT_DIR}/${DJANGO_APP}/wsgi.py process-group=${DJANGO_APP} Alias /static/ ${DJANGO_PROJECT_DIR}/static/ ${TAB}<Directory ${DJANGO_PROJECT_DIR}> ${TAB}${TAB}Require all granted ${TAB}</Directory> </VirtualHost> EOF } # mysql安装与基本配置 install_setup_mysql() { local MYSQL_BIN="/usr/local/mysql/bin/mysqld" [[ -x ${MYSQL_BIN} ]] && \ { echo "mysql已存在,请检查当前版本"; return 0; } local MYSQL_BASE_DIR="/usr/local/mysql" local MYSQL_BIN_DIR="${MYSQL_BASE_DIR}/bin" local MYSQL_DATA_DIR="${MYSQL_BASE_DIR}/data" local MYSQL_LOGS_DIR="${MYSQL_BASE_DIR}/logs" local MYSQL_ERR_LOG="${MYSQL_LOGS_DIR}/mysqld-err.log" local MYSQL_SLW_LOG="${MYSQL_LOGS_DIR}/mysqld-slw.log" local MYSQL_PID_FILE="${MYSQL_LOGS_DIR}/mysqld.pid" local MYSQL_LIB_DIR="${MYSQL_BASE_DIR}/lib" local MYSQL_LIB_CONF="/etc/ld.so.conf.d/mysql-v5.7.24.conf" local MYSQL_USER="mysql" local MYSQL_GROUP=${MYSQL_USER} local MYSQL_USER_SHELL="/sbin/nologin" local MYSQL_CMAKE_OPTS="-DCMAKE_INSTALL_PREFIX=${MYSQL_BASE_DIR} \ -DWITH_BOOST=boost \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DWITH_FEDERATED_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DENABLED_LOCAL_INFILE=1 \ -DENABLE_DTRACE=0 \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_general_ci \ -DWITH_SSL=yes \ -DWITH_EMBEDDED_SERVER=1" local DJANGO_DB_NAME="t_django_db" local DJANGO_DB_USER="u_django" local DJANGO_DB_PASS="p_django" local DB_ROOT_PASS="django" local DJANGO_CLIENT="192.168.9.%" install_mysql_dependencies # 若mysql用户不存在,则创建 id -u ${MYSQL_USER} &> /dev/null || \ useradd ${MYSQL_USER} -N -s ${MYSQL_USER_SHELL} # 若mysql组不存在,则创建 getent group ${MYSQL_GROUP} &> /dev/null || \ groupadd ${MYSQL_GROUP} # 若mysql用户不是mysql组的成员,则加入 id -gr ${MYSQL_USER} &> /dev/null || \ usermod -g ${MYSQL_GROUP} ${MYSQL_USER} # mysql安装的目标路径为-DCMAKE_INSTALL_PREFIX选项显式指定的目录,或默认的/usrl/local/mysql目录 # 若使用默认目标路径,则与之相关的共享库位于/usr/local/mysql/lib cd ${SOURCE_DIR} tar xaf mysql-boost-5.7.24.tar.gz cd mysql-5.7.24/ cmake . ${MYSQL_CMAKE_OPTS} make_source # 创建mysql数据文件,错误日志文件,慢查询日志文件,pid文件,并设置所属的用户和组 [[ ! -d ${MYSQL_DATA_DIR} ]] && mkdir -p ${MYSQL_DATA_DIR} [[ ! -d ${MYSQL_LOGS_DIR} ]] && mkdir -p ${MYSQL_LOGS_DIR} [[ ! -f ${MYSQL_ERR_LOG} ]] && touch ${MYSQL_ERR_LOG} [[ ! -f ${MYSQL_SLW_LOG} ]] && touch ${MYSQL_SLW_LOG} [[ ! -f ${MYSQL_PID_FILE} ]] && touch ${MYSQL_PID_FILE} chown -R ${MYSQL_USER}:${MYSQL_GROUP} ${MYSQL_BASE_DIR} # 若mysql可执行文件的路径不在PATH中,则添加 path_not_exists "${MYSQL_BIN_DIR}" && \ sed -i "/^PATH/s|$|:${MYSQL_BIN_DIR}|" ${USER_PROFILE}; source ${USER_PROFILE} mysqld --initialize-insecure --user=${MYSQL_USER} --basedir=${MYSQL_BASE_DIR} --datadir=${MYSQL_DATA_DIR} mv /etc/my.cnf{,.ori} cat > /etc/my.cnf <<-EOF [mysqld] user = mysql port = 3306 server-id = 1 character-set-server = utf8mb4 socket = /tmp/mysql.sock basedir = ${MYSQL_BASE_DIR} datadir = ${MYSQL_DATA_DIR} pid-file = ${MYSQL_ERR_LOG} log_error = ${MYSQL_ERR_LOG} slow_query_log_file = ${MYSQL_SLW_LOG} skip-name-resolve = 1 back_log = 300 max_connections = 1000 max_connect_errors = 6000 open_files_limit = 65535 table_open_cache = 128 max_allowed_packet = 4M binlog_cache_size = 1M max_heap_table_size = 8M tmp_table_size = 16M read_buffer_size = 2M read_rnd_buffer_size = 8M sort_buffer_size = 8M join_buffer_size = 8M key_buffer_size = 4M thread_cache_size = 8 query_cache_type = 1 query_cache_size = 8M query_cache_limit = 2M ft_min_word_len = 4 log_bin = mysql-bin binlog_format = mixed expire_logs_days = 30 slow_query_log = 1 long_query_time = 1 performance_schema = 0 explicit_defaults_for_timestamp #lower_case_table_names = 1 skip-external-locking default_storage_engine = InnoDB innodb_file_per_table = 1 innodb_open_files = 500 innodb_buffer_pool_size = 64M innodb_write_io_threads = 4 innodb_read_io_threads = 4 innodb_thread_concurrency = 0 innodb_purge_threads = 1 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 2M innodb_log_file_size = 32M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 bulk_insert_buffer_size = 8M myisam_sort_buffer_size = 8M myisam_max_sort_file_size = 10G myisam_repair_threads = 1 interactive_timeout = 28800 wait_timeout = 28800 [mysqldump] quick max_allowed_packet = 16M [myisamchk] key_buffer_size = 8M sort_buffer_size = 8M read_buffer = 4M write_buffer = 4M EOF # 将mysql的共享库目录添加到系统共享库查找路径列表的配置文件中 [[ ! -f ${MYSQL_LIB_CONF} ]] && \ echo ${MYSQL_LIB_DIR} > ${MYSQL_LIB_CONF} || \ echo ${MYSQL_LIB_DIR} >> ${DEFAULT_LIB_CONF} ldconfig cp -a ${MYSQL_BASE_DIR}/support-files/mysql.server /etc/init.d/mysqld chmod 755 /etc/init.d/mysqld /etc/init.d/mysqld start chkconfig --level 35 mysqld on mysql -uroot -e "use mysql; set password for 'root'@'localhost' = password('${DB_ROOT_PASS}');" mysql -uroot -pdjango -e "create database ${DJANGO_DB_NAME}; grant all privileges on ${DJANGO_DB_NAME}.* to ${DJANGO_DB_USER}@'${DJANGO_CLIENT}' identified by '${DJANGO_DB_PASS}';" echo "mysql安装成功" } django-setup.sh脚本文件: #! /bin/bash # usage: nohup ./django-setup.sh &> /tmp/django-apache-daemon.log & set -o errexit source /etc/profile readonly LOCK_FD=$[$(ls -l /proc/${BASHPID}/fd | sed -n '$p' | awk '{print $9}') + 1] readonly LOCK_FILE="/tmp/$(basename $0).pid" readonly FUNC_FILE="./django-environment.sh" # 对指定的文件设置非阻塞模式的独占锁,并将正在运行的进程pid写入到加锁文件 # 程序运行前首先必须获取文件锁,并在运行期间始终持有;若获取锁操作失败,则立即以失败返回而无法运行 # 确保程序仅运行单个实例,避免出现竞争状态 eval "exec ${LOCK_FD}>>${LOCK_FILE}" flock -n ${LOCK_FD} && \ { echo "${BASHPID} - 运行开始"; echo ${BASHPID}>>${LOCK_FILE}; } || \ { echo "${BASHPID} - 运行失败,($(cat ${LOCK_FILE}))正在运行"; exit 1; } # 若程序成功执行完毕,则在退出前显式解锁,备份并清空锁文件 success() { echo "${BASHPID} - 运行完毕" flock -u ${LOCK_FD} eval "exec ${LOCK_FD}>&-" cp -a ${LOCK_FILE}{,.$(date +%Y-%m-%d-%H-%M-%S)} :>${LOCK_FILE} } trap success EXIT # 加载包含函数定义的文件 source ${FUNC_FILE} setup_apache_django_daemon_mode() { install_common_dependencies install_python3 install_mysqlclient install_django django_basic_setup install_apache apache_djange_daemon_mode } setup_mysql_for_django() { install_setup_mysql } setup_apache_django_daemon_mode #setup_mysql_for_django 5. 参考 uwsgi官方文档:https://uwsgi-docs.readthedocs.io/en/latest/index.html mod_wsgi官方文档:https://modwsgi.readthedocs.io/en/develop/index.html Django官方文档:https://docs.djangoproject.com/en/2.1/intro/ Nginx官方文档:https://docs.nginx.com/nginx/admin-guide/

优秀的个人博客,低调大师

Centos7 Python3.7 执行 RPi.GPIO

一、GPIO介绍 图中箭头所指,焊脚是4方的,表明是物理引脚1。 二、测试硬件连接是否可以 物理引脚1是3.3v电压(火线),39好引脚是GND(零线),连接电阻和二极管,应该是常亮的,如下图连接: 图中:三个电阻,每个是100欧,串联为300欧。二极发光管有正负极之分,长脚为正极,断脚为负极。 三、软件测试(前提已经安装RPi.GPIO) 1.硬件连接图如下:39号引脚和7号引脚(与1好引脚在同一列,第4排) 2.软件控制: 执行如下命令: sudo /usr/local/python371/bin/ipython 输入如下代码: import RPi.GPIO as GPIO GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(4,GPIO.OUT) GPIO.output(4,GPIO.HIGH) # GPIO.output(4,GPIO.LOW) ## 最后执行,将电压降下来 3.效果图如下: 四、遇到的问题: 如果不使用sudo或使用root用户执行,会报错,显示如下: In [4]: GPIO.setup(4,GPIO.OUT) --------------------------------------------------------------------------- RuntimeError Traceback (most recent call last) RuntimeError: No access to /dev/mem. Try running as root! 使用软件控制硬件,总算迈出第一步。!!!!

优秀的个人博客,低调大师

centos7搭建mongodb3.4.6集群

0、需要环境 安装包:mongodb-linux-x86_64-3.4.6.tgz 安装路径:/usr/mongodb 服务器: 192.168.177.131/132/133 mongos 20000 config server 21000 shard1 20001 shard2 20002 shard3 20003 1、解压到 /usr/local 解压后重命名为mongodb,方便以后操作 2、创建目录 mkdir -p mongodb/mongos/log mkdir -p mongodb/config-server/data mkdir -p mongodb/config-server/log mkdir -p mongodb/shard1/data mkdir -p mongodb/shard1/log mkdir -p mongodb/shard2/data mkdir -p mongodb/shard2/log mkdir -p mongodb/shard3/data mkdir -p mongodb/shard3/log 其中data目录存放数据,log目录存放日志 mongos服务不存放数据,所以不需要数据目录,只需要log目录 3、配置服务器 config server vim /usr/local/mongodb/config-server.conf systemLog: destination: file path: "/usr/local/mongodb/config-server/log/config-server.log" logAppend: true storage: dbPath: "/usr/local/mongodb/config-server/data" journal: enabled: true directoryPerDB: true net: port: 21000 processManagement: fork: true pidFilePath: "/usr/local/mongodb/config-server/config-server.pid" sharding: clusterRole: configsvr replication: replSetName: configServer 冒号(:)和配置之间需要有空格 启动三台服务器 cd mongodb bin/mongod -f config-server.conf 登录任意一台配置服务器,初始化 #连接 mongodb/bin/mongo --port 21000 config = { _id : "configServer", members : [ {_id : 0, host : "192.168.177.131:21000" }, {_id : 1, host : "192.168.177.132:21000" }, {_id : 2, host : "192.168.177.133:21000" } ] } #初始化副本集 rs.initiate(config); #查看分区状态 rs.status(); 4、分片副本集 shard vim /usr/local/mongodb/shard1.conf systemLog: destination: file path: "/usr/local/mongodb/shard1/log/shard1.log" logAppend: true storage: dbPath: "/usr/local/mongodb/shard1/data" journal: enabled: true directoryPerDB: true net: port: 20001 processManagement: fork: true pidFilePath: "/usr/local/mongodb/shard1/shard1.pid" sharding: clusterRole: shardsvr replication: replSetName: shard1 启动三台服务器: cd mongodb bin/mongod -f shard1.conf 登陆任意一台服务器,初始化副本集 mongo --port 20001 #使用admin数据库 use admin config = { _id : "shard1", members : [ {_id : 0, host : "192.168.177.131:20001" }, {_id : 1, host : "192.168.177.132:20001" }, {_id : 2, host : "192.168.177.133:20001" } ] } #初始化副本集 rs.initiate(config); #查看分区状态 rs.status(); 配置第二,三个分片副本集,方法同第六步。 注意端口改为20002 20003 systemLog: destination: file path: "/usr/local/mongodb/shard2/log/shard2.log" logAppend: true storage: dbPath: "/usr/local/mongodb/shard2/data" journal: enabled: true directoryPerDB: true net: port: 20002 processManagement: fork: true pidFilePath: "/usr/local/mongodb/shard2/shard2.pid" sharding: clusterRole: shardsvr replication: replSetName: shard2 systemLog: destination: file path: "/usr/local/mongodb/shard3/log/shard3.log" logAppend: true storage: dbPath: "/usr/local/mongodb/shard3/data" journal: enabled: true directoryPerDB: true net: port: 20003 processManagement: fork: true pidFilePath: "/usr/local/mongodb/shard3/shard3.pid" sharding: clusterRole: shardsvr replication: replSetName: shard3 启动三台服务器: cd mongodb bin/mongod -f shard2.conf bin/mongod -f shard3.conf 登陆任意一台服务器,初始化副本集 mongo --port 20002 mongo --port 20003 #使用admin数据库 use admin config = { _id : "shard2", members : [ {_id : 0, host : "192.168.177.131:20002" }, {_id : 1, host : "192.168.177.132:20002" }, {_id : 2, host : "192.168.177.133:20002" } ] } config = { _id : "shard3", members : [ {_id : 0, host : "192.168.177.131:20003" }, {_id : 1, host : "192.168.177.132:20003" }, {_id : 2, host : "192.168.177.133:20003" } ] } #初始化副本集 rs.initiate(config); #查看分区状态 rs.status(); 5、路由服务器 mongos vim /usr/local/mongodb/mongos.conf systemLog: destination: file path: "/usr/local/mongodb/mongos/log/mongos.log" logAppend: true net: port: 20000 bindIp: 0.0.0.0 processManagement: fork: true pidFilePath: "/usr/local/mongodb/mongos/mongos.pid" sharding: configDB: configReplSet/192.168.177.131:21000,192.168.177.132:21000,192.168.177.133:21000 启动三台服务器: cd mongodb bin/mongos -f mongos.conf 注意此处启动使用的是mongos 6、启用分片 目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。 #登陆任意一台mongos mongo --port 20000 #使用admin数据库 use admin #串联路由服务器与分配副本集 sh.addShard("shard1/192.168.177.131:20001,192.168.177.132:20001,192.168.177.133:20001"); sh.addShard("shard2/192.168.177.131:20002,192.168.177.132:20002,192.168.177.133:20002"); sh.addShard("shard3/192.168.177.131:20003,192.168.177.132:20003,192.168.177.133:20003"); #查看集群状态 sh.status() 至此集群已经搭建完成。 7、测试 连接mongos bin/mongo --port 20000 首先启动某个Database(数据库)的Sharding(分片)功能 mongos> sh.enableSharding("test") 对testDB数据库里的collection logs进行shard,shard key是sn字段,shard策略是hashed。使用hashed策略旨在让mongodb将数据均匀分布,如果使用{"sn",1}进行range shard,数据会按照大小顺序分布,就会出现某个shard数据很多,其他的很少的现象。 mongos> sh.shardCollection("testDB.logs", { "sn" : "hashed" } ) 查看shard信息 mongos> sh.status() 添加测试数据 mongos> use testDB mongos> for(var i=1; i<=100000; i++){db.log.insert({sn:i, msg:'Message ' + i});} 等待一段时间 查看log的shard信息 mongos> db.logs.stats() 可以看到三个分片几乎平均的保存了数据。 33143 33755 33102 { "sharded" : true, "capped" : false, "ns" : "testDB.logs", "count" : 100000, "size" : 5688895, "storageSize" : 1773568, "totalIndexSize" : 3944448, "indexSizes" : { "_id_" : 983040, "sn_hashed" : 2961408 }, "avgObjSize" : 56, "nindexes" : 2, "nchunks" : 6, "shards" : { "shard1" : { "ns" : "testDB.logs", "size" : 1920351, "count" : 33755, "avgObjSize" : 56, "storageSize" : 634880, "capped" : false, ... "ok" : 1 }, "shard2" : { "ns" : "testDB.logs", "size" : 1885397, "count" : 33143, "avgObjSize" : 56, "storageSize" : 544768, "capped" : false, ... "ok" : 1 }, "shard3" : { "ns" : "testDB.logs", "size" : 1883147, "count" : 33102, "avgObjSize" : 56, "storageSize" : 593920, "capped" : false, ... "ok" : 1 } }, "ok" : 1 } 8、后期运维 mongodb的启动顺序是,先启动配置服务器,在启动分片,最后启动mongos. /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/config-server.conf /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/shard1.conf /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/shard2.conf /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/shard3.conf /usr/local/mongodb/bin/mongos -f /usr/local/mongodb/mongos.conf 关闭时,直接killall杀掉所有进程 killall mongod killall mongos 没有killall命令的使用<yum install psmisc>安装

优秀的个人博客,低调大师

解决centos7 网卡启动不了,修复方法

刚刚装好的虚拟机突然不能上网了,报错很诡异,具体报错如下: /etc/init.d/network restart Restarting network (via systemctl): Job for network.service failed because the control process exited with error code. See "systemctl status network.service" and "journalctl -xe" for details. [失败] 使用systemctl status network.service命令查看结果如下: network.service - LSB: Bring up/down networking Loaded: loaded (/etc/rc.d/init.d/network) Active:failed(Result: exit-code) since 三 2016-08-17 11:34:36 CST; 54s ago Docs: man:systemd-sysv-generator(8) Process: 3847 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=1/FAILURE) 8月 17 11:34:36 python.cn network[3847]: RTNETLINK answers: File exists 8月 17 11:34:36 python.cn network[3847]: RTNETLINK answers: File exists 8月 17 11:34:36 python.cn network[3847]: RTNETLINK answers: File exists 8月 17 11:34:36 python.cn network[3847]: RTNETLINK answers: File exists 8月 17 11:34:36 python.cn network[3847]: RTNETLINK answers: File exists 8月 17 11:34:36 python.cn network[3847]: RTNETLINK answers: File exists 8月 17 11:34:36 python.cn systemd[1]: network.service: control process exited, code=exited status=1 8月 17 11:34:36 python.cn systemd[1]:Failed to start LSB: Bring up/down networking. 8月 17 11:34:36 python.cn systemd[1]: Unit network.service entered failed state. 8月 17 11:34:36 python.cn systemd[1]: network.service failed. 查看系统日志,报错如下: Aug 17 11:34:36 python network: RTNETLINK answers: File exists Aug 17 11:34:36 python network: RTNETLINK answers: File exists Aug 17 11:34:36 python network: RTNETLINK answers: File exists Aug 17 11:34:36 python network: RTNETLINK answers: File exists Aug 17 11:34:36 python network: RTNETLINK answers: File exists Aug 17 11:34:36 python network: RTNETLINK answers: File exists Aug 17 11:34:36 python network: RTNETLINK answers: File exists Aug 17 11:34:36 python network: RTNETLINK answers: File exists Aug 17 11:34:36 python network: RTNETLINK answers: File exists Aug 17 11:34:36 python systemd: network.service: control process exited, code=exited status=1 Aug 17 11:34:36 python systemd:Failed to start LSB: Bring up/down networking. Aug 17 11:34:36 python systemd: Unit network.service entered failed state. Aug 17 11:34:36 python systemd: network.service failed. Aug 17 11:36:28 python systemd: Starting LSB: Bring up/down networking... Aug 17 11:36:29 python network: 正在打开环回接口: 无法载入文件 '/etc/sysconfig/network-scripts/ifcfg-lo' Aug 17 11:36:29 python network: 无法载入文件 '/etc/sysconfig/network-scripts/ifcfg-lo' Aug 17 11:36:29 python network: 无法载入文件 '/etc/sysconfig/network-scripts/ifcfg-lo' Aug 17 11:36:29 python network: 无法载入文件 '/etc/sysconfig/network-scripts/ifcfg-lo' Aug 17 11:36:29 python network: [ 确定 ] Aug 17 11:36:29 python network: 正在打开接口 eno16777736: 错误:激活连接失败:No suitable device found for this connection. 经查,确认/etc/sysconfig/network-scripts/ifcfg-lo文件是存在的。问题出现在哪里呢?无法,只好百度一下吧,百度出来的结果竟然基本一样。 百度答案: mac地址不对,修改mac地址。 也许有人确实是mac问题,但是莫名其妙怎么可能mac地址更改了,除非你添加新网卡或者克隆的虚拟机。 我特么真笑了,天下百度文章一大抄啊。。。。。。。。 没办法了,Google一下吧,偶然看到一个文章,大意是跟系统自带的NetworkManager这个管理套件有关系,关掉就可以解决。 试一下: systemctl stop NetworkManager systemctl disable NetworkManager//解决问题的命令!!! Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service. Removed symlink /etc/systemd/system/dbus-org.freedesktop.NetworkManager.service. Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service. 重新启动网络: systemctl start network.service ifconfig |grep eno eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.192 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::20c:29ff:fe3d:b305 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:3d:b3:05 txqueuelen 1000 (Ethernet) RX packets 2 bytes 120 (120.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 22 bytes 3551 (3.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 网络正常启动,访问正常。

优秀的个人博客,低调大师

CentOS7安装xmr-stak挖矿门罗币

首先关闭CentOS的SELinux功能和防火墙 #systemctldisablefirewalld.service禁用firewalld服务 修改/etc/selinux/config文件中的SELINUX="disabled",然后重启。 配置网卡: 编辑/etc/sysconfig/network-scripts/网卡配置文件 BOOTPROTO=static ONBOOT=yes IPADDR=xxx NETMASK=xxx GATEWAY=xxx 编辑/etc/resolve.conf nameserver114.114.114.114 编译和安装xmr-stak,cmake3命令后面的参数声明只使用CPU进行挖矿 yuminstall-ycentos-release-sclepel-release yuminstall-ycmake3devtoolset-4-gcc*hwloc-devellibmicrohttpd-developenssl-develmakegit sclenabledevtoolset-4bash gitclonehttps://github.com/fireice-uk/xmr-stak.git 注意,从github上克隆完成后,要修改一下默认的作者抽费率的设置,否则默认的作者要从你挖的结果中抽掉2%,修改文件xmr-stak/xmrstak/donate-level.hpp中默认的2.0改为0.0 constexprdoublefDevDonationLevel=0.0/100.0; 继续下面的编译操作 mkdirxmr-stak/build cdxmr-stak/build cmake3-DCUDA_ENABLE=OFF-DOpenCL_ENABLE=OFF.. makeinstall PS:对于不需要编译直接拷过来xmr-stak用的话,只需要安装以下包即可 hwloc-devellibmicrohttpd-developenssl-devel 编译好的64位CentOS7.x适用的xmr-stak程序(已删除2%开发者费率设置)已上传至CSDN资源: https://download.csdn.net/download/lpwmm/10370863 更新适用于64位CentOS 6.x系统的xmr-stak程序(已删除2%开发者费率设置)下载地址: https://download.csdn.net/download/lpwmm/10370879 编写后台运行的脚本: #vi/opt/runXMR.sh 添加内容如下: cd/opt/bin nohup/opt/bin/xmr-stak>/dev/null2>&1& 自行修改上面的具体程序位置 运行./xmr-stak根据向导提示录入相关配置信息 [root@seafilebin]#./xmr-stak Pleaseenter: -DoyouwanttousetheHTTPinterface? Unlikethescreendisplay,browserinterfaceisnotaffectedbytheGPUlag. Ifyoudon'twanttouseit,pleaseenter0,otherwiseenterportnumberthattheminershouldlistenon 666 Configurationstoredinfile'config.txt' Pleaseenter: -Pleaseenterthecurrencythatyouwanttomine: -aeon7 -cryptonight -cryptonight_lite -edollar -electroneum -graft -intense -karbo -monero7 -stellite -sumokoin monero7 -Pooladdress:e.g.pool.usxmrpool.com:3333 mine.ppxxmr.com:3333 -Username(walletaddressorpoollogin): 46TEUwhbvqGY5wMzpdZ5q6b1zNdVGibrcdSyc1e2uTaJ2FTz2CpPy7UZNUiw7oy2gVZGB6U1CQCXg7yk4JcC4Z5yHfC45bY -Password(mostlyemptyorx): -Rigidentifierforpool-sidestatistics(needspoolsupport).Canbeempty: -DoesthispoolportsupportTLS/SSL?Usenoifunknown.(y/N) n -Doyouwanttousenicehashonthispool?(y/n) n -Doyouwanttousemultiplepools?(y/n) n Poolconfigurationstoredinfile'pools.txt' [2018-04-1718:23:20]:YourCPUdoesn'tsupporthardwareAES.Don'texpecthighhashrates. [2018-04-1718:23:20]:MEMORYALLOCFAILED:mmapfailed [2018-04-1718:23:20]:MEMORYALLOCFAILED:mmapfailed [2018-04-1718:23:20]:MEMORYALLOCFAILED:mmapfailed [2018-04-1718:23:20]:MEMORYALLOCFAILED:mmapfailed [2018-04-1718:23:20]:MEMORYALLOCFAILED:mmapfailed ------------------------------------------------------------------- xmr-stak2.4.2e10e8e6 Broughttoyoubyfireice_ukandpsychocryptunderGPLv3. BasedonCPUminingcodebywolf9466(heavilyoptimizedbyfireice_uk). Configurabledevdonationlevelissetto2.0% Youcanusefollowingkeystodisplayreports: 'h'-hashrate 'r'-results 'c'-connection ------------------------------------------------------------------- [2018-04-1718:23:20]:Miningcoin:monero7 [2018-04-1718:23:20]:CPUconfigurationstoredinfile'cpu.txt' [2018-04-1718:23:20]:Starting2xthread,affinity:0. [2018-04-1718:23:20]:hwloc:memorypinned [2018-04-1718:23:20]:Starting2xthread,affinity:1. [2018-04-1718:23:20]:MEMORYALLOCFAILED:mmapfailed [2018-04-1718:23:20]:MEMORYALLOCFAILED:mmapfailed [2018-04-1718:23:20]:hwloc:memorypinned [2018-04-1718:23:20]:Fast-connectingtomine.ppxxmr.com:3333pool... [2018-04-1718:23:20]:MEMORYALLOCFAILED:mmapfailed [2018-04-1718:23:20]:MEMORYALLOCFAILED:mmapfailed [2018-04-1718:23:20]:Poolmine.ppxxmr.com:3333connected.Loggingin... [2018-04-1718:23:20]:Difficultychanged.Now:8000. [2018-04-1718:23:20]:Poolloggedin. [2018-04-1718:23:21]:Newblockdetected. 这里我设置了使用666端口运行web服务,可以远程查看当前的挖矿状态,矿池用的是皮皮虾,一个国内的,速度不错,先挖挖试试吧,网站地址:https://xmr.c1d2.com,矿池分了好几个,可以根据自己机器性能来选,我这台垃圾虚拟机,就用最low的矿池了,地址mine.ppxxmr.com:3333,其他矿池地址: 这样就开始挖矿了,但是上面出现了有个内存分配的错误 MEMORYALLOCFAILED:mmapfailed 还需要设置一下系统的参数 [root@seafilebin]#vi/etc/security/limits.conf 增加内容: * soft memlock 262144 * hard memlock 262144 再执行 #sysctl-wvm.nr_hugepages=128 再运行xmr-stak就不再提示内存的报错了 这时候本地打开浏览器访问服务器的地址:666就可以看到当前的挖矿状态:

优秀的个人博客,低调大师

CentOS7 Docker安装操作以及基本命令

1.安装docker yum -y install docker-io [root@localhost ~]# yum -y install docker-io Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.163.com * extras: mirrors.btte.net * updates: mirrors.163.com Resolving Dependencies --> Running transaction check ---> Package docker.x86_64 2:1.12.6-28.git1398f24.el7.centos will be installed --> Processing Dependency: docker-common = 2:1.12.6-28.git1398f24.el7.centos for package: 2:docker-1.12.6-28.git1398f24.el7.centos.x86_64 --> Processing Dependency: docker-client = 2:1.12.6-28.git1398f24.el7.centos for package: 2:docker-1.12.6-28.git1398f24.el7.centos.x86_64 --> Processing Dependency: oci-systemd-hook >= 1:0.1.4-9 for package: 2:docker-1.12.6-28.git1398f24.el7.centos.x86_64 --> Processing Dependency: oci-register-machine >= 1:0-3.10 for package: 2:docker-1.12.6-28.git1398f24.el7.centos.x86_64 --> Processing Dependency: container-selinux >= 2:2.12-2 for package: 2:docker-1.12.6-28.git1398f24.el7.centos.x86_64 --> Processing Dependency: skopeo-containers for package: 2:docker-1.12.6-28.git1398f24.el7.centos.x86_64 --> Running transaction check ---> Package container-selinux.noarch 2:2.12-2.gite7096ce.el7 will be installed --> Processing Dependency: policycoreutils >= 2.5-11 for package: 2:container-selinux-2.12-2.gite7096ce.el7.noarch ---> Package docker-client.x86_64 2:1.12.6-28.git1398f24.el7.centos will be installed ---> Package docker-common.x86_64 2:1.12.6-28.git1398f24.el7.centos will be installed ---> Package oci-register-machine.x86_64 1:0-3.11.gitdd0daef.el7 will be installed ---> Package oci-systemd-hook.x86_64 1:0.1.7-2.git2788078.el7 will be installed ---> Package skopeo-containers.x86_64 1:0.1.19-1.el7 will be installed --> Running transaction check ---> Package policycoreutils.x86_64 0:2.2.5-20.el7 will be updated --> Processing Dependency: policycoreutils = 2.2.5-20.el7 for package: policycoreutils-python-2.2.5-20.el7.x86_64 ---> Package policycoreutils.x86_64 0:2.5-11.el7_3 will be an update --> Processing Dependency: libsepol >= 2.5-6 for package: policycoreutils-2.5-11.el7_3.x86_64 --> Processing Dependency: libselinux-utils >= 2.5-6 for package: policycoreutils-2.5-11.el7_3.x86_64 --> Processing Dependency: libsepol.so.1(LIBSEPOL_1.1)(64bit) for package: policycoreutils-2.5-11.el7_3.x86_64 --> Processing Dependency: libsepol.so.1(LIBSEPOL_1.0)(64bit) for package: policycoreutils-2.5-11.el7_3.x86_64 --> Processing Dependency: libsemanage.so.1(LIBSEMANAGE_1.1)(64bit) for package: policycoreutils-2.5-11.el7_3.x86_64 --> Running transaction check ---> Package libselinux-utils.x86_64 0:2.2.2-6.el7 will be updated ---> Package libselinux-utils.x86_64 0:2.5-6.el7 will be an update --> Processing Dependency: libselinux(x86-64) = 2.5-6.el7 for package: libselinux-utils-2.5-6.el7.x86_64 ---> Package libsemanage.x86_64 0:2.1.10-18.el7 will be updated --> Processing Dependency: libsemanage = 2.1.10-18.el7 for package: libsemanage-python-2.1.10-18.el7.x86_64 ---> Package libsemanage.x86_64 0:2.5-5.1.el7_3 will be an update ---> Package libsepol.x86_64 0:2.1.9-3.el7 will be updated ---> Package libsepol.x86_64 0:2.5-6.el7 will be an update ---> Package policycoreutils-python.x86_64 0:2.2.5-20.el7 will be updated ---> Package policycoreutils-python.x86_64 0:2.5-11.el7_3 will be an update --> Processing Dependency: setools-libs >= 3.3.8-1 for package: policycoreutils-python-2.5-11.el7_3.x86_64 --> Running transaction check ---> Package libselinux.x86_64 0:2.2.2-6.el7 will be updated --> Processing Dependency: libselinux = 2.2.2-6.el7 for package: libselinux-python-2.2.2-6.el7.x86_64 ---> Package libselinux.x86_64 0:2.5-6.el7 will be an update ---> Package libsemanage-python.x86_64 0:2.1.10-18.el7 will be updated ---> Package libsemanage-python.x86_64 0:2.5-5.1.el7_3 will be an update ---> Package setools-libs.x86_64 0:3.3.7-46.el7 will be updated ---> Package setools-libs.x86_64 0:3.3.8-1.1.el7 will be an update --> Running transaction check ---> Package libselinux-python.x86_64 0:2.2.2-6.el7 will be updated ---> Package libselinux-python.x86_64 0:2.5-6.el7 will be an update --> Processing Conflict: libsemanage-2.5-5.1.el7_3.x86_64 conflicts selinux-policy-base < 3.13.1-66 --> Restarting Dependency Resolution with new changes. --> Running transaction check ---> Package selinux-policy-targeted.noarch 0:3.13.1-60.el7 will be updated ---> Package selinux-policy-targeted.noarch 0:3.13.1-102.el7_3.16 will be an update --> Processing Dependency: selinux-policy = 3.13.1-102.el7_3.16 for package: selinux-policy-targeted-3.13.1-102.el7_3.16.noarch --> Processing Dependency: selinux-policy = 3.13.1-102.el7_3.16 for package: selinux-policy-targeted-3.13.1-102.el7_3.16.noarch --> Running transaction check ---> Package selinux-policy.noarch 0:3.13.1-60.el7 will be updated ---> Package selinux-policy.noarch 0:3.13.1-102.el7_3.16 will be an update --> Processing Conflict: libselinux-2.5-6.el7.x86_64 conflicts systemd < 219-20 --> Restarting Dependency Resolution with new changes. --> Running transaction check ---> Package systemd.x86_64 0:219-19.el7 will be updated --> Processing Dependency: systemd = 219-19.el7 for package: systemd-python-219-19.el7.x86_64 --> Processing Dependency: systemd = 219-19.el7 for package: systemd-sysv-219-19.el7.x86_64 ---> Package systemd.x86_64 0:219-30.el7_3.9 will be an update --> Processing Dependency: systemd-libs = 219-30.el7_3.9 for package: systemd-219-30.el7_3.9.x86_64 --> Running transaction check ---> Package systemd-libs.x86_64 0:219-19.el7 will be updated --> Processing Dependency: systemd-libs = 219-19.el7 for package: libgudev1-219-19.el7.x86_64 ---> Package systemd-libs.x86_64 0:219-30.el7_3.9 will be an update ---> Package systemd-python.x86_64 0:219-19.el7 will be updated ---> Package systemd-python.x86_64 0:219-30.el7_3.9 will be an update ---> Package systemd-sysv.x86_64 0:219-19.el7 will be updated ---> Package systemd-sysv.x86_64 0:219-30.el7_3.9 will be an update --> Running transaction check ---> Package libgudev1.x86_64 0:219-19.el7 will be updated ---> Package libgudev1.x86_64 0:219-30.el7_3.9 will be an update --> Finished Dependency Resolution Dependencies Resolved ============================================================================================================================================================================================================================================ Package Arch Version Repository Size ============================================================================================================================================================================================================================================ Installing: docker x86_64 2:1.12.6-28.git1398f24.el7.centos extras 14 M Updating: selinux-policy-targeted noarch 3.13.1-102.el7_3.16 updates 6.4 M systemd x86_64 219-30.el7_3.9 updates 5.2 M Installing for dependencies: container-selinux noarch 2:2.12-2.gite7096ce.el7 extras 28 k docker-client x86_64 2:1.12.6-28.git1398f24.el7.centos extras 3.2 M docker-common x86_64 2:1.12.6-28.git1398f24.el7.centos extras 75 k oci-register-machine x86_64 1:0-3.11.gitdd0daef.el7 extras 1.0 M oci-systemd-hook x86_64 1:0.1.7-2.git2788078.el7 extras 30 k skopeo-containers x86_64 1:0.1.19-1.el7 extras 7.7 k Updating for dependencies: libgudev1 x86_64 219-30.el7_3.9 updates 77 k libselinux x86_64 2.5-6.el7 base 161 k libselinux-python x86_64 2.5-6.el7 base 234 k libselinux-utils x86_64 2.5-6.el7 base 151 k libsemanage x86_64 2.5-5.1.el7_3 updates 144 k libsemanage-python x86_64 2.5-5.1.el7_3 updates 104 k libsepol x86_64 2.5-6.el7 base 288 k policycoreutils x86_64 2.5-11.el7_3 updates 841 k policycoreutils-python x86_64 2.5-11.el7_3 updates 445 k selinux-policy noarch 3.13.1-102.el7_3.16 updates 414 k setools-libs x86_64 3.3.8-1.1.el7 base 612 k systemd-libs x86_64 219-30.el7_3.9 updates 369 k systemd-python x86_64 219-30.el7_3.9 updates 110 k systemd-sysv x86_64 219-30.el7_3.9 updates 64 k Transaction Summary ============================================================================================================================================================================================================================================ Install 1 Package (+ 6 Dependent packages) Upgrade 2 Packages (+14 Dependent packages) Total size: 34 M Total download size: 19 M Downloading packages: (1/7): container-selinux-2.12-2.gite7096ce.el7.noarch.rpm | 28 kB 00:00:00 (2/7): docker-common-1.12.6-28.git1398f24.el7.centos.x86_64.rpm | 75 kB 00:00:00 (3/7): skopeo-containers-0.1.19-1.el7.x86_64.rpm | 7.7 kB 00:00:00 (4/7): oci-systemd-hook-0.1.7-2.git2788078.el7.x86_64.rpm | 30 kB 00:00:00 (5/7): oci-register-machine-0-3.11.gitdd0daef.el7.x86_64.rpm | 1.0 MB 00:00:01 (6/7): docker-1.12.6-28.git1398f24.el7.centos.x86_64.rpm | 14 MB 00:00:01 (7/7): docker-client-1.12.6-28.git1398f24.el7.centos.x86_64.rpm | 3.2 MB 00:00:02 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 7.8 MB/s | 19 MB 00:00:02 Running transaction check Running transaction test Transaction test succeeded Running transaction Updating : libsepol-2.5-6.el7.x86_64 1/39 Updating : libselinux-2.5-6.el7.x86_64 2/39 Updating : systemd-libs-219-30.el7_3.9.x86_64 3/39 Updating : systemd-219-30.el7_3.9.x86_64 4/39 Updating : libsemanage-2.5-5.1.el7_3.x86_64 5/39 Updating : libselinux-utils-2.5-6.el7.x86_64 6/39 Updating : policycoreutils-2.5-11.el7_3.x86_64 7/39 Updating : selinux-policy-3.13.1-102.el7_3.16.noarch 8/39 Installing : 2:docker-common-1.12.6-28.git1398f24.el7.centos.x86_64 9/39 Installing : 2:docker-client-1.12.6-28.git1398f24.el7.centos.x86_64 10/39 Updating : selinux-policy-targeted-3.13.1-102.el7_3.16.noarch 11/39 Updating : libsemanage-python-2.5-5.1.el7_3.x86_64 12/39 Installing : 1:oci-register-machine-0-3.11.gitdd0daef.el7.x86_64 13/39 Updating : libselinux-python-2.5-6.el7.x86_64 14/39 Installing : 1:oci-systemd-hook-0.1.7-2.git2788078.el7.x86_64 15/39 Updating : setools-libs-3.3.8-1.1.el7.x86_64 16/39 Updating : policycoreutils-python-2.5-11.el7_3.x86_64 17/39 Installing : 2:container-selinux-2.12-2.gite7096ce.el7.noarch 18/39 Installing : 1:skopeo-containers-0.1.19-1.el7.x86_64 19/39 Stopping containers... Cannot connect to the Docker daemon. Is the docker daemon running on this host? "docker stop" requires at least 1 argument(s). See 'docker stop --help'. Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...] Stop one or more running containers Installing : 2:docker-1.12.6-28.git1398f24.el7.centos.x86_64 20/39 Updating : systemd-python-219-30.el7_3.9.x86_64 21/39 Updating : systemd-sysv-219-30.el7_3.9.x86_64 22/39 Updating : libgudev1-219-30.el7_3.9.x86_64 23/39 Cleanup : policycoreutils-python-2.2.5-20.el7.x86_64 24/39 Cleanup : selinux-policy-targeted-3.13.1-60.el7.noarch 25/39 Cleanup : systemd-python-219-19.el7.x86_64 26/39 Cleanup : selinux-policy-3.13.1-60.el7.noarch 27/39 Cleanup : systemd-sysv-219-19.el7.x86_64 28/39 Cleanup : policycoreutils-2.2.5-20.el7.x86_64 29/39 Cleanup : systemd-219-19.el7.x86_64 30/39 Cleanup : setools-libs-3.3.7-46.el7.x86_64 31/39 Cleanup : libselinux-utils-2.2.2-6.el7.x86_64 32/39 Cleanup : libselinux-python-2.2.2-6.el7.x86_64 33/39 Cleanup : libsemanage-python-2.1.10-18.el7.x86_64 34/39 Cleanup : libsemanage-2.1.10-18.el7.x86_64 35/39 Cleanup : libgudev1-219-19.el7.x86_64 36/39 Cleanup : systemd-libs-219-19.el7.x86_64 37/39 Cleanup : libselinux-2.2.2-6.el7.x86_64 38/39 Cleanup : libsepol-2.1.9-3.el7.x86_64 39/39 Verifying : libsepol-2.5-6.el7.x86_64 1/39 Verifying : libselinux-python-2.5-6.el7.x86_64 2/39 Verifying : 1:oci-register-machine-0-3.11.gitdd0daef.el7.x86_64 3/39 Verifying : policycoreutils-python-2.5-11.el7_3.x86_64 4/39 Verifying : libselinux-utils-2.5-6.el7.x86_64 5/39 Verifying : policycoreutils-2.5-11.el7_3.x86_64 6/39 Verifying : 2:docker-1.12.6-28.git1398f24.el7.centos.x86_64 7/39 Verifying : libgudev1-219-30.el7_3.9.x86_64 8/39 Verifying : systemd-219-30.el7_3.9.x86_64 9/39 Verifying : 2:docker-common-1.12.6-28.git1398f24.el7.centos.x86_64 10/39 Verifying : selinux-policy-3.13.1-102.el7_3.16.noarch 11/39 Verifying : selinux-policy-targeted-3.13.1-102.el7_3.16.noarch 12/39 Verifying : libsemanage-2.5-5.1.el7_3.x86_64 13/39 Verifying : systemd-python-219-30.el7_3.9.x86_64 14/39 Verifying : 2:container-selinux-2.12-2.gite7096ce.el7.noarch 15/39 Verifying : 1:skopeo-containers-0.1.19-1.el7.x86_64 16/39 Verifying : libselinux-2.5-6.el7.x86_64 17/39 Verifying : systemd-sysv-219-30.el7_3.9.x86_64 18/39 Verifying : 1:oci-systemd-hook-0.1.7-2.git2788078.el7.x86_64 19/39 Verifying : libsemanage-python-2.5-5.1.el7_3.x86_64 20/39 Verifying : 2:docker-client-1.12.6-28.git1398f24.el7.centos.x86_64 21/39 Verifying : systemd-libs-219-30.el7_3.9.x86_64 22/39 Verifying : setools-libs-3.3.8-1.1.el7.x86_64 23/39 Verifying : systemd-python-219-19.el7.x86_64 24/39 Verifying : libsemanage-python-2.1.10-18.el7.x86_64 25/39 Verifying : setools-libs-3.3.7-46.el7.x86_64 26/39 Verifying : libsemanage-2.1.10-18.el7.x86_64 27/39 Verifying : systemd-sysv-219-19.el7.x86_64 28/39 Verifying : libgudev1-219-19.el7.x86_64 29/39 Verifying : systemd-219-19.el7.x86_64 30/39 Verifying : selinux-policy-3.13.1-60.el7.noarch 31/39 Verifying : systemd-libs-219-19.el7.x86_64 32/39 Verifying : libselinux-utils-2.2.2-6.el7.x86_64 33/39 Verifying : selinux-policy-targeted-3.13.1-60.el7.noarch 34/39 Verifying : libsepol-2.1.9-3.el7.x86_64 35/39 Verifying : libselinux-python-2.2.2-6.el7.x86_64 36/39 Verifying : policycoreutils-2.2.5-20.el7.x86_64 37/39 Verifying : libselinux-2.2.2-6.el7.x86_64 38/39 Verifying : policycoreutils-python-2.2.5-20.el7.x86_64 39/39 Installed: docker.x86_64 2:1.12.6-28.git1398f24.el7.centos Dependency Installed: container-selinux.noarch 2:2.12-2.gite7096ce.el7 docker-client.x86_64 2:1.12.6-28.git1398f24.el7.centos docker-common.x86_64 2:1.12.6-28.git1398f24.el7.centos oci-register-machine.x86_64 1:0-3.11.gitdd0daef.el7 oci-systemd-hook.x86_64 1:0.1.7-2.git2788078.el7 skopeo-containers.x86_64 1:0.1.19-1.el7 Updated: selinux-policy-targeted.noarch 0:3.13.1-102.el7_3.16 systemd.x86_64 0:219-30.el7_3.9 Dependency Updated: libgudev1.x86_64 0:219-30.el7_3.9 libselinux.x86_64 0:2.5-6.el7 libselinux-python.x86_64 0:2.5-6.el7 libselinux-utils.x86_64 0:2.5-6.el7 libsemanage.x86_64 0:2.5-5.1.el7_3 libsemanage-python.x86_64 0:2.5-5.1.el7_3 libsepol.x86_64 0:2.5-6.el7 policycoreutils.x86_64 0:2.5-11.el7_3 policycoreutils-python.x86_64 0:2.5-11.el7_3 selinux-policy.noarch 0:3.13.1-102.el7_3.16 setools-libs.x86_64 0:3.3.8-1.1.el7 systemd-libs.x86_64 0:219-30.el7_3.9 systemd-python.x86_64 0:219-30.el7_3.9 systemd-sysv.x86_64 0:219-30.el7_3.9 Complete! [root@localhost ~]# 2.启动docker service docker start [root@localhost ~]# service docker start Redirecting to /bin/systemctl start docker.service [root@localhost ~]# ps -ef|grep docker root 29129 1 0 11:25 ? 00:00:00 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --selinux-enabled --log-driver=journald --signature-verification=false root 29146 29129 0 11:25 ? 00:00:00 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime docker-runc --runtime-args --systemd-cgroup=true root 29395 9865 0 11:27 pts/2 00:00:00 grep --color=auto docker [root@localhost ~]# 3.加入开机启动 chkconfig docker on 从docker.io中下载centos镜像到本地 /var/lib/docker/graph [root@localhost ~]# chkconfig docker on Note: Forwarding request to 'systemctl enable docker.service'. Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. [root@localhost ~]# 4.查看已下载的镜像 docker images [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE [root@localhost ~]# 5.启动一个容器 docker run -i -t centos /bin/bash [root@localhost ~]# docker run -i -t centos /bin/bash Unable to find image 'centos:latest' locally Trying to pull repository docker.io/library/centos ... latest: Pulling from docker.io/library/centos d5e46245fe40: Downloading [==> ] 3.244 MB/70.49 MB ^C [root@localhost ~]# 6.查看所有容器 docker ps -a [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@localhost ~]# 7.开启一个容器 docker start container 8.查看容器的root用户密码 docker logs <容器ID或者容器名> 2>&1 | grep '^User:' | tail -n1 9.查看容器日志 docker logs -s <容器ID或者容器名> 10.删除单个容器docker容器 docker rm loving_ride 11.删除所有容器 docker rm $(docker ps -a -q) 12.停止容docker stop 容器 docker start 13.运行一个新容器,同时为它命名、端口映射、文件夹映射。以redmine镜像为例 docker run --name redmine -p 9003:80 -p 9023:22 -d -v /var/redmine/files:/redmine/files -v/var/redmine/mysql:/var/lib/mysql sameersbn/redmine 14. 一个容器连接到另一个容器&sonar容器连接到mmysql容器,并将mmysql容器重命名为db。这样,sonar容器就可以使用db的相关的环境变量了。 run -i -t --name sonar -d -link mmysql:dbtpires/sonar-server 15. 当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像 docker save > /home/aa.tar 16.拷贝文件到另一机器 scp -r /home/aa.tar root@192.168.1.65:/home/aa.tar 17.加载打包好的镜像 docker load < /home/aa.tar 18.构建自己的镜像 docker build -t <镜像名> <镜像文件路径> eg:docker build -t aa /home/aa.tar

优秀的个人博客,低调大师

centos7上elastic search安装填坑记

下载elastic search 5.3.0 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.3.0.tar.gz mv elasticsearch-5.3.0.tar.gz /opt cd /opt tar -xzvf elasticsearch-5.3.0.tar.gz cd elasticsearch-5.3.0/ 启动ES cd /bin ./elasticsearch 按照道理应该就可以了,然而接下来各种坑一一出现,分别阐述 错误1:error='Cannot allocate memory' (errno=12) solutions:由于elasticsearch5.0默认分配jvm空间大小为2g,需要改小一点 vim config/jvm.options -Xms2g → -Xms512m -Xmx2g → -Xmx512m 错误2: can not run elasticsearch as root solutions:在 Linux 环境中,elasticsearch 不允许以 root 权限来运行!所以需要创建一个非root用户,以非root用户来起es groupadd elk # 创建用户组elk useradd elk -g elk -p 111111 # 创建新用户elk,-g elk 设置其用户组为 elk,-p 111 设置其密码6个1 chown -R elk:elk /opt # 更改 /opt 文件夹及内部文件的所属用户及组为 elk:elk su elk # 切换到非root用户elk下来 错误3:(1) max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] (2) max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 此错误出现在修改config/elasticsearch.yml中的network.host为network.host: 0.0.0.0以便让外网任何IP都能来访问时。 solutions:切换到root用户,然后 vim /etc/security/limits.conf * soft nofile 300000 * hard nofile 300000 * soft nproc 102400 * soft memlock unlimited * hard memlock unlimited 错误4:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] solutions:先要切换到root用户;然后可以执行以下命令,设置 vm.max_map_count ,但是重启后又会恢复为原值。 sysctl -w vm.max_map_count=262144 持久性的做法是在 /etc/sysctl.conf 文件中修改 vm.max_map_count 参数: echo "vm.max_map_count=262144" > /etc/sysctl.conf sysctl -p 最后终于在外网访问成功: 安装可视化插件 elasticsearch-head git clone git://github.com/mobz/elasticsearch-head.git cd elasticsearch-head npm install # 此处我试图用cnpm install有问题,用npm可以 npm run start 然后在外网访问http://你的安装机IP:9100 最后实际简单测试一下 新建 Index,可以直接向 Elastic 服务器发出 PUT 请求。下面的例子是新建一个名叫weather的 Index。 然而刷新elasticsearch-head可视化界面可以看到索引已经成功插入 后记 关于作者更多的elastic search实践在此

优秀的个人博客,低调大师

CentOS7 安装nginx1.11设置开机启动

1、安装GCC和GCC-C++ [java]view plain copy [root@iZwz91nfqrmmcjz3ax4vqvZjava]#cd/usr/java [java]view plain copy [root@iZwz91nfqrmmcjz3ax4vqvZjava]#yuminstallgcc [root@iZwz91nfqrmmcjz3ax4vqvZjava]#yuminstall-ygcc-c++ 2. 因为nginx需要依赖pcre库、zlib库、openssl库,所以需要下载这三个库以及nginx源码。 2.1 安装pcre库 [java]view plain copy <spanstyle="font-size:18px;">[root@iZwz91nfqrmmcjz3ax4vqvZjava]#wgetftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz [root@iZwz91nfqrmmcjz3ax4vqvZjava]#tar-zxvfpcre-8.39.tar.gz</span> 2.2 安装zlib库 这是我先下载好的包 zlib-1.2.8.tar.gz 上传 [java]view plain copy <spanstyle="font-size:18px;">[root@iZwz91nfqrmmcjz3ax4vqvZjava]#tar-zxvfzlib-1.2.8.tar.gz [root@iZwz91nfqrmmcjz3ax4vqvZjava]#cdzlib-1.2.8/</span> 2.3 安装openssl库 [java]view plain copy <spanstyle="font-size:18px;">[root@iZwz91nfqrmmcjz3ax4vqvZjava]#wgethttp://www.openssl.org/source/openssl-1.0.1c.tar.gz [root@iZwz91nfqrmmcjz3ax4vqvZjava]#tar-zxvfopenssl-1.0.1c.tar.gz</span> 注:也可以一起安装 yum install gcc gcc-c++ make automake autoconf libtool pcre* zlib openssl openssl-devel 2.4 安装nginx 这是我先下载好的包 nginx-1.11.5.tar.gz 上传 [java]view plain copy <spanstyle="font-size:18px;">[root@iZwz91nfqrmmcjz3ax4vqvZjava]#tar-zxvfnginx-1.11.5.tar.gz</span> 使用命令编译nginx [java]view plain copy <spanstyle="font-size:18px;">[root@iZwz91nfqrmmcjz3ax4vqvZjava]#cdnginx-1.11.5 [root@iZwz91nfqrmmcjz3ax4vqvZnginx-1.11.5]#./configure--prefix=/usr/java/nginx--conf-path=/usr/java/nginx/conf/nginx.conf --pid-path=/usr/java/nginx/nginx.pid--with-http_ssl_module--with-pcre=/usr/java/pcre-8.39--with-zlib=/usr/java/zlib-1.2.8 --with-openssl=/usr/java/openssl-1.0.1c [root@iZwz91nfqrmmcjz3ax4vqvZnginx-1.11.5]#make [root@iZwz91nfqrmmcjz3ax4vqvZnginx-1.11.5]#makeinstall</span> configure命令是用来检测你的安装平台的目标特征的。它定义了系统的各个方面,包括nginx的被允许使用的连接处理的方法,比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本,执行结束时,它会创建一个Makefile文件。 3.启动nginx [java]view plain copy <spanstyle="font-size:18px;">[root@iZwz91nfqrmmcjz3ax4vqvZjava]#/usr/java/nginx/sbin/nginx</span> 停止 [plain]view plain copy [root@iZwz91nfqrmmcjz3ax4vqvZjava]#/usr/java/nginx/sbin/nginx-sstop 重启 [plain]view plain copy [root@iZwz91nfqrmmcjz3ax4vqvZjava]#/usr/java/nginx/sbin/nginx-sreload 4. 设置防火墙 [plain]view plain copy [root@iZwz91nfqrmmcjz3ax4vqvZjava]#firewall-cmd--zone=public--add-port=80/tcp--permanent; [root@iZwz91nfqrmmcjz3ax4vqvZjava]#firewall-cmd--reload; 5.测试 120.77.213.193 出现下面界面说明成功! 6. 设置nginx开机启动 在 /etc/init.d/ 目录下创建nginx文件 其中nginxd ,nginx_config, nginx_pid 的值根据具体目录配置,文件内容如下: [plain]view plain copy <spanstyle="font-size:14px;">#!/bin/bash #nginxStartupscriptfortheNginxHTTPServer #itisv.0.0.2version. #chkconfig:-8515 #description:Nginxisahigh-performancewebandproxyserver. #Ithasalotoffeatures,butit'snotforeveryone. #processname:nginx #pidfile:/var/run/nginx.pid #config:/usr/java/nginx/conf/nginx.conf nginxd=/usr/java/nginx/sbin/nginx nginx_config=/usr/java/nginx/conf/nginx.conf nginx_pid=/usr/java/nginx/logs/nginx.pid RETVAL=0 prog="nginx" #Sourcefunctionlibrary. ./etc/rc.d/init.d/functions #Sourcenetworkingconfiguration. ./etc/sysconfig/network #Checkthatnetworkingisup. [${NETWORKING}="no"]&&exit0 [-x$nginxd]||exit0 #Startnginxdaemonsfunctions. start(){ if[-e$nginx_pid];then echo"nginxalreadyrunning...." exit1 fi echo-n$"Starting$prog:" daemon$nginxd-c${nginx_config} RETVAL=$? echo [$RETVAL=0]&&touch/var/lock/subsys/nginx return$RETVAL } #Stopnginxdaemonsfunctions. stop(){ echo-n$"Stopping$prog:" killproc$nginxd RETVAL=$? echo [$RETVAL=0]&&rm-f/var/lock/subsys/nginx/usr/java/nginx/logs/nginx.pid } #reloadnginxservicefunctions. reload(){ echo-n$"Reloading$prog:" #kill-HUP`cat${nginx_pid}` killproc$nginxd-HUP RETVAL=$? echo } #Seehowwewerecalled. case"$1"in start) start ;; stop) stop ;; reload) reload ;; restart) stop start ;; status) status$prog RETVAL=$? ;; *) echo$"Usage:$prog{start|stop|restart|reload|status|help}" exit1 esac exit$RETVAL</span> 设置文件的访问权限: chmod a+x /etc/init.d/nginx (a+x参数表示 ==> all user can execute 所有用户可执行) chkconfig nginx on 最后将ngix加入到rc.local文件中,这样开机的时候nginx就默认启动了 vim /etc/rc.local 添加 /etc/init.d/nginx start :wq! 重启生效

资源下载

更多资源
Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。